SSL Zertifikate monitoren mit Bash
Damit wir im Monitoring-Tool sehen können, ob und wann ein SSL-Zertifikat abläuft, wurde ein Script zur Ermittlung des Ablaufdatums geschrieben. Im Vergleich zu anderen Checks, kann dieses Script nicht nur Zertifikate via HTTPS prüfen.
Hier findest du eine Beschreibung, wie das Ablaufdatum eines SSL Zertifikats geholt wird.
openssl s_client -servername "${HOST}" -connect "${HOST}":"${PORT}" 2>&- | openssl x509 -enddate -noout
Damit überhaupt eine Verbindung zu einem SSL Host gemacht werden kann, braucht man zuerst einen SSL client. Hier wird der s_client von OpenSSL verwendet, welcher auch TLS beherrscht. Der s_client dient allgemein zum Diagnostizieren und Debuggen von SSL/TLS Zertifikaten.
servername
Über den Parameter “servername” kann man verifizieren, dass das richtige Zertifikat benützt wird, falls ein Server über VHosts mehrere SSL Zertifikate hat.
Dies geschieht über SNI (Server Name Indication).
connect
Hier geschieht die Verbindung zum Host über den Hostname und Port.
openssl x509 -enddate -noout
Nun wird das x509 Zertifikat ausgelesen und durch die Parameter “enddate” und “noout” wird das Ablaufdatum ausgegeben respektive dass das Zertifikat nicht nach Datum XY gültig ist. Durch “noout” wird der restliche Output verhindert.
Alarm, Alarm!
Das Ziel war es selbst bestimmen zu können, wie und wann Nagios / Icinga alarmiert. Damit Nagios / Icinga alarmiert braucht es den Error Status Code 2. Error Codes:
- 1 – Warning
- 2 – Critical
0 ist natürlich OK. Es werden Parameter zum Einstellen der Warning- und Critical-Werte vergeben. Standartwerte sind:
- Warning=30 (Tage)
- Critical=5 (Tage)
Das Ablaufdatum wird mit dem aktuellem Datum verglichen, so ist erkennbar, wie viele Tage man noch hat bis das Zertifikat abläuft.
Das Monitoring Script ist auf GitHub verfügbar.
Integration ins Monitoring
Das Script wird bei uns als Icinga Plugin ausgeführt.
Commands sind im configfile “/etc/icinga/icinga.cfg” definiert bzw. es ist beschrieben wo diese definiert sind.
Untenstehend der Auszug aus der Icinga-Konfiguration:
define command {
command_name check _ssl
command_line /bin/bash $USER1$/check_ssl.sh -H $ARG1$ -p $ARG2$ -P $ARG3$ -w $ARG4$ -c $ARG5$
}
Die $ARG$ Variablen werden dann durch eine Service Definition gegeben, welche sich standartmässig in /etc/icinga/objects/services_icinga.cfg befindet.
So wird der SSL Check Service für einen Host definiert:
define service {
use template-service
host_name Hostname (e.g. adfinis.com)
service_description check_ssl
max_check_attempts 5
check_interval 360
retry_interval 1
check_command check _ssl!'adfinis.com'!'443'!'no_tls'!'30'!'5'
}
Bei der check_command Zeile werden die $ARG$ Variablen durch Ausrufezeichen getrennt und werden danach auch in dieser Reihenfolge vergeben. Das heisst:
- adfinis.com = $ARG1
- 443 = $ARG2$
- no_tls = $ARG3$
- 30 = $ARG4$
- 5 = $ARG5$