SECTOR NORD AG Tipp des Monats
[SNAG-View] Überleben in der Zombieapokalypse
von Andreas Gerliz
-Ein Überlebenshandbuch von Nils Meyer
Kapitel 1 - Was ist ein Zombie?
Als Zombie wird in der IT ein Prozess oder Dienst bezeichnet, der während seiner Laufzeit gestorben ist und als Untoter im Prozessmanager herumgeistert.
Im Normalfall verhält sich ein Untoter sehr passiv, verbraucht keine Ressourcen und wird in der Prozessliste aufgelistet.
Kapitel 2 - Ansteckungsgefahr!
Einige Programme wie z.B. nagios (Parent) lassen Unteraufgaben von ihren Kindern (Child) wie z.B. ein check_ping ausführen. Das sieht wie folgt aus:
nagios 2176 1 0 2017 ? 00:00:31 /etc/nagios/bin/nagios -c /etc/nagios/nagios.cfg -d nagios 2176 23211 0 2017 ? 00:00:31 /etc/nagios/bin/nagios -c /etc/nagios/nagios.cfg -d nagios 2176 23212 0 2017 ? 00:00:31 /etc/nagios/bin/nagios -c /etc/nagios/nagios.cfg -d nagios 2176 23213 0 2017 ? 00:00:31 /etc/nagios/bin/nagios -c /etc/nagios/nagios.cfg -d nagios 2176 23214 0 2017 ? 00:00:31 /etc/nagios/bin/nagios -c /etc/nagios/nagios.cfg -d |
Jedes Child führt seine Aufgabe aus und meldet sich im Anschluß mit dem "SIGCHLD" Signal beim Parent.
Der Parent Prozess ist jetzt aufgefordert den wait() Systemcall durchzuführen um die das "SIGCHLD" Signal als Informationen vom Child zu empfangen.
Nach dem erfolgreichen Übertragen, wird normalerweise der Prozess, das Child getötet.
Passiert das nicht, werden immer mehr Untote erschaffen, Prozesse, die tatenlos im Prozessmanager des Systems hängen.
Einige Parents z.B. nagios haben lassen häufig ihre Child-Prozesse zurück, ohne für diese die Verantwortung zutragen.
Durch das Ignorieren der Child-Prozesse können die Parents mehr Zeit aufwenden um neue Events zu verarbeiten oder auch neue Child-Prozesse anzutriggern.
Kapitel 3 - Langzeitauswirkung
Kümmert sich das verantwortliche Administratorenteam, sich nicht um ihre Zombies, kann es zu folgenden Problemen kommen:
- Max PID's pro User wird erreicht (/etc/security/limits.d/,(/etc/security/limits.conf).
- Evtl. Memory Leak im Parent Process
Redhat 7 | 30447 |
SLES11 | 62890 |
SLES12 | 62482 |
Debian 9 | 3839 |
Kapitel 4 - Suchen und töten der Zombies "search and destroy"
Um die Untoten aufzuspüren, gibt es verschiedene Möglichkeiten, die einfachste Art ist das Kommando ps.
Beispiel:
ps afx | grep defunct -B 1 |
Jetzt lässt sich der Zombie wie folgt beseitigen:
- Methode 1 (Verantwortung zu den Parent schieben): "kill -s SIGCHLD <pid>". Hiermit beseitig der Parent sein Child.
- Methode 2 (Es selbst machen): "kill -9 <pid>". Damit wird der Zombie aus seinem Nest, dem Prozessmanager des Systems geworfen.
- Methode 3 (Massenvernichtung): "ps afx | grep defunct -B 1 | grep -Eo "[0-9]{3,}" | xargs kill -9". Damit werden alle Zombies beseitigt.
Kapitel 5 - Verteidigungslinien
Durch regelmässige Checks können Einzelne oder Gruppen von Zombieprozessen aufgespürt werden.
Wir nutzen dafür das bewährte "check_procs". Mit "check_procs" können wir unter Ux-Systemen verschiedene grundlegende Checks durchführen:
Beispiele für "check_procs"
Anzahl aller Prozesse über 100% CPU | ./check_procs -w 100 --metric=CPU | Metric |
Anzahl aller untoten Prozesse | ./check_procs -s Z -w 100 -v | State |
Anzahl alle Prozesse über 661756KiB (Kibibyte) / ca. 678 MB | ./check_procs -w 661756 --metric=RSS -v | Metric |
Prüft ob mindestens ein Prozess vorhanden ist | ./check_procs -a /usr/bin/mongod -w 1 | Count |
Prüft ob ein Prozess vorhanden ist | ./check_procs -a /usr/bin/mongod -w 1:1 | Count |
Mit dem Aufruf des State-Check lassen sich die Zombies im System finden. Definieren wir zusätzlich einen Eventhandler, können wir alle Zombies automatisch töten.
Im SNAG-View muss folgender Befehl als Eventhandler hinterlegt werden:
/ var /lib/nagios/libexec/eventhandlers/kill-zombies.sh $SERVICESTATE $ $STATETYPE $ $SERVICEATTEMPT $ $HOSTADDRESS $ |
Folgendes Script muss auf dem SNAG-View Server hinterlegt sein:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
#!/bin/sh HOSTADDRESS=$4 case "$1" in OK) ;; WARNING) ;; UNKNOWN) ;; CRITICAL) case "$2" in SOFT) case "$3" in 3) /var/lib/nagios/libexec/check_nrpe -H $HOSTADDRESS -c killTheZombies ;; esac ;; HARD) /var/lib/nagios/libexec/check_nrpe -H $HOSTADDRESS -c killTheZombies ;; esac ;; esac exit 0 |
Der Eventhandler wird gestartet und führt in bestimmten Situationen (HARD oder SOFT State mit den dritten Checkversuch) das Kommando aus.
Die Gegenseite muss wie folgt konfiguiert werden:
Cmnd_Alias KILLTHEHORDE = /bin/kill nagios ALL=(ALL) NOPASSWD: KILLTHEHORDE |
command [killTheZombies]= ps afx | grep defunct -B 1 | grep -Eo "[0-9]{3,}" | xargs sudo /bin/kill -9 |