Como bloquear automaticamente e temporariamente um endereço IP, fazendo muitas ocorrências no servidor em um curto espaço de tempo?

21

Um dos meus servidores LAMP foi derrubado recentemente por algum tipo de bot de script que procura explorações. Pelo que parecia, fazia tantos pedidos por segundo que sobrecarregava a RAM do servidor e derrubava todo o site por uma hora. Esse "ataque" veio de um único endereço IP.

Então, como posso bloquear automática e temporariamente um endereço IP, causando muitos acessos no meu servidor LAMP em um curto período de tempo? Qual é a melhor ferramenta para o trabalho e devo resolver isso no nível do sistema operacional ou via PHP?

ProgrammerGirl
fonte

Respostas:

25

Fail2Ban . A solução padrão / padrão-ouro para esse problema na plataforma Linux.

HopelessN00b
fonte
Interessante, obrigado. Como isso lida ou afeta os rastreadores da Web, como o Google?
ProgrammerGirl
1
@Programmer Depende de como você configura a coisa, mas você não espera que um rastreador da Web insira senhas ruins, procure explorações ou acumule hits suficientes para disparar um limite bem definido - basta verificar seus logs para descobrir em que definir seus limites.
precisa
5

Você deve evitar tentar fazer isso com PHP. Quando o PHP se envolve, já é tarde demais - a memória já foi alocada.

Você pode banir endereços IP em qualquer camada, mas o nível mais baixo que utiliza a menor quantidade de recursos é o caminho que você deseja seguir. Este é geralmente o firewall. No mínimo, iptables (firewall linux) é o que você deseja usar. Existem ferramentas mencionadas por outros, como Fail2Ban, que podem automatizar isso para você. Firewall externo seria melhor.

Além de tentar proibir endereços IP ofensivos, tente usar melhor seus recursos. Se uma solicitação consumir menos recursos, levará mais tempo para que um ataque seja eficaz.

O Apache também usa muita memória. Se você estiver usando o mod_php, é ainda pior porque o PHP é carregado dentro de cada processo filho do Apache. Isso significa que mesmo solicitações de conteúdo estático (css / js / images) estão carregando o PHP, mesmo quando o PHP não está sendo usado. Você pode resolver esse problema usando o FastCGI. mod_fcgid é uma boa opção.

Existem também outros servidores Web que são mais eficientes em termos de recursos. Nginx é o meu favorito. Há também o Lighttpd. Muita gente como Litespeed (substitui o Apache).

Se você quiser ficar com o Apache, considere ajustá-lo da melhor maneira possível. Considere desativar o .htaccess. Aqui está uma boa explicação do porquê .

Luke
fonte
2

Para controlar ou bloquear o tráfego http, você pode usar:

No entanto, esteja ciente de que essa ferramenta também pode bloquear / atrasar os webspiders e, portanto, afetar o SEO.

Comunidade
fonte
2
iptables -I INPUT -p tcp --dport 80 -i eth0 -m state --state NEW -m recent --set
iptables -I INPUT -p tcp --dport 80 -i eth0 -m state --state NEW -m recent --update --seconds 60 --hitcount 4 -j DROP

o ossec pode fazer esse tipo de coisa de forma automática e transparente com base nos syslogs.

gmck
fonte
1
Você pode explicar exatamente o que a primeira linha de código faz? Além disso, como o ossec se compara ao fail2ban? Obrigado.
ProgrammerGirl
2
É uma regra do iptables. Acredito que conta quantas novas tentativas de conexão são feitas e as elimina após excederem 4 tentativas em 60 segundos. Convido você a olhar man iptablese ver o que cada bandeira significa e como elas funcionam juntas.
Lucas
-3

NoooBS,

--- inundar ---

iptables -N logdrop iptables -A logdrop -m recente --set --name lista negra

iptables -U logdrop -m limit --limit 1 / s --limit-burst 1 -j LOG --log-prefixo "Flood:"

iptables -A logdrop -j DROP

iptables -N ddos ​​iptables -A ddos ​​-m recente --rcheck --name blacklist --seconds 300 --hitcount 1 -j logdrop iptables -A ddos ​​-m recent --set --name - novamente iptables -A ddos ​​-m recent --update --name again --seconds 60 --hitcount 2 -j logdrop iptables -A ddos ​​-j RETURN

Igors Gorda
fonte