SSL Zertifikate monitoren mit Bash

certcheck

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-sygroup.ch)
        service_description             check_ssl
        max_check_attempts              5
        check_interval                  360
        retry_interval                  1
        check_command                   check _ssl!'adfinis-sygroup.ch'!'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-sygroup.ch = $ARG1
  • 443 = $ARG2$
  • no_tls = $ARG3$
  • 30 = $ARG4$
  • 5 = $ARG5$

Links