DDOS no blog ontem

Ontem, após presentar minha pequenina com seu presentinho de 3 aninhos, notei uma grande lentidão no blog. Aliás, lentidão esta que estava causando uma boa fila de processos do php cgi, e assim, levando a morte de alguns processos via o procwatch da Dreamhost.

Resumo, boa parte do pessoal que estava visitando o blog não estava conseguindo visualizar bulhufas. Bom, aí comecei o famoso troubleshoot para ver onde estava o problema.

 

SOCORRO

 

Desabilitei dois módulos que sempre me causam problema: o Flickr e o Last.Fm , mas nenhum dos dois era o criminoso.

Corri no DreamhostStatus e não havia nenhum problema sendo relatado pelo pessoal da hospedagem ( e, sim, o blog deles é bem realista e sempre que há um problema os caras tem o cuidado de avisar seus usuários dos problemas ).

Pronto, imaginei na hora que eu teria uma madrugada inteira ralando para achar algum problema ou bug no Drupal. Mas, de repente, a famosa luz: caramba, seu nerd dos infernos, porque você não olha no log de acesso do seu blog ? 

Fui lá no log de acesso e pronto, achei os criminosos. Na realidade, os criminosos eram uma série de ips que estavam gerando um número excessivo de requisições de trackback ao blog. Assim,  como eram muitas requisições, literalmente, eu tinha uma fila de processos esperando tempo de processador. Com a lentidão, os processos da fila eram mortos por causa do tempo excessivo de uso de CPU.

De cara, a primeira ação que tomei, foi  criar um pequeno script para gerar a negação de acesso aos ips que estavam me causando problemas. A primeira versão da criança foi esta aqui : 

for i in $(grep trackback  ~/logs/ataliba.eti.br/http/access.log | awk -F" " '{print $1}' | sort | uniq ); do
echo "deny from $i/32" > ~/deny.txt

done

Resumo,  com isto aqui eu tinha um arquivo com diversas negações de conexão para os caras que estavam me gerando problema. Ao jogar isto no htaccess do domínio, o problema foi resolvido, mas ao mesmo tempo gerava um falso positivo pois pegava qualquer tipo de requisição que tivesse trackback no meio.  

Lembrei-me de um comando que eu usava quando trabalhava em provedores de hospedagem, que era para pegar excesso de requisições tcp/udp em um servidor : 

netstat -anp |grep 'tcp\|udp' | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -n

Este comando gera um pequeno relatório com as malas que estão gerando muita requisição no seu servidor e pronto, você consegue ver se pode ou não matar o infeliz. 

Assim, eu pensei com cuidado e finalmente, criei um script utilizando esta idéia, para me proteger os spammers de trackback. 

Levei em consideração o seguinte: em geral, você recebe no máximo 5 trackbacks dia do mesmo ip ( para ser sincero, se quiser ser radical, coloca logo 2 hehehehehe ). 

Assim, o script acabou ficando deste jeito aqui : 

grep trackback  ~/logs/ataliba.eti.br/http/access.log | awk -F" " '{print $1}' | sort | uniq -c | sort -n  > ~/deny.txt

while read linha; do
COUNT=$(echo $linha | awk -F" " '{print $1}')
IP=$(echo $linha | awk -F" " '{print $2}')

if [ $COUNT -gt 5 ]; then
echo "deny from $IP/32" >> ~/denyprocessado.txt
fi
done < ~/deny.txt

Pronto, com isto você tem o problema resolvido ao jogar esta listagem gerada no htaccess. Se quiser aumentar ou diminuir o radicalismoé só ir ao if e aumentar de 5 para outro número, ou até diminuir.

Com isto, você mata as malas sem alça que ficam lhe gerando problemas. Não é a melhor solução do planeta não, mas pelo menos, no momento, resolveu para o meu blog e a coisa está rodando super bem. 

Lembrando que esta solução foi criada para o Drupal e para os logs da Dreamhost. Se for usar para outro servidor de acesso e outro CMS, revise o script pois ele pode não lhe atender plenamente. 

Fico feliz pelo menos em agora ver isto aqui nos logs de erro : 

[Tue Aug 11 05:15:17 2009] [error] [client 206.51.226.198] client denied by server configuration: /home/ataliba/ataliba.eti.br/trackback
[Tue Aug 11 05:15:17 2009] [error] [client 206.51.226.198] client denied by server configuration: /home/ataliba/ataliba.eti.br/forbidden.html
[Tue Aug 11 05:17:11 2009] [error] [client 72.167.131.45] client denied by server configuration: /home/ataliba/ataliba.eti.br/trackback
[Tue Aug 11 05:17:11 2009] [error] [client 72.167.131.45] client denied by server configuration: /home/ataliba/ataliba.eti.br/forbidden.html
[Tue Aug 11 05:26:53 2009] [error] [client 74.86.238.186] client denied by server configuration: /home/ataliba/ataliba.eti.br/trackback
[Tue Aug 11 05:26:53 2009] [error] [client 74.86.238.186] client denied by server configuration: /home/ataliba/ataliba.eti.br/forbidden.html

Sim, dá um prazer enorme saber que estas malas estão tentando me tirar do ar e não conseguem. 

Depois que inventaram este tal de Shell Script os problemas sempre podem ser resolvidos com somente um pouco de criatividade. 

Para quem quiser acompanhar as malas sem alça, é só abrir este arquivo aqui