Jul/074
Nagios: check_by_ssh auf gewünschte Befehle beschränken
Hallöchen,
ich experimentiere seit einiger Zeit mit dem Ausführen von lokalen Plugins durch Nagios auf entfernten Rechnern. Auf Linux-Systemen gefällt mir der Zugriff über SSH am besten. In den meißten Setups findet die Authentifizierung über einen Public-Key statt (Kurze Anleitung zur Einrichtung). Das Problem ist in meinen Augen, dass der Zugriff auf dem Zielsystem nicht geschützt und ausreichend eingeschränkt ist. SSH bietet da glücklicherweise einige Möglichkeiten.
Auf dem Zielrechner kann man einen bestimmten Public-Key an einen einzigen Befehl oder an ein Script binden, der beim Login mit diesem Key immer ausgeführt wird. Das ist insofern unflexibel, als das man dem Befehl keine Parameter übergeben kann. Nach einigen Recherchen und Experimenten ist mir aber auch das gelungen.
Auf jedem überwachten System existiert also ein User Nagios. Dem User wird unterhalb seines Home-Verzeichnisses ein Verzeichniss .ssh (Wichtig: chmod 700) und eine Datei authorized_keys (Wichtig: chmod 600) innerhalb des .ssh Verzeichnisses angelegt. Der Inhalt der Datei sieht dann wie folgt aus:
command="/home/nagios/libexec/check_nagios.sh",from="",no-port-forwarding,no-X11-forwarding
Hier binden wir den Public Key an die IP-Adresse des Nagios-Rechners und ein Wrapper-Script. Wenn ein Key an ein Script gebunden wird, ist es egal, was später in dem SSH-Kommando steht, es wird immer nur dieses Script ausgeführt. Das Wrapper Script wird dann unter /home/nagios/libexec abgelegt. Es dient dazu die Parameter, die per SSH kommen zu verarbeiten und entsprechend dann nur erwünschte Checks auszuführen.
#!/bin/bash # directory where the checks-scripts are stored in strCheckDir=/home/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
In diesem Script kann man dan steuern welches Script auf dem Server ausgeführt werden darf.
Zum Testen führe ich folgendes Kommando aus:
sudo -u nagios ./check_by_ssh -l nagios -H -C "check_load 6,5,3 10,6,5" -t 10
Die Magie an dem ganzen steckt in folgender Variable: $SSH_ORIGINAL_COMMAND
Wie oben schon erwähnt wird dadurch, dass der Public-Key an ein Kommando gebunden ist nicht der Befehl ausgeführt, den wir SSH per -C mitgeben, sondern nur das Script, was dem Public-Key zugeordnet ist.
Der Befehl, der per SSH übertragen wird verschwindet aber nicht im Nirvana, sondern wird in der Umgebungsvariable $SSH_ORIGINAL_COMMAND abgelegt. Diese muss dann nur noch geparst werden und schon kann man dem fest eingetragenem Script Parameter übergeben.
Viel Spaß damit…







12:46 on April 26th, 2008
Hi,
das ist aber nicht wirklich sicherer so. Da $1 und $2 in keiner weise escaped sind kann man beliebige shell commands einschleusen.
Gruß,
Jan
18:58 on April 27th, 2008
Hi Jan,
da hast du natürlich recht. Gegenüber dem vorgehen, dass ein Key alle Befehle ausführen darf ist das aber wohl schon ein Fortschritt.
Du kannst die obigen Scripte gerne patchen und zur Verfügung stellen, so dass auch andere davon profitieren.
Grüße,
Lars
18:46 on November 20th, 2008
wir verwenden dafür authprogs.
gruss
13:28 on November 22nd, 2008
Hab das Script ein wenig verbessert:
http://www.nagios-portal.org/w.....#post89986
Keine Gewähr und Haftung