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:

kill-zombies.sh
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:

/etc/sudoers.d/zombies
Cmnd_Alias KILLTHEHORDE = /bin/kill
nagios ALL=(ALL) NOPASSWD: KILLTHEHORDE
nrpe.cfg
command[killTheZombies]=ps afx | grep defunct -B 1 | grep -Eo "[0-9]{3,}" | xargs sudo /bin/kill -9