Nagios Installation/Überwachen Hosts und Services

aus PUG, der Penguin User Group
Wechseln zu: Navigation, Suche

Navigation

Hosts und Services überwachen

Einleitung

Im ersten Teil der Anleitung habe ich erläutert, welche Methoden und Techniken eingesetzt werden sollen, wie das Benachrichtigungskonzept ausschaut und welcher Gedanke sich dahinter verbirgt. Im zweiten Teil haben wir die nötigen Voraussetzungen geschaffen, um mit diesem System nun zum eigentlichen Kern zu gelangen: dem Überwachen der Hosts und Services.
Dieser Teil wird vermutlich der aufwendigste sein, da er sukzessive durch verschiedene Checks erweitert werden wird. Am Anfang habe ich zwar erläutert, welche Dienste überprüft werden, doch werden sich noch weitere hinzugesellen.
Wer ebenfalls Prüfchecks hinzufügen möchte, der sei herzlich dazu eingeladen, sich ebenfalls daran zu beteiligen, um so ein möglichst weites Spektrum abdecken zu können. :-)
Fangen wir an:

DMZ Rechner einbinden

Standard-Plugins

Als erstes werden die Nagios-Plugins auf das System kopiert. Da es im allgemeinen keine gute Idee ist, auf einem Produktivrechner Compiler, Entwicklerpakete und Co. auf dem System zu haben, empfiehlt es sich dringend, diese auf einem Entwicklerrechner zu kompilieren. In diesem Fall kopieren wir die Plugins via scp vom Nagios-Host, da beide unter dem selben Linux laufen. Möglicherweise funktioniert nicht jedes Plugin aufgrund fehlender Bibliotheken. Wird auf dem Client z.B kein MySQL benötigt, so wird der Aufruf von check_mysql fehlschlagen. Doch wie gesagt, wird kein MySQL benötigt, stellt dies kein Problem da. Möglicherweise existiert noch kein /usr/local/nagios auf dem Zielsystem, daher werden wir im ersten Schritt dieses erzeugen:
Gnome-terminal.png
master ~# ssh root@dmz "mkdir /usr/local/nagios/"
master ~# scp -r /usr/local/nagios/libexec root@dmz:/usr/local/nagios/


User und Gruppe

Da wir auf dem zu prüfenden Rechner natürlich Dienste laufen lassen wollen, als User Nagios, müssen wir dem entsprechend einen User Nagios und eine dazugehörige Gruppe erzeugen:
  • Gruppe und User erzeugen
Gnome-terminal.png
dmz: ~# groupadd nagios
dmz: ~# useradd -g nagios -d /usr/local/nagios/etc/ -s /bin/bash nagios

Client Prüfmethode

Es gibt diverse Möglichkeiten, um einen Host zu überprüfen und die Checks auf ihm aus der Ferne aufzurufen. Daher werden ich verschiedene Methoden erläutern und aufzeigen. Beginnen wir mit der beliebten NRPE Variante.

Über NRPE prüfen

Da wir vom Nagios aus den DMZ-Rechner ohne weiteres erreichen können, lassen wir auf diesem einen NRPE-Daemon laufen. Nagios kann in diesem Fall über das Plugin check_nrpe einen Daemon ansprechen, der wiederum ein Plugin ausführt. Das Ergebnis liefert er dann an Nagios zurück, der dieses dann verwerten kann.
Dazu ist es nötig, das auf dem DMZ-Rechner der Nagios Daemon läuft. Da wir ihn aus Gründen der Konsistenz auf jedem Rechner installieren, können wir den Daemon auch auf dem Nagios-Master übersetzen:

NRPE übersetzen und installieren

NRPE selbst benötigt nicht viel. Es werden lediglich die Standard-Entwicklerpakete benötigt sowie OpenSSL:
Gnome-terminal.png
master: /usr/src/nagios# tar xzf nrpe-2.12.tar.gz
master: /usr/src/nagios# cd nrpe-2.12
master: /usr/src/nagios/nrpe-2.12# ./configure --prefix=/usr/local/nagios
master: /usr/src/nagios/nrpe-2.12# make all
master: ~# echo 'nrpe 5666/tcp #NRPE for Nagios' >> /etc/services
Dialog-warning.png

In der Datei include/common.h muss der Wert von #define MAX_INPUT_BUFFER und #define MAX_PACKETBUFFER_LENGTH auf den Wert 8192 gesetzt werden, vor dem compilieren

Danach müssen die Dateien entsprechend an ihren Ort kopiert werden:
Gnome-terminal.png
master /usr/src/nagios/nrpe-2.12# make install && make install-xinetd && make install-daemon-config
Wie bereits zu vermuten ist, wird der SuperDaemon xinetd eingesetzt. Er sorgt dafür, dass immer wenn Nagios einen check aufruft, der NRPE Daemon gestartet wird. Desweiteren lässt sich fein granuliert bestimmen, von welchem Rechner aus auf diesen Dienst zugegriffen werden darf. Im Normalfall dürfen dies nur der Nagios-Master und sein Slave. Sollte xinetd noch nicht vorhanden sein, so ist dieser nachzuinstallieren.
Debian-term.png
master: ~# apt-get install xinetd
Unter SuSE ist dieser bereits vorinstalliert.


Damit wir auf den anderen Rechnern nicht auch kompilieren müssen, erstellen wir uns einfach ein kleines tar-Paket, welches die benötigten Dateien enthält. Innerhalb einer Produktivumgebung sollten jedoch entsprechende RPM od. Deb Pakete erstellt werden, schon aus Versions- und Pflegegründen.
Gnome-terminal.png
master: ~#  tar czf nrpe-i386.tar.gz /usr/local/nagios/bin/nrpe \ 
                   /usr/local/nagios/libexec/check_nagios /etc/xinetd.d/nrpe \
                   /usr/local/nagios/etc/nrpe.cfg
