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

Le script

Pour superviser les certificats SSL, je vais utiliser l’external script 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
sslenddate.sh

Se 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 :
DNS=$1 : Le premier paramètre passé au script est le DNS à tester. C’est le seul paramètre obligatoire
IP=${2:-$DNS} : Le deuxième paramètre est l’IP sur laquelle se trouve le domaine à tester. Si ce paramètre est manquant, il prends la même valeur que $DNS
PORT=${3:-443} : Le troisième paramètre est le port sur lequel se trouve le domaine à tester. Si ce paramètre est manquant, il prends la valeur par défaut 443
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 :

  • echo | : Sert à envoyer une commande vide à openssl. Sinon, il va attendre indéfiniment que l’utilisateur n’entre une commande
  • openssl s_client -servername $DNS -connect $IP:$PORT : Affiche tous les détails du certificat SSL
  • 2>/dev/null : n’affiche pas les erreurs, s’il y en a. La gestion des erreurs se fera plus tard
  • openssl x509 -noout -enddate : n’affiche que la date de fin de validité du certificat, sous un format du type « notAfter=Feb 14 08:21:55 2019 GMT »
  • 2>&1 : Redirige les erreurs sur la sortie courante
  • cut -d '=' -f 2 : Supprime tout ce qui se trouve avant le premier « = », pour ne conserver que la date. À 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 :

      • Type : External Check
      • Key : sslenddate.sh[palc.fr,92.243.24.84,443]palc.fr correspond au DNS à tester, 92.243.24.8 à l’IP du serveur et 443 au port HTTPS. Seul le premier paramètre est obligatoires. Les deux derniers servent pour des cas spécifiques, par exemple si le certificat est sur plusieurs serveurs différents derrière un répartiteur de charge
    • Update interval (in sec) : 86400 ⇒ le test sera fait une fois par jour.

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 valeurs importantes :

  • {SV-TCA-EXCDGF03:sslenddate.sh[palc.fr,92.243.24.84,443].last(0)} : Le timestamp d’expiration du certificat SSL
  • {SV-TCA-EXCDGF03sslenddate.sh[palc.fr,92.243.24.84,443].now(0)} : La date actuelle
  • 2592000 : Le délai en secondes avant de générer l’alerte. Ça corresponds à 30 jours

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.