Como posso remover endereços IP de arquivos de log depois de algum tempo

6

Eu tenho um servidor web apache / nginx / whatever que registra os endereços IP do cliente nos logs de acesso. Agora esses arquivos de log são rotacionados via logrotate .

Eu quero manter os endereços IP por alguns dias, depois de 7 dias, eu quero remover os IPs dos arquivos de log por motivos de privacidade (principalmente ditados pela lei alemã).

Usar mod_removeip ou algo assim não funciona porque preciso filtrar algumas solicitações com base em seus endereços IP.

Existe alguma maneira "padrão" de fazer isso? Talvez até com logrotate ?

EDITAR

Acabei de encontrar este script , mas isso depende da capacidade de canalizar todos os registros roteiro em tempo real. Não tenho muita certeza sobre a implicação de desempenho dessa abordagem.

Além disso, isso só funciona para os logs do servidor 'front-end', não para os logs do servidor de aplicativos.

    
por Michael Siebert 09.02.2012 / 15:04

3 respostas

1

PCRE! (Expressão Regular Perl-Compatible)

s/\b(1?[0-9]{1,2}|2[0-4][0-9]|25[0-5])\.(1?[0-9]{1,2}|2[0-4][0-9]|25[0-5])\.(1?[0-9]{1,2}|2[0-4][0-9]|25[0-5])\.(1?[0-9]{1,2}|2[0-4][0-9]|25[0-5])\b/REMOVED IP/g

Use isso como um filtro em um script perl ou em qualquer outro idioma adequado (alguns usam o PCRE ou alguma outra linguagem regex próxima o suficiente que funcione) para reescrever seus arquivos de log em 7 dias.

$ cat > file_with_ip
some text from 192.168.1.1
^D
$ perl -p -i -e 's/\b(1?[0-9]{1,2}|2[0-4][0-9]|25[0-5])\.(1?[0-9]{1,2}|2[0-4][0-9]|25[0-5])\.(1?[0-9]{1,2}|2[0-4][0-9]|25[0-5])\.(1?[0-9]{1,2}|2[0-4][0-9]|25[0-5])\b/REMOVED IP/g' file_with_ip
$ cat file_with_ip
some text from REMOVED IP
    
por 09.02.2012 / 15:32
0

Eu não acho que o logrotate fará isso; talvez seja necessário criar um script que descompacte os arquivos, processe-os por awk ou sed para retirar o IP e recompacte-os. Não é possível fazer isso em arquivos de log "ativos".

    
por 09.02.2012 / 15:14
0

Em Ubuntu > 12.04 / apache 2.4 , com a configuração padrão, você pode usar algo assim:

for file in 'find /var/log/apache2 -type f -name ".*gz"  ! -name "*.ano.*" -mtime +7'
do
    datestamp='date +"%Y%m%d%H%M%s"'
    # echo Process $file
    zcat $file |sed -E "s/([0-9]{1,3}\.[0-9]{1,3})\.[0-9]{1,3}\.[0-9]{1,3}/.0.0/"|gzip > ${file%.*}.ano.${datestamp}.gz 
    # rm -f $file # Only call this if you are sure that the command before succeeds, otherwise you will lose data.
done

Isso cria uma cópia de todos os arquivos *.gz com mais de 7 dias e substitui os dois últimos bytes de todos os IPs 0.0 na versão copiada com o sufixo ano adicionado.

Se você não usar compactação ou compactação diferente, como bz2 , precisará alterar os comandos de acordo, por exemplo, zcat - > bzcat .

Finalmente, você pode chamar essa rotina via cron uma vez por dia / semana.

    
por 25.05.2018 / 11:32