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.
Ein Gedanke zu „Icinga2 check by ssh“