Dieses tar-Paket können wir nun auf den DMZ-Rechner kopieren:
Gnome-terminal.png
master: ~# scp nrpe-i386.tar.gz root@dmz:
Auf dem DMZ Rechner angelangt, können wir es dort auch sogleich entpacken:
Gnome-terminal.png
dmz: ~# tar xvzf nrpe-i386.tar.gz -C /
dmz: ~# echo 'nrpe 5666/tcp #NRPE for Nagios' >> /etc/services
Die letzte Zeile jeweils sorgt dafür, dass der Dienst bekannt ist. Fehlt diese Zeile, weigert sich xinetd den NRPE Dienst aufzurufen.

NRPE Konfiguration

die Konfiguration beschränkt sich im wesentlichen auf zwei Dateien:
  • /etc/xinetd.d/nrpe - Superdaemon Wrapper Konfiguration
  • /usr/local/nagios/etc/nrpe.cfg - Die eigentliche Konfiguration vom NRPE
In der ersten Datei definieren wir, von welchem Rechner aus der Dienst NRPE angesprochen werden darf, sowie ein paar nützliche Logging-Funktionen:
  • /etc/xinetd.d/nrpe
Ascii.png
# default: on
# description: NRPE (Nagios Remote Plugin Executor)
service nrpe
{
       	flags           = REUSE
        socket_type     = stream    
	port		= 5666    
       	wait            = no
        user            = nagios
	group		= nagios
       	server          = /usr/local/nagios/bin/nrpe
        server_args     = -c /usr/local/nagios/etc/nrpe.cfg --inetd
       	log_on_failure  += USERID
        disable         = no
	only_from       = 127.0.0.1 192.168.5.1 192.168.5.2
}
Wir erlauben hier also, dass eine Verbindung von localhost und den IP-Adressen 192.168.5.1 und 192.168.5.2 hergestellt werden darf.
Nun die richtige Konfiguration:
  • /usr/local/nagios/etc/nrpe.cfg
Ascii.png
log_facility=daemon
pid_file=/var/run/nrpe.pid
server_port=5666
nrpe_user=nagios
nrpe_group=nagios
allowed_hosts=127.0.0.1
 
dont_blame_nrpe=0
debug=0
command_timeout=60
connection_timeout=300
command[check_users]=/usr/local/nagios/libexec/check_users -w 5 -c 10
command[check_load]=/usr/local/nagios/libexec/check_load -w 15,10,5 -c 30,25,20
command[check_root]=/usr/local/nagios/libexec/check_disk -w 20% -c 10% -p /
command[check_zombie_procs]=/usr/local/nagios/libexec/check_procs -w 5 -c 10 -s Z
command[check_total_procs]=/usr/local/nagios/libexec/check_procs -w 150 -c 200
Die Zeile allowed_hosts hat nur Bedeutung, wenn NRPE als Daemon läuft, was in unserem Fall nicht gilt.
Jede Zeile die mit command beginnt, ist ein Befehl, der von Nagios (od. per Hand) aufgerufen werden kann. Ein schneller Test vom Master aus verschafft Sicherheit darüber:
Gnome-terminal.png
master:~# /usr/local/nagios/libexec/check_nrpe -H dmz 
NRPE v2.12

master:~# /usr/local/nagios/libexec/check_nrpe -H dmz -c check_load
OK - load average: 0.00, 0.00, 0.00|load1=0.000;15.000;30.000;0; load5=0.000;10.000;25.000;0; load15=0.000;5.000;20.000;0;
Der erste Test verrät, ob die grundsätzliche Funktionalität gegeben ist. Dies betrifft unter anderem die wichtige SSL-Kommunikation. Der zweite Test ruft einen Check auf, welcher ebenfalls von Erfolg gekrönt sein muss.
Wenn dies der Fall ist, hat nun auch Nagios kein Problem damit, diesen Rechner zu prüfen.

Über SSH prüfen

Eine weitere beliebte Methode, einen Remote Hosts zu prüfen, besteht darin, dass Nagios sich auf den Remote Host einloggt und dort den Check ausführt. Der Vorteil besteht darin, dass kein weiterer Dienst nach Außen hin verfügbar sein muss. SSH dagegen ist in vielen Fällen ohnehin erreichbar und kann daher genutzt werden.
Da Nagios schlecht ein Passwort eingeben kann, verwenden wir die Schlüsselauthentifizierung. Dazu muss auf dem Nagios-Master ein Schlüsselpaar eingerichtet und der öffentliche Schlüssel auf DMZ übertragen werden.

Schlüsselpaar erstellen/konfigurieren

Gnome-terminal.png
master:~# su - nagios -c "ssh-keygen -t dsa"
Die Pfade sollten übernommen werden. Wichtig: Die Passphrase muss leer bleiben. Zwar ließe sich eine Passphrase mittels einem SSH-Agent übergeben, dies würde aber immer noch eine Benutzereingabe voraussetzen und ist somit aus dem Rennen.
Der öffentlichen Schlüssel /usr/local/nagios/etc/.ssh/id_dsa.pub' muss nun auf den DMZ-Rechner übertragen werden. Ein einfacher scp-Aufruf erledigt dies. Das Verzeichnis /usr/local/nagios/etc/.ssh sollte jedoch schon existieren. Wenn dies nicht der Fall ist, muss es zuvor angelegt werden:
Gnome-terminal.png
master:~# ssh root@dmz "mkdir /usr/local/nagios/etc/.ssh ; chown nagios:nagios -R /usr/local/nagios/"
master:~# scp /usr/local/nagios/etc/.ssh/id_dsa.pub root@dmz:/usr/local/nagios/etc/.ssh/authorized_keys
Ein flinker Test bestätigt unseren Erfolg:
Gnome-terminal.png
master:~# su - nagios -c "ssh dmz"

Last login: Mon May  5 17:50:02 2008 from 192.168.5.1

