Analisando arquivos de log para IPs frequentes


12

Então, eu o cortei juntos durante um ataque de DDOS para extrair ips impertinentes dos meus logs. Alguém tem alguma melhoria ou outras sugestões para torná-lo melhor?

Aqui está a ideia geral:

  1. puxar ip's apenas fora do arquivo de log
  2. classificá-los
  3. uniq e conte-os
  4. classificá-los novamente

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


Não tenho certeza se isso seria melhor perguntado nos webmasters ... mas como tudo está usando utilitários unix e a linha de comando ... imaginei que aqui seria mais apropriado.
Gabe.

Parece bom aqui. É baseado em UNIX, e não é específico para o material web (Isto poderia aplicar-se a muitas coisas diferentes no Apache ou firewall logs de IPs)
Stefan Lasiewski

Respostas:


7

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 ir - bom se você não usa rotação de log (por qualquer motivo), segundo eu estou fazendo uso awk- já que a maioria dos logs é delimitada 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 fim, 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) e depois uniqelas, finalmente, classificamos a contagem crescente para que eu possa ver os maiores infratores.


Sim, também percebi o problema com o uniq, portanto, meu primeiro tipo de organização de todos os IPS para que as duplicatas fiquem próximas umas das outras. A ponta da cauda é boa, já que analisar todo o registro em torno de 4 GB pode levar algum tempo. Coisas boas, obrigado.
Gabe.

-k1é redundante, (1) existe apenas uma tecla (2) sortcomeça a usar a primeira palavra como chave de qualquer maneira.
Lekensteyn 5/05

7

Parece que você está no meio de reinventar a roda fail2ban .

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


1
Esse é um projeto muito interessante do qual eu não estava ciente, obrigado. Ao mesmo tempo, não quero instalar nada no servidor de log que não precise, e é fácil o suficiente para fazer o que já estou fazendo. Só estou procurando sugestões de melhorias. Obrigado!
Gabe.

Isso parece muito legal e a GPL também.
Eli Frey

7

Marco Ceppi está certo em awkser uma ferramenta melhor para isso, mas o awk também é uma ferramenta melhor do que sorte uniquma vez 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 olhar para um enorme arquivo de log de vários gig, pode ser uma ordem de magnitude mais rápida para mudar isso 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 velocidade ocorre porque o awk repassa 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 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 os 1.000.000 de IPs inteiros, enviando os 1.000.000 de IP agora classificados para o uniq, reduzindo-o para um tamanho muito menor quantidade de dados antes de fornecer a classificação. Em vez de usar várias passagens em 1.000.000 IPs, o awk faz quase tudo de uma só vez.

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

Muito legal. Estou adicionando isso ao meu saco de truques.
Gabe.
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.