Wie kann ich eine IP-Adresse, die in kurzer Zeit zu viele Treffer auf dem Server macht, automatisch und vorübergehend blockieren?

21

Einer meiner LAMP-Server wurde kürzlich von einem Skript-Bot heruntergefahren, der nach Exploits suchte. So wie es aussah, wurden so viele Anfragen pro Sekunde gestellt, dass der RAM auf dem Server überlastet und meine gesamte Site für eine Stunde heruntergefahren wurde. Das "Attack" kam alles von einer einzigen IP-Adresse.

Wie kann ich also eine IP-Adresse, die in kurzer Zeit zu viele Treffer auf meinem LAMP-Server macht, automatisch und vorübergehend blockieren? Was ist das beste Tool für den Job, und sollte ich dies auf Betriebssystemebene oder über PHP lösen?

ProgrammerGirl
quelle

Antworten:

25

Fail2Ban . Die Goldstandard- / Standardlösung für dieses Problem auf der Linux-Plattform.

HopelessN00b
quelle
Interessant, danke. Wie wirkt sich dies auf Webcrawler wie Google aus?
ProgrammerGirl
1
@Programmer Kommt darauf an, wie Sie das Ding konfigurieren, aber Sie würden nicht erwarten, dass ein Webcrawler falsche Passwörter eingibt, nach Exploits sucht oder genügend Treffer sammelt, um einen genau definierten Schwellenwert auszulösen - überprüfen Sie einfach Ihre Protokolle, um dies herauszufinden Was definieren Sie Ihre Schwellenwerte an.
HopelessN00b
5

Versuchen Sie dies nicht mit PHP. Zum Zeitpunkt, an dem PHP beteiligt ist, ist es bereits zu spät - der Speicher wurde bereits zugewiesen.

Sie können IP-Adressen auf jeder Ebene sperren, aber die niedrigste Ebene, die am wenigsten Ressourcen verbraucht, ist die Route, die Sie einschlagen möchten. Dies ist normalerweise die Firewall. Zumindest möchten Sie iptables (Linux-Firewall) verwenden. Es gibt Tools wie Fail2Ban, die dies für Sie automatisieren können. Externe Firewall wäre besser.

Neben dem Versuch, beleidigende IP-Adressen zu sperren, sollten Sie versuchen, Ihre Ressourcen besser zu nutzen. Wenn eine Anfrage weniger Ressourcen beansprucht, dauert es länger, bis ein Angriff effektiv ist.

Apache verwendet auch viel Speicher. Wenn Sie mod_php verwenden, ist es noch schlimmer, da PHP in jedem untergeordneten Apache-Prozess geladen wird. Dies bedeutet, dass auch Anforderungen an statischen Inhalt (CSS / JS / Images) PHP laden, auch wenn PHP nicht verwendet wird. Sie können dieses Problem lösen, indem Sie stattdessen FastCGI verwenden. mod_fcgid ist eine gute Option.

Es gibt auch andere Webserver, die ressourceneffizienter sind. Nginx ist mein Favorit. Es gibt auch Lighttpd. Viele Leute mögen Litespeed (Ersatz für Apache).

Wenn Sie bei Apache bleiben möchten, sollten Sie ihn so gut wie möglich optimieren. Deaktivieren Sie .htaccess. Hier ist eine gute Erklärung, warum .

Luke
quelle
2

Um den HTTP-Verkehr zu steuern oder zu blockieren, können Sie Folgendes verwenden:

Beachten Sie jedoch, dass diese Tools möglicherweise auch Webspider blockieren / verlangsamen und sich daher auf die SEO auswirken können.

Gemeinschaft
quelle
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 kann dies automatisch und transparent basierend auf den Syslogs tun.

gmck
quelle
1
Können Sie bitte erklären, was die erste Codezeile genau bewirkt? Wie vergleicht sich ossec mit fail2ban? Vielen Dank.
ProgrammerGirl
2
Es ist eine Iptables-Regel. Ich glaube, es zählt, wie viele neue Verbindungsversuche gemacht werden und löscht sie, nachdem sie 4 Versuche innerhalb von 60 Sekunden überschritten haben. Ich ermutige Sie, sich anzusehen, man iptableswas jede Flagge bedeutet und wie sie zusammenarbeiten.
Luke
-3

NoooBS,

--- Flut ---

iptables -N logdrop iptables -A logdrop -m kürzlich --set --name schwarze Liste

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

iptables -A logdrop -j DROP

iptables -N ddos ​​iptables -A ddos ​​-m kürzlich --rcheck --name blacklist --seconds 300 --hitcount 1 -j logdrop iptables -A ddos ​​-m kürzlich --set --name erneut iptables -A ddos ​​-m kürzlich --update --name again --seconds 60 --hitcount 2 -j logdrop iptables -A ddos ​​-j RETURN

Igors Gorda
quelle