nagios@dmz:~$ exit
master:~#
Technisch gesehen könnten wir nun fortfahren und Nagios konfigurieren, doch damit hinterließen wir ein großes, offenes Tor. Würde Nagios feindlich übernommen werden können, so könnte der Einbrecher ebenfalls auf die anderen Rechner gelangen, ohne viel Mühe zu investieren. Daher bietet SSH die Möglichkeit, den Account einzuschränken, womit nur bestimmte Befehle ausgeführt werden dürfen. Dies muss in der /usr/local/nagios/etc/.ssh/authorized_keys erfolgen, auf dem DMZ-Rechner:
  • /usr/local/nagios/etc/.ssh/authorized_keys
Ascii.png
command="/usr/local/nagios/libexec/check_load -w 15,10,5 -c 30,25,20" ssh-dss AAAAB3Nz .....
Für jedes Kommando müsste nun eine solche Zeile enthalten sein, bzw. mittels Semikolon getrennte Befehle. Ein Test fördert folgendes zu Tage:
Gnome-terminal.png
master:~# su - nagios -c "ssh dmz"
OK - load average: 0.00, 0.00, 0.00|load1=0.000;15.000;30.000;0; load5=0.000;10.000;25.000;0; load15=0.000;5.000;20.000;0; 
Connection to dmz closed.
Bei mehrere Befehlen ist es allerdings ein wenig unübersichtlich und fehlerträchtig. Um es ein wenig flexiber zu gestalten, bietet sich eine Erweiterung an, welche hier beschrieben wird. Statt also einzelne Befehle einzutragen, wird nun ein Script aufgerufen, welches weitere Befehle zur Verfügung stellt. Dieses Script liegt z.B. unter /usr/local/nagios/libexec:
  • /usr/local/nagios/libexec/ssh-command.sh
Ascii.png
#!/bin/bash

# directory where the checks-scripts are stored in 
strCheckDir=/usr/local/nagios/libexec

# Parse original SSH command
OFS="$IFS"
IFS=" "
set -- $SSH_ORIGINAL_COMMAND
IFS="$OFS"

case "$1" in
        check_load)
                strOutput=`$strCheckDir/check_load -w $2 -c $3`
                intReturn=$?
        ;;
        *)
                strOutput="check not allowed! (arg1=$1)"
                # UNKNOWN return code
                intReturn=3
        ;;
esac

echo "$strOutput"
exit $intReturn
Diese Auflistung ließe sich damit beliebig erweitern. Allerdings sollte der Hinweis beachtet werden, dass in diesem Fall $1 und $2 nicht geschützt werden und somit eine potentielle Lücke entstehen könnte.
Um dieses Script verwenden zu können, muss der Aufruf dementsprechend nach dem command= in der /usr/local/nagios/etc/.ssh/authorized_keys stehen. Im Ergebnis sieht es nun so aus, erfolgt der Aufruf vom Master:
Gnome-terminal.png
master:~# su - nagios -c "ssh dmz check_load 6,5,3 10,6,5"
OK - load average: 0.16, 0.03, 0.01|load1=0.160;6.000;10.000;0; load5=0.030;5.000;6.000;0; load15=0.010;3.000;5.000;0; 
Über das check_by_ssh Kommando von Nagios sähe das Ganze folgendermaßen aus:
Gnome-terminal.png
master:~ su - nagios -c '/usr/local/nagios/libexec/check_by_ssh -l nagios -H dmz -C "check_load 6,5,3 10,6,5" -t 10'
OK - load average: 0.10, 0.03, 0.01|load1=0.100;6.000;10.000;0; load5=0.030;5.000;6.000;0; load15=0.010;3.000;5.000;0;

check_nrpe und check_by_ssh kombinieren

Folgen wir unserem Setup-Aufbau am Anfang, so können wir zwar kein NRPE auf direktem Wege nutzen, um die dahinter liegenden Clients zu erreichen, dafür aber über check_by_ssh Kommando. Nagios loggt sich auf den DMZ-Rechner ein und führt dort das check_nrpe Kommando aus.
Dazu ist es nötig, dass wir check_nrpe ein Argument (in diesem Fall ein Kommando) mitgeben. Über die herkömmliche Weise wäre dies nicht möglich, da nicht das Original-Kommando über check_by_ssh durchgereicht wird. Doch unser zuvor ssh-command.sh-Script gibt uns das nötige Werkzeug an die Hand. Dazu sind nur marginale Änderungen am DMZ-Rechner-Script nötig:
  • /usr/local/nagios/libexec/ssh-command.sh
Ascii.png
#!/bin/bash
strCheckDir=/usr/local/nagios/libexec
 
# Parse original SSH command
OFS="$IFS"
IFS=" "
set -- $SSH_ORIGINAL_COMMAND
IFS="$OFS"
 
case "$1" in
        check_nrpe)
                strOutput=`$strCheckDir/check_nrpe $@`
                intReturn=$?
        ;;
        *)
                strOutput="check not allowed! (arg1=$1)"
      echo $@
                # UNKNOWN return code
                intReturn=3
        ;;
esac
 
echo "$strOutput"
exit $intReturn
Hiermit werden nun die Befehle so interpretiert, wie wir sie vom Master-Rechner aus übergeben haben.
Ein Beispiel am DMZ-Rechner, wie nun beide Kommandos kombiniert aussehen können:
Gnome-terminal.png
master:~# su - nagios -c '/usr/local/nagios/libexec/check_by_ssh -l nagios -H dmz -C "check_nrpe -H localhost -c check_load"'
OK - load average: 0.33, 0.09, 0.02|load1=0.330;15.000;30.000;0; load5=0.090;10.000;25.000;0; load15=0.020;5.000;20.000;0; 
Statt des Rechners localhost wird dann natürlich der Rechner innerhalb der DMZ-Umgebung aufgeführt.

check_multi - einer für alle

