Zabbix Monitoring per SSH und Telnet

Warum SSH und Telnet?

Der Zabbix-Server und die Proxys sind in der Lage, Daten von einem Host per SSH oder Telnet „abzuholen“. Dazu ist auf dem überwachten Host die Installation des Zabbix-Agenten nicht nötig. Die Verbindung wird per SSH oder Telnet aufgebaut. Der Zabbix-Server loggt sich ein und führt dann remote ein Kommando aus. Der Rückgabewert dieses Kommandos wird dann als Value für ein Item gespeichert.

Um Items von Type SSH anzulegen, müssen der Zabbix-Server und die Proxys mit der Option --with-ssh kompiliert worden sein. Schauen Sie in das Logfile vom Zabbix-Server, dort muss beim Start des Servers bestätigt werden, dass die SSH-Option verfügbar ist. Für die Telnetverbindngen sind keine Optionen während des Kompilierens notwendig. Wenn Sie die von Zabbix LLC zur Verfügung gestellten RPM- und DEB-Pakete verwenden, können Sie SSH- und Telnet-Checks ohne weitere Anpassungen verwenden.

Die Option, Daten per SSH „abzuholen“, ist eine sehr nützliche Erweiterung, doch sollten Sie damit nicht den Zabbix-Agenten oder ein SNMP-Monitoring ersetzen. Einen Host per SSH zu überwachen, ist dann sinnvoll, wenn man den Zabbix-Agenten nicht installieren kann und man nur wenige Daten sammeln will. Dies kann zum Beispiel bei NAS Appliances sinnvoll sein. Oft verfügen NAS-Systeme und sonstige Appliances über einen SNMP-Agenten.

Je nach Umfang des Monitorings ist es erheblich performanter, Daten per SNMP als per SSH abzurufen. SNMP basiert auf UDP, und der Datenaustausch ist erheblich „schlanker“. Beim Monitoring per SSH muss das System bei jedem Abruf der Daten ein komplettes SSH-Login durchführen. Wählen Sie beim Anlegen von SSH-Items das Update-Intervall mit Bedacht aus.

Eine Überwachung per Telnet ist nur für Geräte empfehlenswert, die über keine andere Schnittstelle verfügen.

Bevor Sie SSH- oder Telnet-Items einrichten, sollten Sie sich folgende Probleme klarmachen:

  • Die Ausgabe von Programmen auf den entfernten Systemen kann je nach Distribution unterschiedlich sein. Besonders bei Embedded-Systemen sind nur abgespeckte Versionen von zahlreichen Programmen installiert.
  • Die Ausgabe von Programmen kann je nach eingestellter Standardsprache variieren. Dies ist besonders problematisch, wenn Sie mit grep nach Stichworten suchen.
  • Ein SSH- oder Telnet-Login dauert deutlich länger und verbraucht mehr Ressourcen als das Abfragen von Daten per Zabbix-Agent. Stellen Sie das Update-Intervall für SSH-Items also nicht zu klein ein.
  • Denken Sie an die Sicherheit! Über ein SSH- oder Telnet-Login ist ein Host in der Regel komplett fernsteuerbar. Wer also Kontrolle über den Zabbix-Server bekommt, kann sich auch auf den überwachten Hosts einloggen. Vermeiden Sie es, die SSH-Items mit dem Root-User einzurichten. Telnet ist ein unverschlüsseltes Protokoll, welches leicht abgehört werden kann.

Das Ausführen von Kommandos per Telnet setzt einen sogenannten Telnet-Prompt voraus. Nach dem Login muss der Telnet-Server einen Prompt ausgeben, der mit $, #, > oder % beginnt. Das Simulieren von zum Beispiel HTTP- oder SMTP-Verbindungen ist aus diesem Grund mit dem integrierten Telnet-Client nicht möglich. Wenn Sie HTTP- oder SMTP-Verbindungen per Telnet prüfen möchten, müssen Sie ein Skript anlegen und dieses als „external Skript“ einbinden (siehe External Checks).

Authentifizierung

Passwort

Wenn Sie ein SSH- oder Telnet-Item anlegen, müssen Sie festlegen, mit welchem Benutzerkonto sich der Zabbix-Server an dem überwachten Host anmelden soll. Das passende Passwort geben Sie im Klartext in die Webgui ein. Nach dem Speichern wird das Passwort ebenfalls im Klartext in der Datenbank gespeichert. Wenn Sie die Zabbix-Weboberfläche nicht per HTTPS verschlüsseln, können die eingegebenen Passwörter über das Netzwerk „abgehört“ werden. Wenn Sie Telnet einsetzen, kann das Passwort auch abgehört werden, während sich der Zabbix-Server auf dem entfernten Host anmeldet.

