2011-06-25 10 views
10

Per rispettare la privacy dei miei utenti sto cercando di rendere anonimi i loro indirizzi IP nei file di registro di nginx.Anonimizza la registrazione IP in nginx?

Un modo per farlo sarebbe quello di definire un formato log personalizzato, in questo modo:

log_format noip '127.0.0.1 - [$time_local] ' 
    '"$request" $status $body_bytes_sent ' 
    '"$http_referer" "$http_user_agent" $request_time'; 

Questo metodo ha due aspetti negativi: non riesco a distinguere tra due utenti e non posso usare geo strumenti di localizzazione.

La cosa migliore sarebbe "accorciare" l'indirizzo IP (87.12.23.55 diventerebbe 87.12.23.1).

Esiste la possibilità di ottenere ciò utilizzando lo script di configurazione nginx?

Grazie.

+0

correlati (apache): http://serverfault.com/q/343031/75968 – cweiske

risposta

13

Anche se esiste già una risposta accettata, la soluzione sembra non essere valida.

nginx ha il log_format direttiva , che ha una contesto http. Ciò significa che il log_format può essere solo (valido) impostato all'interno della sezione http {} del file di configurazione, NON all'interno delle sezioni del server!

D'altra parte abbiamo un se direttiva, che ha una contesto di server e posizione.

Così non possiamo usare “se” e “log_format” all'interno di una sezione del server (che è fatto all'interno della soluzione accettata)

Così il se non è disponibile qui, anche se è il male (http://wiki.nginx.org/IfIsEvil)! Abbiamo bisogno di qualcosa che sta lavorando a contesto http perché solo lì il log_format può essere definito in modo valido, e questo è l'unico luogo al di fuori del contesto del server, in cui sono definiti i nostri host virtuali ...

Per fortuna c'è una funzione mappa all'interno di nginx! mappa sta rimappando alcuni valori in nuovi valori (accessibili all'interno di variabili che possono essere utilizzate in una direttiva log_format). E il buon messaggio: funziona anche con espressioni regolari.

Quindi mappiamo i nostri indirizzi IPv4 e IPv6 in indirizzi anonimi. Questo deve essere fatto in 3 passi, poiché la mappa non può accumulare valori restituiti, può solo restituire stringhe o variabili, non una combinazione di entrambi.

Quindi, per prima cosa prendiamo la parte dell'IP che vogliamo avere nei file di log, la seconda mappa restituisce la parte che simboleggia la parte anonimizzata e la terza regola della mappa li mappa di nuovo insieme.

Ecco le regole che vanno nel contesto http {}:

map $remote_addr $ip_anonym1 { 
default 0.0.0; 
"~(?P<ip>(\d+)\.(\d+)\.(\d+))\.\d+" $ip; 
"~(?P<ip>[^:]+:[^:]+):" $ip; 
} 

map $remote_addr $ip_anonym2 { 
default .0; 
"~(?P<ip>(\d+)\.(\d+)\.(\d+))\.\d+" .0; 
"~(?P<ip>[^:]+:[^:]+):" ::; 
} 

map $ip_anonym1$ip_anonym2 $ip_anonymized { 
default 0.0.0.0; 
"~(?P<ip>.*)" $ip; 
} 

log_format anonymized '$ip_anonymized - $remote_user [$time_local] ' 
    '"$request" $status $body_bytes_sent ' 
    '"$http_referer" "$http_user_agent"'; 

access_log /var/log/nginx/access.log anonymized; 

Dopo aver aggiunto questo al vostro file di configurazione nginx.conf, ricordarsi di ricaricare la nginx. I file di registro dovrebbero ora contenere indirizzi IP anoimizzati, se si utilizza il formato di registro "anonimo" (questo è il parametro di formato della direttiva access_log).

+1

Grazie! Ho cambiato la risposta accettata alla tua. – endzeit

+1

Risposta eccellente – mate64

+0

È possibile rendere anonimo il log degli errori con un log_format personalizzato? O può solo il log di accesso? – tschale

0

Penso che una soluzione buona e praticabile sia quella di rendere anonimo l'IP prima di ruotare i file di log (che dovresti fare quotidianamente). Ci sono molti script per questa attività disponibili per Apache, e poiché il formato del registro è per lo meno molto simile, dovrebbero funzionare senza problemi o essere facilmente regolabili. Certo, si conserva ancora l'IP completo per 24 ore o meno, ma è meglio che averli in giro da anni.

+3

È illegale per memorizzare IP in Germania. – mate64

1

È possibile utilizzare un'istruzione if con espressioni regolari all'interno del blocco del server per rendere anonimi gli IP senza alcun modulo aggiuntivo perl o lua.

all'interno nginx.conf

server { 
    if ($remote_addr ~ (\d+).(\d+).(\d+).(\d+)) { 
     set $ip_anym $1.$2.0.1; 
    } 
    log_format main '[$time_local] $ip_anym "$request" $status $body_bytes_sent $request_time "$http_referer" "$http_user_agent"';  

    access_log /var/log/access.log main; 
    .... 
} 

resi anonimi l'ip e assegnarlo a una nuova variabile denominata $ ip_anym che poi possiamo usare all'interno del formato di registro al posto del $ REMOTE_ADDR originale. Nell'esempio sopra conserviamo la prima e la seconda parte dell'indirizzo IP, puoi anche usare $ 1. $ 2. $ 3.1 se preferisci sostituire solo l'ultima parte dell'ip.

+1

log_format non è consentito nel contesto del server (viene visualizzato anche un avviso per utilizzarlo qui). Una possibile soluzione è usare "map" e "log_format" all'interno del contesto http. Vedere la soluzione all'indirizzo http://www.mbr-is.com/central-anonymized-ip-addresses-for-nginx-for-all-virtual-hosts/ –

3

La risposta accettata sembra un po 'gonfia. L'attuale versione di nginx ti permette di fare in questo modo:

map $remote_addr $remote_addr_anon { 
    ~(?P<ip>\d+\.\d+\.\d+)\. $ip.0; 
    ~(?P<ip>[^:]+:[^:]+):  $ip::; 
    default      0.0.0.0; 
}