Wie wirkt sich ein "sleep(10)" auf andere User aus?

... komplette Frage anzeigen

5 Antworten

Du erleichterst damit massiv einen DoS-Angriff! Dank der Verzögerung reicht theoretisch ein einziger (!) schwachbrüstiger RasPi mit sehr langsamer Anbindung völlig aus, um damit ein kleines Rechenzentrum aus Hochleistungsservern binnen Sekunden in die Knie zu zwingen!

Die Idee ist also ganz ganz gaaaaanz schlecht, auch wenn man im Internet immer wieder von diesen sog. "Teergruben" liest.

Ich schreibe auch ab und zu mal einen Crawler / Bot / Spider / Wasauchimmer und in den Logs sehe ich dann später, dass wohl einige Hosts tatsächlich so eine Teergrube eingesetzt haben.

Bloß: Davon bekomme ich im Betrieb überhaupt nichts mit! Es stört den Botbetreiber kein bisschen ... das juckt nichtmal! :)

Wenn von 10000 Verbindungen, eine einzige Verbindung statt einer einzigen Sekunde plötzlich mehr als 10 Sekunden braucht, wird sie abgebrochen und der Server auf eine Blacklist gesetzt. Fertig. Und selbst wenn nicht, wird sie nach 60 Sekunden abgebrochen, und danach gibt es ein paar neue Versuche.

Ob da jetzt eine von mehreren Tausend Verbindungen mal für kurze Zeit in einer Teergrube hängt, oder nicht, das ist mir völlig egal! :)

PHP funktioniert aber so, dass der Interpreter-Prozess trotzdem normal weiter läuft, selbst wenn Client oder Server die Verbindung gekappt haben. Das heißt, wenn ich einen Request abschicke, und binnen 200 Millisekunden die Verbindung trenne, ist ein Prozess / Thread deines Servers immer noch für weitere 9.8 Sekunden NICHT ansprechbar!

Diese Art von Angriff nennt man "Resource Exhaustion" (da gibt es noch mehr mögliche Angriffsszenarien):

https://en.wikipedia.org/wiki/Resource\_exhaustion\_attack

Beim Apache ist das so, dass der Webserver einen Pool an Prozessen bereit hält, die wiederum jeweils einen Pool aus mehreren relativ "leichten" Threads vorhalten. Insgesamt sind das bei einem regulären Apache-Server mit PHP-Modul im höchstfall einige Tausend.

Bei einem eingehenden Request wird ein Handle über IPC an die Unterprozesse weitergereicht, die sich fortan um die Verbindung kümmern.

Ein RasPi kann locker 10000 Requests pro Sekunde abfeuern und wenn auf der Serverseite jeder Prozess / Thread durch sleep(10) für 10 Sekunden lahmgelegt ist, könnte jemand mit bösen Absichten sehr bequem deinen Server lahm legen.

Fazit: Deine Idee ist zwar "clever" in der Theorie, aber in der Praxis öffnest du damit ein Scheunentor großes Sicherheitsloch, über das man deinen Server auf Dauer lahmlegen kann!

Die Idee würde ich also an deiner Stelle ganz schnell wieder vergessen! Du schadest dir damit nur selbst, und ein Botbetreiber wird vermutlich nicht mal etwas davon mitbekommen, dass du versuchst ihn zu behindern.

Trotzdem noch viel Erfolg mit deinem Server! :)

Disclaimer: Die Bots, die ich so schreibe, beachten i. d. R. die "robots.txt" und schicken nur höchstens einmal alle 90 Sekunden eine Anfrage an einen Server. Ich achte immer peinlich darauf, die Server nicht zu "vergewaltigen" und darauf, dem Serverbetreiber keinen Schaden / Nachteil zu bereiten.

Also bitte differenzieren! Es gibt gute, und auch schlechte Crawler! Trotzdem muss man natürlich immer defensiv arbeiten, und seine Server schützen, da es leider viel zu viele Idioten gibt, die böse Bots schreiben. Aber wirf mich mit solchen Leuten bitte nicht in einen Topf! ;)

Antwort bewerten Vielen Dank für Deine Bewertung
Kommentar von klugshicer
13.10.2016, 20:19

Gute Ausführung - also das mit dem Sleep fliegt raus. Für einen Bekannten habe ich inzwischen ein Script schreiben können, dass vom Prinzip wie "fail2ban" funktioniert.

1

Die Performance des Servers sinkt deswegen erstmal nicht direkt. Denn der sleep() wird direkt auf Systemebene ausgewertet, führt dort zu einer zeitgesteuerten Blockade des Prozesses, und der Scheduler vergibt in der Zwischenzeit die Rechenzeit eben an andere Prozesse.

ABER: Der Prozess liegt halt erstmal auf Halde. D. h. Du hast eben einen Prozess im System, der Speicher allokiert hat, für den ein wenig Grundverwaltungsaufwand anfällt usw.

Wenn nun jemand sehr viele Anfragen auf Deine Kiste macht, und die alle in diesen sleep() reinlaufen, dann kann sich daraus eine "denial of service"-Situation ergeben. Denn typischerweise ist die Zahl maximal laufender (Apache-)Prozesse limitiert, und auch der Hauptspeicher ist endlich.

Vor allem die Kombination Apache/PHP tendiert leider dazu, eine Menge Speicher pro in Bearbeitung befindlicher Anfrage zu konsumieren. Das ist halt keine wirklich leichtgewichtige Software.

Antwort bewerten Vielen Dank für Deine Bewertung
Kommentar von klugshicer
09.10.2016, 20:11

Vielen Dank für diese ausführliche Erklärung.

0
Kommentar von TeeTier
10.10.2016, 06:18

Ich sehe gerade, dass du sinngemäß das gleiche geschrieben hast, wie ich in meiner Antwort. Das nächste mal werde ich die bisherigen Antworten wenigstens mal überfliegen, bevor ich eine eigene verfasse! :)

0

Das wird nicht's ändern. ABER einen Bot wirst du damit auch nicht wirklich ausbremsen ;)

Antwort bewerten Vielen Dank für Deine Bewertung

1 verbindung mehr bleibt länger geöffnet => es kann theoretisch eine verbindung weniger paralell aufgebaut bzw verarbeitet werden.. bei angriffen (dos/ddos) dürfte das angreifern ganz gut passen das der server freiwillig wartet und blockiert.. ausserdem stockt ja alles (speicher bleibt natürlich bis zum ende mit allen aktuellen Verbindungsdaten & nutzdaten voll)

Antwort bewerten Vielen Dank für Deine Bewertung
Kommentar von LeonardM
09.10.2016, 21:16

meiner meinung nach total falscher ansatz angriffe ausbremsen zu wollen

1
Kommentar von LeonardM
10.10.2016, 06:52

naja gut den bruteforce angriff via http erschwerts natürlich durch die länge der wartezeit aber dafür hat das system gewisse nachteile

1
Kommentar von LeonardM
14.10.2016, 06:48

besser :D

0

Die Funktion sleep()  legt nicht den ganzen Server lahm, sondern pausiert das Skript nur für Denjenigen, der das Skript aufruft.

Antwort bewerten Vielen Dank für Deine Bewertung

Was möchtest Du wissen?