Analisando arquivos de log para IP's frequentes

12

Então, eu hackeei isso juntos enquanto passava por um ataque de DDOS para extrair os safados dos meus logs. Alguém tem alguma melhoria ou outra sugestão para melhorar?

Aqui está a ideia geral:

  1. extrair apenas o ip do arquivo de log
  2. ordena-los
  3. uniq e conte-os
  4. ordene-os novamente

E o string o'pipes:
cut --delim " " -f7 /var/log/apache_access | sort | uniq -c | sort -rn > sorted-ips.txt

    
por gabe. 12.08.2010 / 20:59

3 respostas

7

Eu sempre usei isso:

tail -1000 /var/log/apache_access | awk '{print $1}' | sort -nk1 | uniq -c | sort -nk1

Com tail eu sou capaz de definir o limite de quão longe eu realmente quero ir - bom se você não usar a rotação de log (por qualquer motivo), segundo eu estou fazendo uso de awk - uma vez que a maioria dos logs são delimitados por espaço, deixei-me com a capacidade de extrair informações adicionais (possivelmente quais URLs eles estavam atingindo, status, navegadores, etc.) adicionando a variável $ apropriada. Por fim, uma falha em uniq só funciona em pares - IE:

A
A
A
A
B
A
A

produzirá:

4 A
1 B
2 A

Não é a saída desejada. Então, classificamos a primeira coluna (neste caso, os ips, mas podemos classificar outras colunas) e, em seguida, uniq , finalmente classificamos a contagem ascendente para que possamos ver os maiores infratores.

    
por 13.08.2010 / 01:12
7

Parece que você está reinventando a roda fail2ban .

Dê uma olhada no fail2ban. Provavelmente já faz o que você quer, e se não, é fácil de personalizar.

    
por 12.08.2010 / 21:15
7

Marco Ceppi tem razão sobre o awk ser uma ferramenta melhor para isso, mas o awk também é uma ferramenta melhor que sort e uniq , já que a lógica pode ser movida para awk . Não faz muita diferença se você está apenas seguindo 1000 linhas, mas se você quiser olhar para um arquivo de log gigante multi-gig pode ser ordens de magnitude mais rápido para mover isso para awk .

cat /var/log/apache_access | awk '{freq[$1]++} END {for (x in freq) {print freq[x], x}}' | sort -n fará o que você precisa, mas é muito mais rápido para arquivos grandes. Ele cria uma matriz de IPs no awk, usando o endereço IP como chave e o número de vezes que o IP ocorre como o valor.

A aceleração vem porque o awk faz passar os dados e faz a maior parte do trabalho, exceto para classificar a saída final. Usando o outro método, se você tiver 1.000.000 linhas no log de transferência, awk lê as 1.000.000 linhas cuspindo 1.000.000 IPs, então o tipo vai sobre os 1.000.000 IPs, enviando os 1.000.000 IPs para o uniq, que são reduzidos a um número bem menor quantidade de dados antes de dar isso para classificar. Em vez de canalizar ao redor / fazer vários passes em 1.000.000 de IPs, o awk faz quase tudo em um único passo.

Usando um log apache de 5,513,132 linhas (1,1 GB) no meu laptop, aqui está uma comparação de velocidade:

  • 2m 45s cat ./apache_access | awk '{print $1}' | sort -nk1 | uniq -c | sort -nk1
  • 0m 40s cat ./apache_access | awk '{freq[$1]++} END {for (x in freq) {print freq[x], x}}' | sort -n
por 24.06.2011 / 21:23