aus PUG, der Penguin User Group
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:
|
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:
|
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:
|
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
|
|
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:
|
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.
|
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.
|
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:
|
master: ~# scp nrpe-i386.tar.gz root@dmz:
|
- Auf dem DMZ Rechner angelangt, können wir es dort auch sogleich entpacken:
|
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:
|
# 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
|
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:
|
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
|
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:
|
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:
|
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
|
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:
|
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
|
#!/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:
|
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:
|
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
|
#!/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:
|
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.
|
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
|
#--- 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:
|
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:
|
dmz: ~# apt-get install libwww-perl
|
- Unter SuSE ist dafür folgendes Paket nötig:
|
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
|
[...]
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.
|
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
|
#!/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:
|
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:
[...]
|
- /usr/local/nagios/etc/.ssh/authorized_keys
|
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
|
# '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
|
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
|
#!/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:
|
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
|
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
|
...
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
|
[...]
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:
|
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
|
[...]
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:
|
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
|
#!/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:
|
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
|
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
|
# 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
|
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
|
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
|
[...]
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:
|
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:
|
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
|
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:
|
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.