In der Regel würde nun für jeden Check auf einem Remote Host ein Eintrag fällig werden. Darunter würde nicht nur die Nagios-Webseite leiden, sondern auch der Administrator, der diese Checks hinzufügen muss. Zwar ließe sich mit den Templates einiges an Arbeit sparen, doch ist der Zeitfaktor nach wie von Relevanz.
Da es auf jedem Rechner eine definierte Anzahl von generischen Tests (Swap, Ram, Load, Festplatte ...) gibt, lässt sich dort mit check_multi vieles vereinfachen. Wir werden uns eine check_multi Datei erstellen, in welcher alle generischen Checks definiert werden.
Zuvor muss jedoch check_multi auf die jeweiligen Rechner, in diesem Fall auf den Master- und den DMZ-Rechner.
Gnome-terminal.png
master:/usr/src/nagios# tar xzf check_multi-0.16.current.tgz 
master:/usr/src/nagios# cd check_multi-0.16
master:/usr/src/nagios/check_multi-0.16# 

master:/usr/src/nagios/check_multi-0.16# cp -r check_multi contrib/ /usr/local/nagios/libexec/

master:/usr/src/nagios/check_multi-0.16# scp -r check_multi contrib/ root@dmz:/usr/local/nagios/libexec/
Nun können wir z.B. auf dem DMZ-Rechner folgende Konfiguration erstellen:
  • /usr/local/nagios/libexec/contrib/check_multi-generic.cmd
Ascii.png
#--- processes
command[ procs_total ]          = check_procs
command[ procs_zombie ]         = check_procs -w 1 -c 2 -s Z
command[ proc_cron ]            = check_procs -c 1: -C cron
command[ proc_syslogd ]         = check_procs -c 1: -C syslogd
command[ proc_xinetd ]          = check_procs -c 1: -C xinetd
command[ proc_ssh ]             = check_procs -c 1: -C sshd

#--- system parameters
command[ system_load ]          = check_load -w 5,4,3 -c 10,8,6
# command[ system_mail ]          = check_tcp -H localhost -p 25
# command[ system_ntp ]           = check_ntp -H localhost
command[ system_ssh ]           = check_ssh localhost
command[ system_swap ]          = check_swap -w 90 -c 80
#command[ system_syslog ]         = check_file_age -f /var/log/messages -c 86400 -C 0
command[ system_users ]         = check_users -w 5 -c 10

# -- Platten
command[ system_rootdisk ]      = check_disk -w 5% -c 2% -p /
command[ system_usr ]           = check_disk -w 5% -c 2% -p /usr
command[ system_var ]           = check_disk -w 5% -c 2% -p /var
command[ system_tmp ]           = check_disk -w 5% -c 2% -p /tmp
Die Werte sind natürlich bei Bedarf anzupassen, doch das Prinzip sollte hier ersichtlich sein.
Um diese Konfiguration auf ihre Funktion zu überprüfen, können wir check_multi von Hand starten:
Gnome-terminal.png
dmz:~# /usr/local/nagios/libexec/check_multi -f /usr/local/nagios/libexec/contrib/check_multi-generic.cmd
OK - 14 plugins checked, 14 ok [please don't run plugins as root!]
[ 1] procs_total PROCS OK: 40 processes
[ 2] procs_zombie PROCS OK: 0 processes with STATE = Z
[ 3] proc_cron PROCS OK: 1 process with command name 'cron'
[ 4] proc_syslogd PROCS OK: 1 process with command name 'syslogd'
[ 5] proc_xinetd PROCS OK: 1 process with command name 'xinetd'
[ 6] proc_ssh PROCS OK: 2 processes with command name 'sshd'
[ 7] system_load OK - load average: 0.07, 0.02, 0.00
[ 8] system_ssh SSH OK - OpenSSH_4.3p2 Debian-9 (protocol 2.0)
[ 9] system_swap SWAP OK - 100% free (239 MB out of 239 MB) 
[10] system_users USERS OK - 2 users currently logged in 
[11] system_rootdisk DISK OK - free space: / 184 MB (72% inode=87%);
[12] system_usr DISK OK - free space: /usr 1134 MB (86% inode=94%);
[13] system_var DISK OK - free space: /var 409 MB (77% inode=98%);
[14] system_tmp DISK OK - free space: /tmp 93 MB (94% inode=99%);
|check_multi::check_multi::plugins=14 time=0.000000 system_load::
[...]  
Die Ausgabe lässt sich auf Wunsch mit dem Schalter -r<wert> HTML-formatiert ausgeben. Für diesen Fall müssen allerdings die passenden Perl-Module auf dem System vorhanden sein. Auf einem Debian-System hilft folgender Aufruf:
  • Debian
Debian-term.png
dmz: ~# apt-get install libwww-perl
  • SuSE
Unter SuSE ist dafür folgendes Paket nötig:
Suse-term.png
dmz: ~# yast -i perl-libwww-perl
Weitere sehr schöne Funktionen von check_multi gibt es hier auf der Webseite des Projektes. Insbesondere das Überladen der Konfiguration, od. Cluster-Setups sind sehr spannend.

In NRPE-Konfiguration eintragen

Funktioniert check_multi mit dem Aufruf von Hand, lässt sich dieser natürlich auch in NRPE eintragen. Auf diese Weise lassen sich mit nur wenigen, erlaubten Checks viele Prüfungen erledigen.
  • /usr/local/nagios/etc/nrpe.cfg
Ascii.png
[...]
command[check_generic]=/usr/local/nagios/libexec/check_multi -f /usr/local/nagios/libexec/contrib/check_multi-generic.cmd
Alle anderen Kommandos wurden entfernt. Ein Test vom Master verschafft auch hier die Sicherheit auf Funktion.
Gnome-terminal.png
master:~# /usr/local/nagios/libexe/check_nrpe -H dmz -c check_generic
OK - 14 plugins checked, 14 ok
[ 1] procs_total PROCS OK: 42 processes
[ 2] procs_zombie PROCS OK: 0 processes with STATE = Z
[ 3] proc_cron PROCS OK: 1 process with command name 'cron'
[ 4] proc_syslogd PROCS OK: 1 process with command name 'syslogd'
[ 5] proc_xinetd PROCS OK: 1 process with command name 'xinetd'
[ 6] proc_ssh PROCS OK: 2 processes with command name 'sshd'
[ 7] system_load OK - load average: 0.02, 0.01, 0.00
[ 8] system_ssh SSH OK - OpenSSH_4.3p2 Debian-9 (protocol 2.0)
[ 9] system_swap SWAP OK - 100% free (239 MB out of 239 MB) 
[10] system_users USERS OK - 2 users currently logged in 
[11] system_rootdisk DISK OK - free space: / 184 MB (72% inode=87%);
[12] system_usr DISK OK - free space: /usr 1134 MB (86% inode=94%);
[13] system_var DISK OK - free space: /var 409 MB (77% inode=98%);
[14] system_tmp DISK OK - free space: /tmp 93 MB (94% inode=99%);
|check_multi::check_multi::plugins=14 time=1.000000 system_load::check_load::load1=0.020;5.000;10.000;0; load5=0.010;4.000;8.000;0; load15=0.

In SSH-Konfiguration eintragen

Natürlich kann dieses Plugin auch in die Konfiguration von SSH eingetragen werden. Je nachdem, ob nun das ssh-command.sh Script zum Einsatz kommt oder nur pures SSH:
  • /usr/local/nagios/libexec/ssh-command.sh
Ascii.png
#!/bin/bash
strCheckDir=/usr/local/nagios/libexec
 
# Parse original SSH command
OFS="$IFS"
IFS=" "
set -- $SSH_ORIGINAL_COMMAND
IFS="$OFS"
 
case "$1" in
        check_nrpe)
                strOutput=`$strCheckDir/check_nrpe $@`
                intReturn=$?
        ;;
       check_generic)
                 strOutput=`$strCheckDir/check_multi -f /usr/local/nagios/libexec/contrib/check_multi-generic.cmd`
                 intReturn=$?
        ;;
        *)
                strOutput="check not allowed! (arg1=$1)"
      echo $@
                # UNKNOWN return code
                intReturn=3
        ;;
