DOS durch OOM

Bachsau

Member
Guten Morgen!

Gerade ist es jemand / einem Script, das vermutlich auf einem gehackten Server läuft gelungen, meine Websites durch massive Zugriffe auf ein MediaWiki lahm zu legen. Das führte zu einer Out-of-Memory-Situation, und dazu, dass der Kernel den MySQL-Server geschlachtet hat.

Ich frage mich jetzt wie ich möglichst gezielt verhindern kann, dass das wieder passiert. Kann ich irgendwie priorisieren was gekillt werden darf, und was nicht? Wenn er in solchen Fällen die laufende PHP-CGI instanz killt, ist das ja kein so großes Problem, wie wenn der Datenbankserver dran glauben muss. Vor allem würde ich solchen Situationen aber generell gerne vorbeugen. Anpassung von MaxClients und der Grenzwerte von mod_evasive ist dabei keine Option, weil das ja auch Zugriffe auf statische Resourcen betreffen würde, die so gut wie keinen Speicher benötigen. Das Problem entsteht ja nur dann, wenn resourcenlastige Scripte innerhalb von Sekundenbruchteilen dreißig mal gestartet werden.

Die Kiste hat ein Giga RAM und ein Giga Swap. Apache MaxClients 150, MySQL max_connections 200.
 
Wie wäre es mit IP Tables die Requests je Sekunde zu reduzieren?

Alternativ, oder zusätzlich könnte man den Nginx als Reverse Proxy vorschalten.
Dieser darf dann statische Dateien direkt ausliefern. Dynamische Inhalte wie PHP werden über den Localhost auf den Apache2 durchgereicht. Beim Durchreichen dann cachen und Requests in der Sekunde reduzieren und einen Burst erlauben. Letzteres hilft dann bei Ajax lastigen Seiten.
Code:
http {
	(...)
	limit_req_zone $binary_remote_addr zone=flood:10m rate=10r/s;
	(...)
}
Code:
server {
	(...)
	location ~ \.php {
		limit_req zone=flood burst=20;
		(...)
	}
	(...)
}
 
Last edited by a moderator:
Back
Top