Vérifier la péremption d'un enregistrement DNSSEC

Pour tout enregistrement DNS signé par DNSSEC on trouvera deux dates, une de début et une de fin, permettant de vérifier la validité de la signature. Malheureusement, ces dates sont données en ordre inverse (fin et début) et dans un format d'horodatage qui n'est pas toujours facile à lire (année, mois, date, heure, minutes et secondes le tout accolé). Il peut donc être utile de prendre un peu de temps et utiliser quelques commandes afin d'obtenir un affichage "humain".

Soit le domaine example.net. En temps normal, pour vérifier l'enregistrement de la zone et ses signatures DNSSEC, vous appelez la commande dig :

dig +dnssec SOA example.net

Le résultat est de la forme suivante (restreint à la section qui nous intéresse) :

example.net. 86400 IN RRSIG SOA 5 2 86400 20120211014118 20120112014118 13866 example.net. Esalge0xNt7+L+x4Exu3gkd4MRKdDH4frjWGTMp1QPKkS+HuLqsACdK4 Bz09qBdkOo1Z3YFkAunsQji75zwdrMqGEn03CsCRBbcaxtWgL7OqjGUN suLcX/sEMT4yD9Oxtrlyva7lVfr4Ih834L85JtlQjmx7t9svX3uvZjjd 21A=

Les champs qui nous intéressent sont 20120211014118 pour la date de fin et 20120112014118 pour la date de début.

Afin d'isoler cette ligne parmi les autres on pourra utiliser la commande grep avec le motif de recherche RRSIG[[:space:]]SOA c'est à dire le mot RRSIG séparé par un ou plusieurs espaces du mot SOA.

cut nous permet de choisir un champ parmi cette ligne, le sixième pour la date de début, le cinquième pour la date de fin (les champs sont séparés par des espaces uniques et le compte commence à zéro).

startDate=$(dig +dnssec SOA example.net | grep RRSIG[[:space:]]SOA | cut -d" " -f6)

L'affichage de la date lui même peut se faire avec la commande éponyme mais reste à séparer les valeurs numériques selon leur signification pour obtenir une date compréhensible. date autorise certains formats de représentation, mais le fait d'avoir une date et une heure dans une chaîne telle que dig le propose n'est pas accepté...

Pour cela c'est la commande sed qui nous sera utile, elle permet d'insérer des caractères entre certaines séquences. Nous avons besoin de séparer un bloc de huit chiffres pour le jour et trois groupes de deux chiffres pour les heures, minutes et secondes (qui seront séparés par le caractère deux points). C'est à dire que depuis la valeur 20120211014118 nous souhaitons obtenir 20120211 01:41:18.

La syntaxe de sed reste toujours un peu mystérieuse, mais l'incantation suivante fonctionne : on substitue des sous-groupes repérés par longueur en insérant les caractères voulus.

startDate=20120211014118
startDate=$(echo $startDate | /bin/sed 's/^\(.\{8\}\)\(.\{2\}\)\(.\{2\}\)\(.\{2\}\)/\1 \2:\3:\4/')

Et en renvoyant le tout à la commande date avec un format personnalisé vous arriverez à vos fins :

date --date "$(echo $startDate)" +"%Y %B %d %H:%M:%S"

Vous obtiendrez l'affichage final : 2012 Janvier 12 01:41:18.

Le format retenu conserve l'ordre des informations et donne le nom complet du mois pour éviter toute ambiguïté.

Reste à regrouper toutes ces commandes dans un script pour vérifier la validité des signatures du domaine que vous gérez.

publié le 10 mars 2012