2013-10-09 14 views
8

Richiedo log di accesso abilitati, ma per motivi di conformità, non è possibile registrare i dati di un parametro di richiesta GET sensibile nei registri di accesso. Mentre so, potrei analizzare i registri (after-the-fact) e sanitarli, questa non è una soluzione accettabile - perché per motivi di conformità i registri non possono essere manomessi.Come non registrare un parametro di richiesta get nei log di accesso di nginx?

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

Come posso evitare che il valore "sensitive_data" parametro di essere scritti nei log? Ecco alcune idee:

  • Invia richiesta POST - non è un'opzione con JSONP.
  • Utilizzare una nuova regola di posizione per "risorsa" e impostare un registro di accesso per utilizzare un log_format che utilizza un formato diverso (ad esempio non utilizza $ remote_addr). Vedere questo per riferimento: http://nginx.org/en/docs/http/ngx_http_log_module.html
  • Registra un $ sanitized_remote_addr e impostalo (in qualche modo analizza $ remote_addr o qualcos'altro?) Prima che arrivi al log. Non siamo sicuri se questo è facile da realizzare.

Come dovrebbe essere fatto?

+1

Si potrebbe anche prendere in considerazione [mod_security per nginx] (http://www.modsecurity.org/projects/modsecurity/nginx/) e avere uno sguardo al [progetto naxsi] (https://github.com/nbs-system/naxsi) –

risposta

1

La soluzione che ho trovato finora è here. In breve:

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; 
} 

Forse questo usato per lavorare a un certo punto, ora si dice:

nginx: [emerg] unknown "temp" variable 

o

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

Forse se si tratta solo di uno/due file di registro è possibile utilizzare le pipe e disinfettare l'output con un filtro in ascolto su questi. Il filtro può quindi scrivere i file di registro reali. –

+3

No, hai ragione, se hai la variabile impostata da qualche parte, nginx non dovrebbe lamentarsi di una variabile sconosciuta. Ho adattato la tua risposta in una soluzione di lavoro, descritta qui: https://github.com/sunlightlabs/congress/tree/master/config/nginx#suppressing-user-latitudelongitude-in-our-logs – Konklone

4

risposta precedente non funzionerà dal modulo log_format può essere utilizzato solo alla configurazione del livello http.

Per risolvere questo problema, è possibile rimuovere la configurazione log_format dalla direttiva location e mantenerla come nella configurazione del livello 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 direttiva può avere variabili definite più avanti nel nostro blocco location direttiva.

Così finale di configurazione sarà simile:

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; 
     } 
    } 
} 
Problemi correlati