esac
 
echo "$strOutput"
exit $intReturn


Auch hier dürfte der Test nicht schwer fallen:
Gnome-terminal.png
master: ~# su - nagios -c '/usr/local/nagios/libexec/check_by_ssh -l nagios -H dmz -C "check_generic"'
OK - 14 plugins checked, 14 ok
[ 1] procs_total PROCS OK: 43 processes
[ 2] procs_zombie PROCS OK: 0 processes with STATE = Z
[ 3] proc_cron PROCS OK: 1 process with command name 'cron'
[ 4] proc_syslogd PROCS OK: 1 process with command name 'syslogd'
[ 5] proc_xinetd PROCS OK: 1 process with command name 'xinetd'
[ 6] proc_ssh PROCS OK: 4 processes with command name 'sshd'
[ 7] system_load OK - load average: 0.00, 0.00, 0.00
[ 8] system_ssh SSH OK - OpenSSH_4.3p2 Debian-9 (protocol 2.0)
[ 9] system_swap SWAP OK - 100% free (239 MB out of 239 MB) 
[10] system_users USERS OK - 2 users currently logged in 
[11] system_rootdisk DISK OK - free space: / 184 MB (72% inode=87%);
[12] system_usr DISK OK - free space: /usr 1134 MB (86% inode=94%);
[13] system_var DISK OK - free space: /var 409 MB (77% inode=98%);
[14] system_tmp DISK OK - free space: /tmp 93 MB (94% inode=99%);
|check_multi::check_multi::plugins=14 time=0.000000 system_load::check_load:
[...]
  • Reines SSH
  • /usr/local/nagios/etc/.ssh/authorized_keys
Ascii.png
command="/usr/local/nagios/libexec/check_multi -f /usr/local/nagios/libexec/contrib/check_multi-generic.cmd" ssh-dss AAAAB3.......

DMZ-Zugangshost in Nagios eintragen

Da wir nun den ersten Host mit Plugins ausgestattet haben, können wir nun an die Nagios-Konfiguration gehen. Im ersten Schritt müssen die entsprechende Kommandos angelegt werden. Im zweiten erfolgt die Host-Konfiguration.

Konfiguration

Kommandos

Wie erläutert, folgt nun zuerst die Kommando-Definition:
  • /usr/local/nagios/etc/objects/commands.cfg
Ascii.png
# 'check_by_ssh' Definition
define command{
	command_name    check_by_ssh
	command_line	$USER1$/check_by_ssh -H $HOSTADDRESS$ $ARG1$
	}


# 'check_by_nrpe' Definition
define command{
	command_name    check_nrpe
	command_line	$USER1$/check_nrpe -H $HOSTADDRESS$ $ARG1$
	}

Host und Service

Nun folgt der passende Host- und Service-Eintrag. Für diesen Test wird nur eine Datei verwendet, um beide zu definieren:
  • /usr/local/nagios/etc/objects/dmz.cfg
Ascii.png
define host{
        use                   linux-server            ; Name of host template to use
        host_name             dmz
        alias                 DMZ_Host
        address               192.168.5.5
        }
define service{
        use                   local-service         ; Name of service template to use
        host_name             dmz
        service_description   check_generic
        check_command         check_nrpe!check_generic
        }
Sofern das Verzeichnis über ein cfg_dir= eingebunden wird, ist dieser Host beim nächsten Reload von Nagios mit von der Partie. Ansonsten muss diese Datei über cfg_file= in der nagios.cfg eingebunden werden.
Nach /etc/init.d/nagios reload und einer kurzen Wartezeit ist der Host und sein Check auf der Nagios-Webseite verfügbar - und hoffentlich grün ;-)
  • Spezifische check_multi-Konfiguration
Da uns dieser Rechner den Zugang zur DMZ zur Verfügung stellt, sollten wir darauf prüfen, ob auch die zweite Netzwerkkarte aktiv ist und auch eine IP-Adresse besitzt. Daher erstellen wir eine zweite check_multi-Konfiguration, die diese Tests enthält.
Um schnell zu überprüfen, ob die gewünschte Netzwerkkarte aktiv ist, kommt ein kleiner Bash-Zweizeiler zum Zuge:
  • /usr/local/nagios/libexec/check_iface
Ascii.png
#!/bin/sh
# Check if ethx is available
iface=$1

if [ -x $iface ]

then	echo "Missing argument"
	echo "Usage $0 device to check"
	exit 2
else

/sbin/ifconfig | grep -q $iface 

if [ $? = 0 ]
then	echo "Interface $iface is up"
	exit 0
else
	echo "Interface $iface is down"
	exit 1
fi
fi
Nicht schön, aber es erfüllt seinen Zweck. Ein Aufruf fördert folgendes zu Tage:
Gnome-terminal.png
dmz:/usr/local/nagios/libexec# ./check_iface eth1
Interface eth1 is up
dmz:/usr/local/nagios/libexec# echo $?
0

dmz:/usr/local/nagios/libexec# ./check_iface eth3
Interface eth3 is down
dmz:/usr/local/nagios/libexec# echo $?
1

dmz:/usr/local/nagios/libexec# ./check_iface
Missing argument
Usage ./check_iface device to check
dmz:/usr/local/nagios/libexec# echo $?
2
Natürlich ließe sich nun auch gleichzeitig prüfen, ob denn auch eine IP vergeben wurde, doch verwenden wir an dieser Stelle das Plugin check_icmp, welches auch noch Performance-Werte liefert.
Zusammen ergibt sich folgende check_multi Datei:
  • /usr/local/nagios/libexec/contrib/check_multi-dmz.cmd
Ascii.png
command [ dmz_iface ] =  check_iface eth1
command [ dmz_dmz_ip ] = check_icmp -H 10.0.0.2
Nun die entsprechende NRPE-Anpassung:
  • /usr/local/nagios/etc/nrpe.cfg
Ascii.png
...
command[check_dmz_iface]=/usr/local/nagios/libexec/check_multi -f /usr/local/nagios/libexec/contrib/check_multi-dmz.cmd
Und für Nagios:
  • /usr/local/etc/nagios/etc/objects/dmz.cfg
Ascii.png
[...]
define service{
	use			local-service
	host_name		dmz
	service_description	check_dmz_iface
	check_command		check_nrpe!check_dmz_iface
	}

Host aus der DMZ-Umgebung einbinden

Nun ist es an der Zeit, einen Host hinzuzufügen, welcher innerhalb einer DMZ steht und für Nagios nicht direkt erreichbar ist. Daher bedienen wir uns des zuvor eingerichteten DMZ-Zugangshosts.
Auf welche Weise der Rechner innerhalb der DMZ abgefragt wird, kann der Administrator nun aufgrund der hier vorgestellten Methoden selbst entscheiden. Der Autor entscheidet sich hier für für den SSH-Login auf dem DMZ-Host, um dann den NRPE abzufragen.
Die Grundeinrichtung des Nagios-Users und seiner Plugins entspricht der des DMZ-Rechners. In diesem Fall hilft ein einfaches Klonen des Rechners.

NRPE-Konfiguration

Auf dem Rechner - genannt web - haben wir natürlich ebenfalls eine generische Konfiguration für check_multi, die der des DMZ-Hosts gleicht. Bei der xinetd NRPE-Konfiguration weicht nur ein Wert ab und dies ist die zulässige IP-Adresse des Hosts, der NRPE abfragen darf. Infolge dessen sieht die Konfiguration leicht abgewandelt aus:
  • /etc/xinetd.d/nrpe
Ascii.png
service nrpe
{
flags            = REUSE
socket_type = stream    
port             = 5666    
wait             = no
user            = nagios
group          = nagios
server          = /usr/local/nagios/bin/nrpe
server_args = -c /usr/local/nagios/etc/nrpe.cfg --inetd
log_on_failure  + = USERID
disable          = no
only_from       = 127.0.0.1 10.0.0.2 
}
Dann folgt die obligatorische Zeile in der nrpe.cfg Datei:
  • /usr/local/nagios/etct/nrpe.cfg
Ascii.png
[...]
command[check_generic]=/usr/local/nagios/libexec/check_multi -f /usr/local/nagios/libexec/contrib/check_multi-generic.cmd
command[check_web]=/usr/local/nagios/libexec/check_multi -f /usr/local/nagios/libexec/contrib/check_multi-web.cmd
Die generischen Checks können wir jetzt schon vom Master aus prüfen, ob unser Konstrukt funktioniert. Der zweite Check wird weiter unten erstellt:
Gnome-terminal.png
master:/usr/local/nagios# su - nagios -c '/usr/local/nagios/libexec/check_by_ssh -l nagios -H dmz -C "check_nrpe -H web -c check_generic"'

