24
Jul/07
4

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…

Filed under: Nagios
Comments (4) Trackbacks (0)
  1. JanNo Gravatar
    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

  2. LaMiNo Gravatar
    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

  3. GeorgNo Gravatar
    18:46 on November 20th, 2008

    wir verwenden dafür authprogs.

    gruss

  4. steffNo Gravatar
    13:28 on November 22nd, 2008

    Hab das Script ein wenig verbessert:

    http://www.nagios-portal.org/w.....#post89986
    Keine Gewähr und Haftung :-)

No trackbacks yet.