Equivalente a denyhosts, mas para solicitações HTTP?

6

Meu servidor da web (apache2) é continuamente atacado por bots mal-intencionados, solicitando URLs como estes:

   /blog/tag/pnphpbb2//index.php?name=PNphpBB2&file=posting&mode=quote/index.php?name=PNphpBB2&file=viewtopic&p=34004/viewtopic.php?p=15&sid=be4c914eb746ac7c96beea717fdfc692/&highlight=../../../../../../../../../../../../../etc/passwd%00 HTTP Response 301

   //index.php?name=PNphpBB2&file=posting&mode=quote/index.php?name=PNphpBB2&file=viewtopic&p=34004/viewtopic.php?p=15&sid=be4c914eb746ac7c96beea717fdfc692/&highlight=../../../../../../../../../../../../../etc/passwd%00 HTTP Response 200

   /wiki/index.php/Main:Some_Wiki_Pagename//index.php?name=PNphpBB2&file=posting&mode=quote/index.php?name=PNphpBB2&file=viewtopic&p=34004/viewtopic.php?p=15&sid=be4c914eb746ac7c96beea717fdfc692/&highlight=../../../../../../../../../../../../../etc/passwd%00 HTTP Response 200

   /wiki/index.php//index.php?name=PNphpBB2&file=posting&mode=quote/index.php?name=PNphpBB2&file=viewtopic&p=34004/viewtopic.php?p=15&sid=be4c914eb746ac7c96beea717fdfc692/&highlight=../../../../../../../../../../../../../etc/passwd%00 HTTP Response 200

   /blog/2009/01/title-of-post-here//index.php?name=PNphpBB2&file=posting&mode=quote/index.php?name=PNphpBB2&file=viewtopic&p=34004/viewtopic.php?p=15&sid=be4c914eb746ac7c96beea717fdfc692/&highlight=../../../../../../../../../../../../../etc/passwd%00 HTTP Response 301

Gostaria que um processo diário do cron localizasse qualquer host que solicitasse um URL "malicioso" e os adicionasse a um equivalente HTTP para hosts.deny.

Eu imaginaria que haveria um conjunto de regexps definindo URLs maliciosas, bem como possivelmente algum plugin do apache para fazer facilmente o host negar (sem ter que fazer um httpd reiniciar todas as noites).

Existe algo assim?

    
por slacy 05.06.2009 / 19:14

7 respostas

7
O

link pode fazer o que você quiser.

    
por 05.06.2009 / 19:35
7

fail2ban verifica arquivos de log como / var / log / apache / error_log e proíbe o IP que os automatiza varreduras baseadas em expressões regulares (chamadas filtros). Por padrão, ele atualiza o firewall (iptables) para bloquear o IP incorreto. É muito fácil escrever novas ações e implementar um para atualizar um .htaccess deve ser bastante simples, existem vários exemplos disponíveis na distribuição fail2ban.

    
por 05.06.2009 / 21:10
1

Eu irei o segundo fail2ban . Ele funciona ao vivo, pode banir temporariamente e pode adicionar endereços IP ao seu firewall, então o Apache não precisa perder tempo com isso.

Ainda mais eficiente quando acoplado ao módulo ipset netfilter para o iptables (que é mais rápido para lidar com grandes quantidades de endereços), e pode bani-los instantaneamente para que eles façam apenas um ou dois pedidos antes de serem bloqueados.

Se você realmente odeia essas pessoas e está executando o Linux, você também pode tentar implementar tarpitting para o iptables (uma pesquisa rápida não encontrou nenhum patch compatível com o 2.6). Isso aceitará a conexão e, em seguida, definirá imediatamente o tamanho da janela como 0 (evitando que os dados sejam transferidos), mas também impedirá que a extremidade remota feche a conexão, ou seja, qualquer aplicativo que esteja se conectando terá que esperar entre três e vinte ( !!) minutos antes da conexão expirar em seu final.

Isso é ótimo para parar os scanners de portas também, porque os faz receber ordens de magnitude mais longas do que normalmente.

    
por 06.06.2009 / 00:08
0

Se for o Apache 2.0, você pode tentar o mod_access: link

No Apache 2.2, é o mod_authz_host: link

Parece claro que você terá que sinalizar ao Apache para recarregar sua configuração para fazer alterações na configuração do módulo, no entanto.

Editar: O Modsecurity se parece com o que você quer, ao contrário de construir configurações de negação estática, usando os arquivos de log e usando uma das opções acima. Eu vou avaliar a resposta agora.

    
por 05.06.2009 / 19:24
0

Outra possibilidade é usar o mod_rewite para combinar com o URL e enviar ao cliente um 403 (ou o código que você quiser). Exemplo:

RewriteEngine on
RewriteRule ^/.*passwd.*/ - [L,NC,G]

Ou para diversão:

RewriteEngine on
RewriteRule ^/(.*passwd.*)/ http://127.0.0.1/$1 [L,NC,R=301]
    
por 05.06.2009 / 21:51
0

Eu certamente olharia para o OSSEC. Ele detecta esses padrões e pode bloquear os endereços IP. Ele também procura verificações (vários 404s, por exemplo) e bloqueia o IP do ofensor.

E sim, isso é feito por padrão.

Link: link

    
por 12.06.2009 / 15:15
-1

Um exemplo seria:

<Location />
   Order Deny,Allow
   Deny from 123.123.123.123 231.213.123.0/24
   Allow from all
</location>

Eu recomendo ter isso em um arquivo separado que você inclua na sua configuração principal e apenas reescreva esse pequeno fragmento. Você pode fazer um recarregamento para pegar a alteração, o que não interrompe seu servidor como um reinício faria.

    
por 05.06.2009 / 19:29