OK - 14 plugins checked, 14 ok
[ 1] procs_total PROCS OK: 41 processes
[ 2] procs_zombie PROCS OK: 0 processes with STATE = Z
[ 3] proc_cron PROCS OK: 1 process with command name 'cron'
[ 4] proc_syslogd PROCS OK: 1 process with command name 'syslogd'
[ 5] proc_xinetd PROCS OK: 1 process with command name 'xinetd'
[ 6] proc_ssh PROCS OK: 2 processes with command name 'sshd'
[ 7] system_load OK - load average: 0.01, 0.11, 0.07
[ 8] system_ssh SSH OK - OpenSSH_4.3p2 Debian-9 (protocol 2.0)
[ 9] system_swap SWAP OK - 100% free (239 MB out of 239 MB) 
[10] system_users USERS OK - 1 users currently logged in 
[11] system_rootdisk DISK OK - free space: / 184 MB (72% inode=87%);
[12] system_usr DISK OK - free space: /usr 1138 MB (87% inode=94%);
[13] system_var DISK OK - free space: /var 405 MB (76% inode=98%);
[14] system_tmp DISK OK - free space: /tmp 93 MB (94% inode=99%);
|check_multi::check_multi::plugins=14 time=0.000000 system_load::check_load::load1=0.010;5.000;10.000;0; load5=0.110;4.000;8.000;0; load15=0.
Nur um das hier gesehene zu verdeutlichen: wir haben uns per SSH auf den DMZ-Host eingeloggt, um dann dort das Kommando check_nrpe -H web -c check_generic abzusetzen. Der DMZ-Rechner fragt dann entsprechend per check_nrpe den Host web ab und dieser liefert uns das gewünschte Check-Ergebnis von check_multi.

Check Host alive über SSH

Da es unsinnig wäre, den Rechner mittels eines herkömmlichen ICMP Pings über NRPE zu testen, werden wir diesen Test vom DMZ-Host aus ausführen lassen. Damit dies klappt, müssen wir auf dem DMZ-Host unser ssh-command.sh Script ein wenig erweitern.
  • /usr/local/nagios/libexec/ssh-command.sh
Ascii.png
#!/bin/bash
strCheckDir=/usr/local/nagios/libexec
 
# Parse original SSH command
OFS="$IFS"
IFS=" "
set -- $SSH_ORIGINAL_COMMAND
IFS="$OFS"
 
case "$1" in
	check_icmp)
               strOutput=`$strCheckDir/check_icmp $2`
               intReturn=$?
        ;;
        check_nrpe)
                strOutput=`$strCheckDir/check_nrpe $@`
                intReturn=$?
        ;;
	check_generic)
               strOutput=`$strCheckDir/check_multi -f /usr/local/nagios/libexec/contrib/check_multi-generic.cmd`
               intReturn=$?
        ;;
        *)
                strOutput="check not allowed! (arg1=$1)"
      echo $@
                # UNKNOWN return code
                intReturn=3
        ;;
esac
 
echo "$strOutput"
exit $intReturn
In diesem Fall müssen wir die Variable $2 auslesen, da sonst versucht wird, check_icmp als Rechnername aufzulösen. Nagios loggt sich also wie gehabt per SSH ein und wartet dann den Check vom check_icmp ab.

Spezifische Check_Multi-Konfiguration

Bei dem Autor dieser Seite ist dieser Host - wie sicher aus dem Namen ersichtlich wurde - der Webserver-Host, ausgestattet mit einem Apache2 und ein paar Modulen wie PHP. Wir möchten natürlich auf dem Laufendem bleiben, wenn der Dienst keine oder falsche Seiten ausliefert. Daher erzeugen wir eine weitere check_multi-Konfiguration, die den Webserver auf Funktionalität prüft. Am einfachsten lässt sich dazu http_check verwenden. Ein Beispiel:
Gnome-terminal.png
web:/usr/local/nagios/libexec/# ./check_http -r "^Dies ist eine wichtige Seite$" -H 10.0.0.10
HTTP OK HTTP/1.1 200 OK - 0.008 second response time |time=0.008470s;;;0.000000 size=40334B;;;0

web:/usr/local/nagios/libexec# ./check_http -S -C 50 -H 10.0.0.10
WARNING - Certificate expires in 14 day(s) (05/28/2008 07:21)

Wir überprüfen hier 1., ob der Webserver antwortet und 2. der entsprechende String gefunden wird. Im zweiten Beispiel, wie lang unser frisch erzeugtes SSL Zertifikat noch gültig ist. Mit diesem Wissen können wir nun also die check_multi-web.cmd Datei erstellen:
  • /usr/local/nagios/libexec/contrib/check_multi-web.cmd
Ascii.png
command[ proc_httpd ]		= check_procs -c 8:10 -C  apache2
command[ web_check ]		= check_http -r "^Dies ist eine wichtige Seite$" -H 10.0.0.10 -w 4 -c 8
command[ web_ssl ]		= check_http -S -C 50 -H 10.0.0.10

Nagios-Konfig

Nach all diesen Vorarbeiten können wir nun die Nagios-Konfiguration auf dem Master erstellen. Dazu müssen wir einige neue Kommandos definieren:


  • /usr/local/nagios/objects/commands.cfg
Ascii.png
# check Hosts via the DMZ host
define command{
        command_name    check-dmz-host-alive
        command_line    $USER1$/check_by_ssh -H dmz -C "check_icmp $HOSTADDRESS$ -w 3000.0,80% -c 5000.0,100% -p 5"
        }

# 'check_nrpe_via_dmz' Definition
define command{
	command_name  check_nrpe_via_dmz
	command_line	$USER1$/check_by_ssh -H dmz -C "check_nrpe -H $HOSTADDRESS$ -c $ARG1$"
	}
Das erste Kommando benötigen wir, um einen Host innerhalb der DMZ-Umgebung zu prüfen, ob er denn auch noch lebt. Das zweite, um über check_by_ssh unsere Tests via NRPE zu starten. Als nächstes folgt der spezifische Test des Webservers:
  • master:/usr/local/nagios/etc/objects
Ascii.png
define host{
	check_command		check-dmz-host-alive
        use                     linux-server            ; Name of host template to use
        host_name               web
        alias                   DMZ_Host
        address                 10.0.0.10
        }

define service{
        use                             local-service         ; Name of service template to use
        host_name                       web
        service_description             check_generic
	check_command			check_nrpe_via_dmz!check_generic
	notifications_enabled		0
        }

