Icinga2 check by ssh

Neben dem Agenten, der für die Ausführung der Checks beim Client verantwortlich ist, gibt es auch noch den Check über ssh(check_by_ssh). Im Gegensatz zum Agent muss hierbei nicht eine Icinga Instanz auf dem Remote Host laufen. Die Plugins, bzw. die Checks sollten trotz-alledem auf dem Client vorhanden sein. Die Ausführung läuft dabei über den Port 22(ssh) und nicht wie beim Agent auf Port 5665. Der ssh Port ist meistens schon geöffnet, daher muss auch keine weitere Portfreigabe in der Firewall eingerichtet werden. 

Damit die Plugins auf dem Client vorhanden sind, installieren wir diese. 

root@client:~ sudo apt install nagios-plugins

Icinga führt die checks über ssh aus und dies verlangt im Normalfall das Passwort vom Benutzer, mit dem wir uns anmelden wollen. Dies umgehen wir, indem wir ein privaten Schlüssel erzeugen und den öffentlichen Schlüssel mit dem Client teilen. Der User, mit dem die Icinga Instanz läuft, muss auch auf dem Remote Host angelegt werden. Ermitteln wir die laufenden Icinga Prozesse, sehen wir, dass unsere Instanz mit dem nagios Benutzer läuft.

pi@server:~ $ ps -aux | grep -i icinga
pi         725  0.0  0.0   7360   540 pts/0    S+   08:13   0:00 grep --color=auto -i icinga
nagios   26752  0.9  0.6  80788 24492 ?        Ssl  Aug01   7:31 /usr/lib/arm-linux-gnueabihf/icinga2/sbin/icinga2 --no-stack-rlimit daemon --close-stdio -e /var/log/icinga2/error.log
nagios   26790  0.1  0.1  57556  5796 ?        S    Aug01   1:32 /usr/lib/arm-linux-gnueabihf/icinga2/sbin/icinga2 --no-stack-rlimit daemon --close-stdio -e /var/log/icinga2/error.log
postgres 26820  0.3  0.6 206692 24996 ?        Ss   Aug01   3:01 postgres: 11/main: rtf icinga_ido ::1(40910) idle in transaction

Legen wir diesen Benutzer nun auf dem Client an.

root@client:~ useradd -m nagios
root@client:~ passwd nagios

Um weiter fortfahren zu können, müssen wir uns als nagios auf dem Server anmelden. Der Shell Zugriff ist aber meist für diesen Benutzer gesperrt, sodass wir eine Fehlermeldung bekommen sollten. Falls eine ähnliche Nachricht wie “This account is currently not available.” kommt, müsst ihr den Benutzer noch für die Shell freischalten. Ersetzt dafür in der /etc/passwd “/usr/sbin/nologin” mit “/bin/bash”.

root@server:~ grep nagios /etc/passwd
nagios:x:110:115::/var/lib/nagios:/usr/sbin/nologin

root@server:~ vi /etc/passwd

root@server:~ grep nagios /etc/passwd
nagios:x:110:115::/var/lib/nagios:/bin/bash

Nun sollte ein Login möglich sein.

root@server:~ sudo su - nagios

Falls der Login erfolgreich war, können wir das Schlüssel Paar anlegen.

nagios@server:~$ ssh-keygen -b 4096 -t rsa -C "nagios@$(hostname) user for check_by_ssh" -f $HOME/.ssh/id_rsa

Von dem erzeugten Schlüsselpaar müssen wir den öffentlichen Schlüssel zum Client übertragen. Dies könnt ihr manuell machen oder mit ssh-copy-id, den wir hier soweit benutzen. In diesem Zusammenhang werden wir einmal nach dem Passwort abgefragt, damit der Schlüssel übertragen werden kann.

nagios@server:~$ ssh-copy-id -i $HOME/.ssh/id_rsa nagios@client
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/var/lib/nagios/.ssh/id_rsa.pub"
/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


nagios@client's password: 

Number of key(s) added: 1

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

Da wir den “server” nun als autorisierten Schlüssel beim Client eingetragen haben, sollte der Login ohne Passwort erfolgen.

nagios@server:~ ssh nagios@client

Sind wir erfolgreich angemeldet, können wir uns vom Client wieder abmelden. Entfernen wir nun wieder den Zugriff auf die Shell für den nagios Benutzer auf dem Server. Das Passwort sperren wir ebenfalls, dass es nicht mehr geändert werden kann.

root@server:~ vi /etc/passwd

root@server:~ grep nagios /etc/passwd
nagios:x:110:115::/var/lib/nagios:/usr/sbin/nologin

root@server:~ passwd -l nagios

Icinga2 Service + Host einrichten

Wir sind nun fast am Ende, allerdings fehlt noch der Service und die Änderungen am Host. Ein Service könnte unter in etwa so aussehen, das ist soweit euch überlassen:

apply Service "users" {
  import "generic-service"
  check_command = "by_ssh"

  vars.by_ssh_command = [ "/usr/lib/nagios/plugins/check_users" ]

  // Follows the same principle as with command arguments, e.g. for ordering
  vars.by_ssh_arguments = {
    "-w" = {
      value = "$users_wgreater$" // Can reference an existing custom variable defined on the host or service, evaluated at runtime
    }
    "-c" = {
      value = "$users_cgreater$"
    }
  }

  vars.users_wgreater = 3
  vars.users_cgreater = 5

  assign where host.vars.os == "Linux" && host.vars.agent_type == "ssh"
}

Für die Client-Host Datei legen wir noch die Variable vars.agent_type an und setzten den Wert “ssh”, damit dieser zum Service verknüpft wird.

object Host "client" {
        import "generic-host"
        vars.agent_type = "ssh"
        address = "192.168.188.37"
        check_command = "hostalive"
        vars["os"] = "Linux"
        version = 1596120607.191147
        zone = "raspberrypi"
}

Zu guter letzt legen wir noch einen Endpoint für den Client in der zones.conf an. Damit sollte der Icinga Master/Satellite seine Abfragen an den Endpoint schicken.

object Endpoint "client" {
host = "192.168.188.37"
}

object Zone "client" {
parent = NodeName
endpoints = [ "client" ]
}

Die Einrichtung ist nun komplett abgeschlossen. Falls alles funktioniert hat, sollte nun ein weiterer Service für den Client in icinga2web zu sehen sein.

icinga checkbyssh

Ein Gedanke zu „Icinga2 check by ssh

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert