sexta-feira, 24 de maio de 2013

Garimpando logs do Apache

Devido a um surto de acessos, resolvi descobrir quem estava vasculhando meus sistemas.

Cada linha do log do Apache tem essa aparência:
  66.249.75.122 - - [24/May/2013:00:01:17 -0300] "GET /a.html HTTP/1.1" 403 213
Meu objetivo era obter uma lista de IPs organizados por números de acessos. Após lutar com os parâmetros de xargs e grep, descobri que algumas opções do sort e do uniq resolvem o problema.

A solução final foi esta:
  cat access_log | cut -d - -f 1 | sort | uniq -c | sort -nr
Os detalhes são estes:
  1. cat imprime o arquivo;
  2. cut -d - -f 1 corta cada linha em campos separados por "-" e extrai o primeiro deles;
  3. sort ordena as linhas
  4. uniq -c elimina as linhas repetidas e adiciona o número de linhas
  5. sort -nr ordena as linhas numericamente (usando o primeiro número em cada uma) em ordem decrescente.
As primeiras 3 linhas foram estas:
  3149 66.249.75.122
  3108 66.249.75.22
  2747 66.249.75.143
Para descobrir a quem pertencem esses IPs, posso usar o nslookup adicionando o seguinte:
  | sed -n '1,3p' | cut -d ' ' -f 5 | nslookup
As adições foram estas:
  1. sed -n '1,3p' imprime as 3 primeiras linhas (os 3 IPs com mais ocorrências no log);
  2. cut -d ' ' -f 5 recorta o IP (porque eles estão acompanhados do número de ocorrências);
  3. nslookup procura os nomes associados aos IPs.
E, como resultado, descobri que o maior usuário tem sido o Google. Talvez haja uma maneira mais simples, mas duvido que seja tão divertida.

Um comentário:

Anônimo disse...

two words: new relic

(ok, nao e' a mesma coisa, mas vai te alertar se de uma hora pra outra teu server comecar a se comportar "funny", por excesso de carga ou outros motivos)