2013-10-09 14 views
8

Wymagam dzienników dostępu włączonych, ale ze względów braku zgodności nie można rejestrować poufnych danych parametru żądania GET w dziennikach dostępu. Chociaż wiem, mogłem analizować logi (po fakcie) i oczyszczać je, to nie jest dopuszczalne rozwiązanie - ponieważ z powodów zgodności nie można manipulować dziennikami.Jak nie rejestrować parametru żądania pobierania w dziennikach dostępu do nginx?

http://www.example.com/resource?param1=123&sensitive_param=sensitive_data

Jak mogę zapobiec „sensitive_data” wartość parametru mają być zapisywane w logach? Oto kilka pomysłów:

  • Wysłanie w zapytaniu POST - nie jest opcją z JSONP.
  • Użyj nowej reguły lokalizacji dla "zasób" i ustaw dziennik dostępu, aby użyć formatu log_logat używa innego formatu (tzn. Nie używa $ remote_addr). Zobacz to w celach informacyjnych: http://nginx.org/en/docs/http/ngx_http_log_module.html
  • Zaloguj się $ sanitized_remote_addr i ustaw go (w jakiś sposób spróbuj $ remote_addr lub coś innego?), Zanim przejdzie do logu. Nie jesteśmy pewni, czy jest to łatwe do wykonania.

Jak należy to zrobić?

+1

Można też rozważyć [mod_security dla nginx] (http://www.modsecurity.org/projects/modsecurity/nginx/) i mają wygląd w [projekt naxsi] (https://github.com/nbs-system/naxsi) –

Odpowiedz

1

Rozwiązanie, które do tej pory znalazłem, to here. W skrócie:

location /any_sensitive... { 
    # Strip password in access.log 
    set $temp $request; 
    if ($temp ~ (.*)password=[^&]*(.*)) { 
     set $temp $1password=****$2; 
    } 

    log_format filter '$remote_addr - $remote_user [$time_local] ' 
     '"$temp" $status $body_bytes_sent "$http_referer" "$http_user_agent"'; 

    access_log logs/access.log filter; 
} 

Może to używane do pracy w pewnym momencie, a teraz mówi:

nginx: [emerg] unknown "temp" variable 

lub

nginx: [warn] the "log_format" directive may be used only on "http" level in ... 
+0

Może, jeśli jest to tylko jeden/dwa pliki dziennika, możesz użyć rur i odkażać dane wyjściowe filtrem nasłuchującym. Filtr może następnie zapisać prawdziwe pliki dziennika. –

+3

Nie, masz rację, tak długo jak masz gdzieś ustawioną zmienną, nginx nie powinien narzekać na nieznaną zmienną. Dostosowałem twoją odpowiedź do działającego rozwiązania, opisanego tutaj: https://github.com/sunlightlabs/congress/tree/master/config/nginx#suppressing-user-latitudelongitude-in-our-logs – Konklone

4

Poprzednia odpowiedź nie będzie działać, ponieważ moduł log_format można stosować tylko na poziomie konfiguracji http.

Aby to naprawić, możemy usunąć konfigurację log_format z dyrektywy location i zachować ją tak, jak w konfiguracji na poziomie http.

http { 

    log_format filter '$remote_addr - $remote_user [$time_local] ' 
     '"$temp" $status $body_bytes_sent "$http_referer" "$http_user_agent"'; 

    # Other Configs 
} 

log_format dyrektywa może mieć zmienne zdefiniowane później w naszym dyrektywy location bloku.

config więc końcowy będzie wyglądać następująco:

http { 

    log_format filter '$remote_addr - $remote_user [$time_local] ' 
     '"$temp" $status $body_bytes_sent "$http_referer" "$http_user_agent"'; 

    # Other Configs 

    server { 
     #Server Configs 
     location/{ 
      set $temp $request; 
      if ($temp ~ (.*)password=[^&]*(.*)) { 
       set $temp $1password=****$2; 
      } 

      access_log /opt/current/log/nginx_access.log filter; 
     } 
    } 
} 
Powiązane problemy