Comment bloquer automatiquement et temporairement une adresse IP faisant trop de hits sur le serveur dans un court laps de temps?

21

Un de mes serveurs LAMP a récemment été abattu par une sorte de bot de script à la recherche d'exploits. À première vue, il faisait tellement de demandes par seconde, qu'il surchargeait la mémoire RAM du serveur et faisait tomber mon site entier pendant une heure. Ce «attacK» provenait tous d'une seule adresse IP.

Alors, comment puis-je bloquer automatiquement et temporairement une adresse IP faisant trop de hits sur mon serveur LAMP en peu de temps? Quel est le meilleur outil pour le travail, et dois-je résoudre ce problème au niveau du système d'exploitation ou via PHP?

ProgrammerGirl
la source

Réponses:

25

Fail2Ban . La solution standard / par défaut à ce problème sur la plate-forme Linux.

HopelessN00b
la source
Intéressant, merci. Comment cela traite-t-il ou affecte-t-il les robots d'exploration tels que Google?
ProgrammerGirl
1
@Programmer Dépend de la façon dont vous configurez la chose, mais vous ne vous attendriez pas à ce qu'un robot d'indexation saisisse de mauvais mots de passe, recherche des exploits ou accumule suffisamment de hits pour déclencher un seuil bien défini - il suffit donc de vérifier vos journaux pour comprendre à quoi définir vos seuils.
HopelessN00b
5

Vous devez éviter d'essayer de le faire avec PHP. Au moment où PHP s'implique, il est déjà trop tard - la mémoire a déjà été allouée.

Vous pouvez interdire les adresses IP à n'importe quelle couche, mais le niveau le plus bas qui utilise le moins de ressources est l'itinéraire que vous souhaitez emprunter. Il s'agit généralement du pare-feu. À tout le moins, iptables (pare-feu Linux) est ce que vous souhaitez utiliser. Il existe des outils que d'autres ont mentionnés, tels que Fail2Ban, qui peuvent automatiser cela pour vous. Un pare-feu externe serait préférable.

En plus d'essayer d'interdire les adresses IP offensantes, vous devriez essayer de faire un meilleur usage de vos ressources. Si une demande prend moins de ressources, il faudra plus de temps pour qu'une attaque soit efficace.

Apache utilise également beaucoup de mémoire. Si vous utilisez mod_php, c'est encore pire parce que PHP est chargé à l'intérieur de chaque processus enfant Apache. Cela signifie que même les requêtes de contenu statique (css / js / images) chargent PHP même lorsque PHP n'est pas utilisé. Vous pouvez résoudre ce problème en utilisant FastCGI à la place. mod_fcgid est une bonne option.

Il existe également d'autres serveurs Web plus économes en ressources. Nginx est mon préféré. Il y a aussi Lighttpd. Beaucoup de gens aiment Litespeed (remplacement en remplacement d'Apache).

Si vous souhaitez vous en tenir à Apache, envisagez de le régler du mieux possible. Pensez à désactiver .htaccess. Voici une bonne explication pourquoi .

Luc
la source
2

Pour contrôler ou bloquer le trafic http, vous pouvez utiliser:

Cependant, sachez que ces outils peuvent également bloquer / ralentir les webspiders et donc avoir un impact sur le référencement.

Communauté
la source
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

ossec peut faire ce type de chose automatiquement et de manière transparente en se basant sur les syslogs.

gmck
la source
1
Pouvez-vous expliquer exactement ce que fait la première ligne de code? De plus, comment ossec se compare-t-il à fail2ban? Merci.
ProgrammerGirl
2
C'est une règle iptables. Je crois que cela compte combien de nouvelles tentatives de connexion sont effectuées et les abandonne après avoir dépassé 4 tentatives en 60 secondes. Je vous encourage à regarder man iptableset à voir ce que signifie chaque drapeau et comment ils fonctionnent ensemble.
Luke
-3

NoooBS,

--- inonder ---

iptables -N logdrop iptables -A logdrop -m recent --set --name blacklist

iptables -A logdrop -m limit --limit 1 / s --limit-burst 1 -j LOG --log-prefix "Flood:"

iptables -A logdrop -j DROP

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

Igors Gorda
la source