Analisando arquivos de log para IPs frequentes

Analisando arquivos de log para IPs frequentes

Então, eu hackeei isso juntos enquanto sofria um ataque DDOS para extrairdanadinhoips dos meus logs. Alguém tem alguma melhoria ou outra sugestão para melhorar?

Aqui está a ideia geral:

  1. extraia ip apenas do arquivo de log
  2. classifique-os
  3. uniq e conte-os
  4. classifique-os novamente

E a corda de flautas:
cut --delim " " -f7 /var/log/apache_access | sort | uniq -c | sort -rn > sorted-ips.txt

Responder1

Eu sempre usei isso:

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

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

A
A
A
A
B
A
A

Vai produzir:

4 A
1 B
2 A

Não é a saída desejada. Então classificamos a primeira coluna (neste caso os ips, mas poderíamos classificar outras colunas), depois uniqelas, finalmente classificamos a contagem crescente para que eu possa ver os maiores infratores.

Responder2

Parece que você está reinventando ofail2banroda.

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

Responder3

Marco Ceppi está certo sobre awkser uma ferramenta melhor para isso, mas o awk também é uma ferramenta melhor do que sorte uniqjá que essa lógica pode ser movida para awk. Não faz muita diferença se você está apenas seguindo 1000 linhas, mas se você quiser ver um enorme arquivo de log de vários gigs, pode ser muito mais rápido movê-lo para awk.

cat /var/log/apache_access | awk '{freq[$1]++} END {for (x in freq) {print freq[x], x}}' | sort -nfará 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 os IPs ocorrem como valor.

A aceleração ocorre porque o awk passa pelos dados e faz a maior parte do trabalho, exceto classificar a saída final. Usando o outro método, se você tiver 1.000.000 de linhas no log de transferência, o awk lê essas 1.000.000 de linhas, cuspindo 1.000.000 de IPs e, em seguida, a classificação percorre todos os 1.000.000 de IPs, enviando os 1.000.000 de IPs agora classificados para o uniq, o que o reduz a um valor muito menor. quantidade de dados antes de fornecê-los para classificação. Em vez de fazer várias passagens em 1.000.000 de IPs, o awk faz quase tudo em uma única passagem.

Usando um log Apache de 5.513.132 linhas (1,1 GB) no meu laptop, aqui está uma comparação de velocidade:

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

informação relacionada