
Daher vermute ich, dass mein Server möglicherweise Opfer eines Denial-of-Service-Angriffs ist.
Wir wurden von Pingdom (Website-Überwachung) benachrichtigt, dass unsere Website ab etwa 3 Uhr morgens nicht verfügbar war. Heute früh begannen wir, die Apache-Fehlerprotokolle zu überprüfen und sahen eine ganze Reihe dieser Fehler:
AH00485: Anzeigetafel ist voll, nicht bei MaxRequestWorkers
Wir haben auch festgestellt, dass unser PHP-FPM-Prozesspool häufig weitere Server starten musste:
[pool www] scheint ausgelastet zu sein (Sie müssen möglicherweise pm.start_servers oder pm.min/max_spare_servers erhöhen) und erzeugt 8 Kinder
Wir haben versucht, MaxRequestWorkers in der Apache-Konfiguration zu erhöhen und einige andere Abhilfemaßnahmen, aber diese haben uns nicht von dem Scoreboard-Fehler im Apache-Fehlerprotokoll befreit, also bin ich gegen mein besseres Wissen dem Rat in gefolgt.dieser Threadund setzenMinSpareThreadsUndMaxSpareThreadsgleichMaxRequestWorkers. Diese Änderungen scheinen den Anzeigetafelfehler behoben zu haben.
Ich habe auch MaxRequestWorkers stark erhöht, da wir viel RAM haben, der offensichtlich nicht genutzt wird. Unser Server hat 8 Kerne und scheint trotz dieser wirklich hohen Konfigurationswerte seinen RAM kaum zu nutzen:
$ free -h
total used free shared buff/cache available
Mem: 7.8G 1.8G 2.0G 38M 4.0G 5.8G
Swap: 0B 0B 0B
Ich bin ziemlich nervös wegen dieser hohen Werte für MaxRequestWorkers in der Apache-Konfiguration und pm.max_children in der PHP-FPM-Konfiguration.
Hier ist die grundlegende Konfiguration in mpm_event.conf
<IfModule mpm_event_module>
StartServers 2
MinSpareThreads 800
MaxSpareThreads 800
ThreadLimit 64
ThreadsPerChild 25
ServerLimit 800
MaxRequestWorkers 800
MaxConnectionsPerChild 0
</IfModule>
Hier sind einige Einstellungen in einer php-fpm-Konfigurationsdatei:
pm.max_children = 256
pm.start_servers = 64
pm.min_spare_servers = 64
pm.max_spare_servers = 128
Hier sind einige grundlegende Serverinformationen:
Server version: Apache/2.4.18 (Ubuntu)
Server built: 2019-10-08T13:31:25
Server's Module Magic Number: 20120211:52
Server loaded: APR 1.5.2, APR-UTIL 1.5.4
Compiled using: APR 1.5.2, APR-UTIL 1.5.4
Architecture: 64-bit
Server MPM: event
threaded: yes (fixed thread count)
forked: yes (variable process count)
Und hier sind einige Daten aus der Apache-Serverstatusausgabe:
Server Version: Apache/2.4.18 (Ubuntu) OpenSSL/1.0.2g
Server MPM: event
Server Built: 2019-10-08T13:31:25
Current Time: Friday, 10-Jan-2020 22:58:55 CST
Restart Time: Friday, 10-Jan-2020 22:26:32 CST
Parent Server Config. Generation: 1
Parent Server MPM Generation: 0
Server uptime: 32 minutes 22 seconds
Server load: 4.69 5.06 5.12
Total accesses: 78434 - Total Traffic: 1.5 GB
CPU Usage: u2970.53 s5037.34 cu0 cs0 - 412% CPU load
40.4 requests/sec - 0.8 MB/second - 19.7 kB/request
797 requests currently being processed, 3 idle workers
PID Connections Threads Async connections
total accepting busy idle writing keep-alive closing
6124 28 yes 25 0 0 0 3
6125 27 yes 25 0 0 0 2
6182 30 yes 25 0 0 1 4
6210 28 yes 25 0 0 0 3
6211 29 yes 25 0 0 0 5
6266 28 yes 25 0 0 2 1
6267 25 yes 25 0 0 0 1
6269 28 no 24 1 0 1 3
6276 28 yes 25 0 0 0 3
6378 28 yes 25 0 0 0 3
6379 31 no 24 1 0 4 3
6380 27 yes 25 0 0 0 3
6384 26 yes 25 0 0 0 2
6397 28 yes 25 0 0 2 1
6405 27 yes 25 0 0 0 2
6414 26 yes 25 0 0 1 0
6423 27 no 24 1 0 1 1
6602 27 yes 25 0 0 0 3
6603 28 yes 25 0 0 0 4
6604 26 yes 25 0 0 0 1
6617 30 yes 25 0 0 0 5
6646 26 yes 25 0 0 0 2
6676 27 yes 25 0 0 0 2
6694 30 yes 25 0 0 0 5
6705 28 yes 25 0 0 0 3
6730 29 yes 25 0 0 0 4
6765 29 yes 25 0 0 0 4
6781 27 yes 25 0 0 0 2
6805 28 yes 25 0 0 0 4
6836 28 yes 25 0 0 0 3
6858 27 yes 25 0 0 0 3
6859 27 no 25 0 0 1 1
Sum 888 797 3 0 13 86
Der Teil mit dem Arbeitsmodus ist am beunruhigendsten. Fast jeder einzelne befindet sich im Lesemodus:
RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR
RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR
RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR
RRRRRRR_RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR
_RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRWRRRRRRRRRRRRRRRRRRRRRRRRRRRR
RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR
RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR_RRRRRRRRRRRRRRRRRRRRRRRRRRRR
RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR
RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR
RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR
RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR
RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR
RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR
Und zum Schluss noch das:
SSL/TLS Session Cache Status:
cache type: SHMCB, shared memory: 512000 bytes, current entries: 2176
subcaches: 32, indexes per subcache: 88
time left on oldest entries' objects: avg: 220 seconds, (range: 197...243)
index usage: 77%, cache usage: 99%
total entries stored since starting: 60122
total entries replaced since starting: 0
total entries expired since starting: 0
total (pre-expiry) entries scrolled out of the cache: 57946
total retrieves since starting: 3405 hit, 59594 miss
total removes since starting: 0 hit, 0 miss
Und netstat zeigt über 3000 Verbindungen zu Port 80 und Port 443:
$ netstat -n | egrep ":80|443" | wc -l
3715
Was zum Teufel ist hier los? Der Server läuft seit Monaten einwandfrei mitdeutlich bescheidenere Konfigurationseinstellungen.Gestern Nacht gegen 3 Uhr morgens scheint sich etwas schlagartig geändert zu haben.
Für jede Anleitung wäre ich sehr dankbar. Ich habe zuerst hier gesucht und gefundendieser andere Threadaber es ist eine andere Version von Apache, die im Prefork-Modus läuft, statt im Event-Modus wie bei mir. Ich verstehe auch nicht, wie die wenigen Informationen in diesem Thread zu einer SlowLoris-Diagnose geführt haben.
EDIT: Es scheint, ich muss meine Fragen präziser formulieren:
1) Wie kann ich die Reaktionsfähigkeit meines Servers wiederherstellen? Offensichtlich stecken die Apache-Arbeiter fest inRModus ist ein Symptom eines Problems.
2) Gibt es eine zuverlässige Reihe von Schritten, mit denen ich das eigentliche Problem genauer identifizieren kann?
3) Gibt es eine Möglichkeit zu bestätigen, dass der Computer einem DoS-Angriff ausgesetzt ist?
Antwort1
Das bloße Zählen der Anzahl der Verbindungen auf der Anzeigetafel ist kein ausreichender Beweis dafür, dass Kunden unhöflich sind und ihre Verbindungen nicht weiterverfolgen. Das ist ein drastischer Anstieg, also ist entweder die Web-App sehr beliebt geworden oder jemand stellt dumme Anfragen.
Sehen Sie sich die Rate der pro Sekunde abgeschlossenen Anfragen an. Bei so vielen Mitarbeitern sollte sie ziemlich hoch sein, vorausgesetzt, Ihre Webanwendung funktioniert ausreichend. Überprüfen Sie alle Aspekte der Webserverleistung, einschließlich der für Benutzer verfügbaren Bandbreite, der Serverlast und der Leistung zugehöriger Komponenten wie Datenbanken. Beheben Sie alle Leistungsprobleme aufgrund unzureichender Ressourcen.
Analysieren Sie die Verteilung der mit den Web-Ports verbundenen IP-Adressen. Eine IP, die alle Hunderte von Verbindungen herstellt, ist ungewöhnlich, obwohl IPv4-NATs dies erschweren. Ermitteln Sie die ISPs der Quelladressen. Überprüfen Sie die Sicherheitsreputationsbewertungen der IP-Adressen und ob es sich um ein riesiges NAT handeln könnte.
Führen Sie eine Paketerfassung eingehender Anfragen durch, während Sie weiterhin Ihre Überwachung durchführen. Sie sollten zumindest einige HTTP-Anfragen von Clients sehen, die sich gut verhalten. Wenn Clients sich einfach verbinden und dort warten, sieht das ein bisschen nach einer Ressourcenerschöpfung im SlowLoris-Stil aus.
Beachten Sie die Optimierungsempfehlungen in der verlinkten Antwort. Unter Linux net.ipv4.tcp_fin_timeout = 10
können Sie versuchen, die Timeouts mit sysctl oder Ähnlichem etwas zu reduzieren.
Erwägen Sie, diesen Webserver hinter einem sicherheitsorientierten und lastausgleichenden Proxy zu platzieren. Mithilfe von Web Application Firewall-Funktionen können Sie Anfragen clever filtern. Durch horizontale Skalierung können Sie möglicherweise mehr Anfragen verarbeiten.
Antwort2
Gibt es eine Möglichkeit zu bestätigen, dass der Computer einem DoS-Angriff ausgesetzt ist?
DOSist Denial-of-Service.
Attackeist eine feindselige Handlung, die mit der Absicht durchgeführt wird, Schaden zuzufügen.
(Passive Aggressionist ein Oxymoron, das von Leuten benutzt wird, die nicht verstehen, dasspassivbedeutet Abwesenheit einer Handlung – Untätigkeit, per Definition, undAggression(per Definition auch) bedeutet feindliche Handlung. Aber das ist natürlich eine andere Geschichte.)
Zwischen diesen beiden gibt es eine Lücke, in der es sich zwar um DoS handelt, aber nicht um einen Angriff im Sinne einer feindlichen Handlung. Nehmen wir an, F5 bleibt auf der Tastatur eines Benutzers hängen, kann DoS verursachen, sofern keine Gegenmaßnahmen ergriffen werden, aber es ist kein Angriff im Sinne einer feindlichen Handlung, die mit der Absicht ausgeführt wird, Schaden anzurichten. Andererseits ist es ein Angriff, wenn der Benutzer weiß, dass dies zu DoS führen würde, und die Taste absichtlich gedrückt hält.
Um Ihre Frage zu beantworten: Es ist offensichtlich unmöglich, dies mit Sicherheit zu sagen, es sei denn, Sie können nachweisen, dass eine Absicht vorliegt. Ob es sich um einen DoS handelt, lässt sich erkennen, wenn die Dienstunterbrechung aufgrund fehlender Ressourcen – Überlastung – auftritt.