Publié le 14 novembre 2018
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 :
DNS=$1
: Le premier paramètre passé au script est le
DNS à tester. C’est le seul paramètre obligatoireIP=${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
commandeopenssl s_client -servername $DNS -connect $IP:$PORT
:
Affiche tous les détails du certificat SSL2>/dev/null
: n’affiche pas les erreurs, s’il y en
a. La gestion des erreurs se fera plus tardopenssl 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
courantecut -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 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 chargeType of information
:
Numeric (unsigned)
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 se paramètre comme suit :
Ici j’utilise une opération mathématique entre deux valeurs. Il y a trois paramètres importants :
{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 actuelle2592000
: Le délai en secondes avant de générer
l’alerte. Ça corresponds à 30 joursDonc, 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.