define service{
        use                             local-service         ; Name of service template to use
        host_name                       web
        service_description             check_web
	check_command			check_nrpe_via_dmz!check_web
	notifications_enabled		0
        }
Hat auch das geklappt, folgt im Anschluss der obligatorische /etc/init.d/nagios reload, um danach die Arbeit auf der Nagios-Webseite begutachten zu können. Auf die selbe Art und Weise können nun der Mail- und der Datenbank-Server aufgebaut werden.


Mailserver in der DMZ

Die Konfiguration von NRPE und xinetd entspricht der vorangegangenen Konfiguration des Webservers. Es müssen nur die check_multi Dinge und die Tests selbst angepasst werden. Im Detail sehen die Konfigurationen wie im Anschluss aus.

Mailprotokolle testen

Zum Einsatz kommt zwar ein Postfix, spielt aber - dem Protokoll sei Dank - keine Rolle, was den Ablauf des Tests darstellt. Zum Überprüfen wird zum einen nachgeschaut, ob die Prozesse vom Postfix aktiv sind, zum anderen ob er auch entsprechend funktioniert. Dazu verwenden wir check_smtp.
Für den Test des lokalen POP3- od. IMAP-Servers können verschiedene Plugins zum Einsatz kommen. Da wären zum einen die generischen Checks check_pop und check_imap, die jedoch über keine besonderen Fähigkeiten verfügen. Dann gibt es noch auf der [NagiosExchange.org NagiosExchange.org] Seite noch weitere Plugins, die auch die Möglichkeit mitliefern, sich einzuloggen. Exemplarisch stelle ich das auf Perl basierende check_pop3_login vor. Die generischen werden jedoch ebenfalls verwendet, da sie unter anderem Performance-Werte liefern.
  • /usr/local/nagios/libexec/contrib/check_multi-mail.cmd
Ascii.png
command[ proc_postfix ]         = check_procs -c 1: -C  master
command[ proc_postfix ]         = check_procs -c 1: -C  pickup
command[ proc_postfix ]         = check_procs -c 1: -C  qmgr
command[ smtp_check ]           = check_smtp -C "Mail from: nagios@dmz.local" -R "250" -C "RCPT TO: mailtest@dmz.local" -R "250" -H localhost
command[ pop3_login ]           = check_pop3_login localhost mailtest mailtest
command[ pop3_check ]           = check_pop -H localhost
command[ imap_check ]           = check_imap -H localhost
Der SMTP-Check wird auch eine Mail versenden, die wir z.B. mit einem anderen Check überprüfen können, ob sie denn auch tatsächlich angekommen ist. In diesem Beispiel ersparen wir uns dieses aber und lassen die E-Mails löschen.
Nicht vergessen, die /usr/local/nagios/etc/nrpe.cfg auf den aktuellen Stand zu bringen:
  • /usr/local/nagios/etc/nrpe.cfg
Ascii.png
[...]
command[check_mail]=/usr/local/nagios/libexec/check_multi -f /usr/local/nagios/libexec/contrib/check_multi-mail.cmd

Nagios Mail-Host-Konfiguration

Die Nagios-Konfiguration hätte dann folgende Form:
Ascii.png
define host{
        check_command           check-dmz-host-alive
        use                     linux-server            ; Name of host template to use
        host_name               mail
        alias                   DMZ_Mail_Host
        address                 10.0.0.11
        }

define service{
        use                             local-service         ; Name of service template to use
        host_name                       mail
        service_description             check_generic
        check_command                   check_nrpe_via_dmz!check_generic
        notifications_enabled           0
        }

define service{
        use                             local-service         ; Name of service template to use
        host_name                       mail
        service_description             check_ mail
        check_command                   check_nrpe_via_dmz!check_mail
        notifications_enabled           0
        }

Datenbankserver in der DMZ

Nun folgt der vorerst letzte Beispiel-DMZ-Host: der Datenbank-Server. Auch er ist identisch mit den vorangegangenen, nur besitzt er Tests für die MySQL-Datenbank. Um die Verbindung ohne root-Rechte testen zu können, legen wir uns am Besten eine Test-Datenbank an und einen zusätzlichen Benutzer, welcher nur Leserechte besitzt:
Ascii.png
db: ~# mysqladmin -p create testdb
db: ~# mysql -p -u root -D mysql -e 'GRANT select on testdb.* TO nagios@10.0.0.12;'
db: ~# mysql -p -u root -D mysql -e 'GRANT select on testdb.* TO nagios@127.0.0.1;'
Damit darf der User Nagios von localhost und 10.0.0.12 eine Verbindung aufbauen, ohne ein Kennwort zu verwenden. Da die DB leer ist, kann nicht viel falsch gehen.
Ist die Datenbank erstellt worden, kann es mit dem Erstellen der Checks weitergehen:
  • /usr/local/nagios/libexec/contrib/check_multi-db.cmd
Ascii.png
command[ check_postfix ]         = check_smtp -H localhost
command[ check_mysql ]         = check_mysql -H 10.0.0.12 -d test -u nagios

Nagios MySQL-Host-Konfiguration

Sie hat folgenden Aufbau:
Ascii.png
define host{
        check_command           check-dmz-host-alive
        use                     linux-server            ; Name of host template to use
        host_name               db
        alias                   DMZ_DB_Host
        address                 10.0.0.12
        }

define service{
        use                             local-service         ; Name of service template to use
        host_name                       db
        service_description             check_generic
        check_command                   check_nrpe_via_dmz!check_generic
        notifications_enabled           0
        }

define service{
        use                             local-service         ; Name of service template to use
        host_name                       db
        service_description             check_ db
        check_command                   check_nrpe_via_dmz!check_db
        notifications_enabled           0
        }

Grafische Übersicht

Damit hätten wir nun alle Server eingebunden und können uns der grafischen Verknüpfung zuwenden. Diese findet sich im vierten Teil der Anleitung wieder.