Zabbix : superviser la fin de validité d’un certificat SSL

Publié le 14 November 2018

Le script

Pour superviser les certificats SSL, je vais utiliser l’external script sslenddate.sh suivant :

#!/bin/bash

# Affiche le timestamp correspondant à la fin de date de validité d'un certificat SSL

# Initialise les paramètres par défaut
DNS=$1         # DNS correspondant au vhost testé. Ce paramètre est obligatoire
IP=${2:-$DNS}  # IP du serveur testé. Si ce paramètre est manquant il prends la même valeur que $DNS
PORT=${3:-443} # Port du service testé. Si ce paramètre est manquant il prends la valeur par défaut 443

# Récupère la date de fin de validité du certificat, avec un résultat sous une forme du type : Feb 14 08:21:55 2019 GMT
ENDDATE=`echo | openssl s_client -servername $DNS -connect $IP:$PORT 2>/dev/null | openssl x509 -noout -enddate 2>&1 | cut -d '=' -f 2`

# Convertit la date en timestamp. Si ça échoute, retourne le timestamp actuel de manière à générer une alerte.
date -d "$ENDDATE" +%s 2>/dev/null || date +%s

exit 0

Ce script est à déployer sur le proxy Zabbix ou sur le master, dans le dossier des external scripts (valeur ExternalScripts dans le fichier zabbix_server.conf).

Il faut aussi rendre le script exécutable (chmod +x sslenddate.sh) et s’assurer que Zabbix ait les droits dessus (chown zabbix: sslenddate.sh).

Fonctionnement du script :

On pourra remarquer ici l’utilisation de conditions ternaires en Bash. C’est bien plus court que de faire une série de if pour initialiser les variables.

openssl sépare l’IP de serveur de son DNS. Il est donc indispensable de séparer ces deux paramètres.

ENDDATE=`echo | openssl s_client -servername $DNS -connect $IP:$PORT 2>/dev/null | openssl x509 -noout -enddate 2>&1 | cut -d '=' -f 2` # Récupère la date de fin de validité du certificat, avec un résultat sous une forme du type "Feb 14 08:21:55 2019 GMT"

La ligne précédente est un enchaînement de commandes via des pipes. En voici une analyse détaillée :

À ce moment du script, la variable $ENDDATE doit contenir quelque chose du type Feb 14 08:21:55 2019 GMT. Ce format est très compliqué à traiter avec Zabbix. Je vais donc le convertir en timestamp

date -d "$ENDDATE" +%s 2>/dev/null || date +%s # Convertit la date en timestamp et l'affiche. Si ça échoue, affiche le timestamp actuel de manière à générer une alerte

Le résultat du script :

$ sh sslenddate.sh palc.fr 172.16.0.166 443 15:35
1550132515

Le timestamp 1550132515 correspond au 14 février 2019, ce qui correspond bien a la date de fin de validité du certificat actuel.

Si je fais un test invalide, j’obtiens le timestamp actuel :

$ sh sslenddate.sh example.com 92.243.24.84 443
1543415837

Ça permets de générer automatiquement une alerte si la date de fin de validité du certificat ne peut pas être déterminée.

L’item Zabbix

L’item Zabbix se paramètre comme suit :

Les paramètres importants sont :

Cet item retourne le timestamp correspondant à la fin de validité du certificat SSL.

Le trigger Zabbix

Le trigger Zabbix se paramètre comme suit :

Ici j’utilise une opération mathématique entre deux valeurs. Il y a trois paramètres importants :

Donc, si la date d’expiration du certificat est inférieure à la date actuelle plus trente jours, le trigger génère une alerte.

Il est possible de modifier le délai, ou de mettre plusieurs triggers avec des délais et des niveaux de sévérité différents, si besoin.