SSH-Keys

Als Alternative zur Authentifizierung per Passwort steht auch die Nutzung von SSH-Keys zur Auswahl. In der Konfiguration des Zabbix-Servers und der Proxys gibt es eine Option SSHKeyLocation. Diese ist in der Standardkonfiguration deaktiviert.

### Option: SSHKeyLocation
#       Location of public and private keys for SSH checks and actions.
#
# Mandatory: no
# Default:
SSHKeyLocation=/usr/lib/zabbix/ssh-keys

Erzeugen Sie nun ein neues Schlüsselpaar für Zabbix und einen Ordner, in dem Zabbix seine „known Hosts“ speichern kann:

ssh-keygen -t rsa -b 2048 -f /usr/lib/zabbix/ssh-keys/id_rsa
chown -R zabbix /usr/lib/zabbix/ssh-keys/
chmod 0600 /usr/lib/zabbix/ssh-keys/*
mkdir ~zabbix/.ssh
chown zabbix:zabbix ~zabbix/.ssh

Sie finden nun eine Datei id_rsa.pub im angegebenen Verzeichnis. Den Inhalt dieser Datei fügen Sie per SSH oder dem Kommando ssh-copy-id in die Datei ~/.ssh/authorized_keys auf dem Host ein, den Sie mit Zabbix per SSH überwachen wollen. Aus Sicherheitsgründen sollten Sie auf dem entfernten Host nicht den Root-Account verwenden. Legen Sie zum Beispiel einen unprivilegierten Benutzer „zabbix“ an. In manchen Fällen, zum Beispiel bei Embedded-Systemen von NAS-Geräten, können Sie keine Benutzer anlegen und müssen doch auf den Root- oder Admin-Account ausweichen.

Item anlegen

Ein Item vom Typ SSH oder Telnet legen Sie wie jedes andere Item an. Als Item-Key verwenden Sie immer telnet.run[description] bzw. ssh.run[description].

Im Feld Executed script geben Sie die Kommandos an, die auf dem entfernten Host ausgeführt werden. Ob Sie die Kommandos mit vollen Pfaden angeben müssen, hängt von der Umgebung ab, die der Zabbix-Server nach dem Login erhält. In der Regel ist ein sogenannter Pfad gesetzt.
Wenn Sie mehr als ein Kommando per Telnet ausführen, enthält die Rückgabe sowohl die Kommandos selbst als auch den Prompt. Wenn Sie zum Beispiel als Kommandos ausführen:

cat /etc/issue
uname -a

erhalten Sie als Rückgabe Folgendes:

cat /etc/issue
Debian GNU/Linux 6.0 \n \l

zabbix@zabbix:~$ uname -a
Linux zabbix 2.6.32-5-amd64 #1 SMP Tue Jun 14 09:42:28 UTC 2011 x86_64 GNU/Linux

Bei Verbindungen per SSH erhalten Sie nur die Ausgabe der Kommandos.

Setzen Sie den Type of Information zu Testzwecken auf Text, damit Sie den kompletten Rückgabewert sehen. Erst wenn Sie sichergestellt haben, dass die Rückgabe zum Beispiel nur aus einer Zahl ohne Prompt und sonstige unerwünschte Zeichen besteht, stellen Sie den Type auf Information auf Numeric oder Float um.

Es wird nur die Ausgabe von STDOUT zurückgegeben. Fehlermeldungen über STDERR werden nicht an den Zabbix-Server übertragen. Wenn Sie die möglichen Fehlermeldungen erhalten möchten, lenken Sie STERR nach STDOUT, /usr/bin/command 2>&1.

Information per SSH abholen

Optionen für Telnet- und SSH-Items

Die Items-Keys werden nach folgendem Schema aufgebaut:

ssh.run[<unique short description>,<ip>,<port>,<encoding>]
telnet.run[<unique short description>,<ip>,<port>,<encoding>]
  • Wenn Sie keine IP-Adresse angeben, wird die IP-Adresse oder der DNS-Name verwendet, der in der Hostkonfiguration hinterlegt wurde.
  • Wenn die Verbindung nicht über die Standardports 22 bzw. 23 erfolgen soll, können Sie dies als Option ebenfalls angeben.
  • Sollte die Rückgabe Sonderzeichen enthalten, können Sie das Encoding angeben, von dem der Zabbix-Server die Rückgabe nach UTF-8 konvertiert.

Beispiel: Embedded-Linux-Systeme überwachen

Viele Geräte wie zum Beispiel NAS-Systeme basieren auf einem Linux-Betriebssystem und verfügen standardmäßig über einen SSH-Zugang. Da die meisten Geräte mit einem sehr eingeschränkten minimalen Betriebssystem auf Basis einer ARM-Architektur funktionieren, ist die Installation des Zabbix-Agenten schwierig bis unmöglich. Doch per SSH kommt man ohne großen Aufwand an die wichtigsten Kennwerte heran.

Erzeugen Sie wie zuvor beschrieben ein SSH-Schlüsselpaar auf dem Zabbix-Server. Den öffentlichen Schlüssel transferieren Sie anschließend auf das NAS-Gerät wie folgt:

root@zabbix:~# ssh-copy-id -i /usr/lib/zabbix/ssh-keys/id_rsa.pub admin@192.2.0.17
The authenticity of host '192.2.0.17 (192.2.0.17)' can't be established.
RSA key fingerprint is e0:a4:06:05:a6:9f:82:67:25:10:ff:86:26:65:a4:78.
Are you sure you want to continue connecting (yes/no)? yes
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
admin@192.168.152.17's password: 

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh 'admin@192.2.0.17'"
and check to make sure that only the key(s) you wanted were added.

Anschließend prüfen Sie auf der Kommandozeile, ob der Benutzer Zabbix ohne Eingabe eines Passworts per SSH-Kommandos auf dem NAS ausführen kann. Wenn Sie nicht als Zabbix-Benutzer eingeloggt sind, wechseln Sie zuerst den Benutzer:

root@zabbix:~# su - zabbix -s /bin/bash
zabbix@zabbix:~$ ssh -i /usr/lib/zabbix/ssh-keys/id_rsa admin@192.2.0.17 /bin/date

Die Frage, ob Sie den Fingerabdruck des entfernten Systems akzeptieren sollen, bejahen Sie.
Wenn der Test auf der Kommandozeile erfolgreich war, können Sie den Host anlegen. Für die Überwachung per SSH wird das Standard-Host-Interface (Agent interface) verwendet. Lassen Sie sich von der Angabe Port=10050 nicht verwirren. Tragen Sie nicht Port 22 ein! Für die SSH-Verbindung wird diese Angabe ignoriert. Einen abweichenden SSH-Port geben Sie wenn nötig als Option im Item-Key an.
Sobald Sie den Host angelegt haben, können Sie ein Item vom Typ „SSH Agent“ anlegen. Wenn Sie wie in diesem Beispiel den Benutzernamen „admin“ für die SSH-Verbindung verwenden möchten, geben Sie dies im Feld „User name“ an. Als Key-Files geben Sie die zuvor im Verzeichnis /usr/lib/zabbix/ssh-keys/ angelegten Dateien an.
Für einen ersten Test können Sie auf dem entfernten Host das Kommando cat /proc/loadavg |cut -d " " -f2 ausführen, welches die durchschnittliche Prozessorlast der letzten fünf Minuten liefert.

Überwachung der Prozessorauslastung per SSH auf einem Embedded-System

Nützliche Kommandos

Load Average 1min/5min/15min

cat /proc/loadavg |cut -d " " -f1
cat /proc/loadavg |cut -d " " -f2
cat /proc/loadavg |cut -d " " -f3

Empfangene Bytes auf Device eth0

cat /proc/net/dev|grep eth0|awk '{print $2}'

Gesendete Bytes auf Device eth0

cat /proc/net/dev|grep eth0|awk '{print $10}'

Freier Festplattenspeicher in Kilobytes auf Mountpoint / (Use custom multiplier 1024)

df -k|grep "/$"|awk '{print $4}'

Freier Festplattenspeicher in Prozent auf Mountpoint /

df|grep "/$"|awk '{print $5}'|tr -d "%"

Anzahl laufende Prozesse eines Programms, zum Beispiel

pgrep zabbix_server|wc -l

Die Optionen von pgrep können je nach Distribution variieren. Debian versteht zum Beispiel

pgrep -c zabbix_server

Red Hat und CentOS kennen die Option „-c“ nicht. Einige Systeme verfügen gar nicht über das Kommando pgrep. Alternativ können Sie einen Prozess auch mit folgendem Kommando überwachen:

ps|grep "/usr/local/apache/bin/apache"|grep -c -v "grep"

Freier Hauptspeicher in Prozent

free |grep "Mem:"|awk '{print ($4+$6)/($2/100)}'

Rückgabe von zwei Kommandos ohne Zeilenumbruch

(hostname;uname -m)|xargs echo -n
Dank SSH kommt der Zabbix-Server auch ohne seinen Agenten an viele Informationen.