lalahop

On a deux instances d'OpenDNSSEC, instance A et instance B, sur deux machines différentes. L'instance A signe déjà 4 zones. L'instance B, une seule. On souhaite factoriser et garder une seule instance OpenDNSSEC, c'est-à-dire basculer la zone de l'instance B vers l'instance A. Le serveur DNS qui fait autorité sur la zone ne change pas, lui, seule l'instance OpenDNSSEC derrière change.

Évidemment, durant cette transition, il ne faut pas casser (même temporairement) la chaîne de confiance ni faire un roulement des clés (le roulement planifié ayant eu lieu récemment, cette solution serait possible mais sans intérêt) sinon c'est trop facile et ce n'est pas fun.

Table des matières

Export des paires de clés (KSK et ZSK) depuis l'instance source (B)

La première étape est d'exporter les clés privées associées à la zone depuis le HSM (softhsm) de l'instance B. La documentation se trouve ici : Key Management - SoftHSM Documentation v1.3 mais elle est un peu rustique et incomplète donc on va faire ça ensemble. 🙂

softhsm --export guiguishow.info-ksk.pem --slot 0 --pin <user_pin> --id <CKA_ID>
The key pair has been written to guiguishow.info-ksk.pem

Pour le paramètre « --pin », il faut indiquer le « USER PIN » de votre SoftHSM. On le trouve dans /etc/opendnssec/conf.xml, au cas où 😉 .

Pour le paramètre « --id », il faut indiquer le CKA_ID de la clé à exporter. Pour rappel, on l'obtient avec la commande :

ods-ksmutil key list --verbose

Pour la ZSK, c'est la même commande, seuls l'ID et le fichier de destination changent.

On transfert les clés de manière sécurisée entre les machines (scp, par exemple).

Ajout de la zone à l'instance de destination (A)

Dans la section « Enforcer » du fichier /etc/opendnssec/conf.xml, on décommente « <ManualKeyGeneration/> ». Le but étant qu'OpenDNSSEC ne génère pas automatiquement les deux paires de clés lors de l'ajout de la zone car c'est un peu la galère pour supprimer des clés (SoftHSM + OpenDNSSEC).

On fait prendre en compte cette modification :

service opendnssec-enforcer force-reload

On ajoute la zone comme d'habitude : politique (si besoin est) dans /etc/opendnssec/kasp.conf et la définition de la zone dans /etc/opendnssec/zonelist.xml. On reprend tout de l'autre instance. On n'oublie pas de mettre le fichier de zone non signé à l'emplacement que l'on a indiqué dans « <Input></Input> ».

On fait prendre en compte l'ajout de la zone :

ods-ksmutil update kasp [uniquement si vous avez modifié kasp.conf]
ods-ksmutil update zonelist

Import des paires de clés (KSK et ZSK) sur l'instance de destination (A)

On commence par la KSK :

softhsm --import guiguishow.info-ksk.pem --slot 0 --label "<CKA_ID>" --id "<CKA_ID>" --pin <user_pin>

On reprend le même CKA_ID, c'est-à-dire celui que la clé avait sur l'autre instance. Le pin est toujours l'user pin mais de la nouvelle instance, of course. 😉

Pour la ZSK, c'est la même commande, seuls l'ID, le label et le fichier source changent.

Association des clés (KSK et ZSK) à la zone sur l'instance de destination (A)

La documentation se trouve ici : ods-ksmutil - OpenDNSSEC Documentation. Pour des exemples pratiques (pour comprendre la syntaxe des valeurs à passer aux différents paramètres, par exemple) : OpenDNSSEC training (page 22).

Import de la KSK :

ods-ksmutil key import --cka_id "<CKA_ID>" --repository <nom_repository> --zone <nom_zone> --bits 2048 --algorithm 8 --keystate ACTIVE --keytype KSK --time <datetime_passage_à_l'état_ACTIVE>

On reprend toujours le même CKA_ID. La valeur du paramètre « --repository » est le nom donné à votre HSM dans /etc/opendnnsec/conf.xml (« SoftHSM » par défaut). Les paramètres de la clé (taille, algorithme cryptographique) sont indiqués dans kasp.conf.

La date et l'heure du passage de cette clé à l'état « active » peut être trouvé dans la base de données SQLite de l'ancienne instance (B). Non, je n'ai pas trouvé une manière plus conviviale de faire cela.

# sqlite3 /var/lib/opendnssec/db/kasp.db
sqlite> select HSMkey_id,active from dnsseckeys inner join keypairs on keypairs.id = dnsseckeys.keypair_id;

Comme indiqué dans le PDF d'exemples, le format de la valeur de ce paramètre est : AAAAMMDDHHMMSS.

Pour la ZSK, il faut suivre la même procédure, seuls « CKA_ID », la taille de la clé et la datetime de création changent et « --keytype KSK » devient « --keytype ZSK ».

Évidemment, il est possible de faire la transition d'une instance d'OpenDNSSEC à une autre alors que les clés sont dans un autre état que « active ». Il faut alors adapter le paramètre « --keystate ». Je ne recommande pas cela à cause des timings, toussa.

Maintenant, il faut nettoyer les états associés à la zone. Sans cela, l'auditeur (ods-auditor) retournera une erreur « Key (xxx) has gone straight to active use without a prepublished phase » dans les logs qui bloquera le processus de signature (c'est le principe d'un auditeur en même temps : vérifier que tout est cohérent avant de signer 😛 ) et ça serait dommage de désactiver l'auditeur pour si peu.

ods-signer clear <nom_zone>
rm /var/lib/opendnssec/tmp/tracker/<nom_zone>* /var/lib/opendnssec/tmp/<nom_zone>.* /var/lib/opendnssec/signconf/<nom_zone> /var/lib/opendnssec/signed/<nom_zone>

On peut désormais réactiver la génération automatique des paires de clés pour les zones en re-commentant « <ManualKeyGeneration/> » dans la section « Enforcer » du fichier /etc/opendnssec/conf.xml.

On fait prendre en compte les changements :

ods-control stop && ods-control start

Maintenant, la commande « ods-ksmutil key list --verbose » doit vous montrer une KSK et une ZSK pour votre zone avec une datetime de transition identique à l'ancienne instance (B) et votre zone doit être signée.

Divers

Si vous avez mis de mauvaises clés dans le SoftHSM ou de mauvais paramètres dans OpenDNSSEC, il est possible de les effacer afin de pouvoir recommencer (sinon les ID identiques empêchent cela) :

# Effacer une clé dans le SoftHSM
ods-hsmutil remove <CKA_ID> 
   OU
pkcs11-tool --module /usr/lib/softhsm/libsofthsm.so -b -d <CKA_ID> -y privkey --login --pin=<USER_PIN> --slot 0
 
# Effacer une clé dans OpenDNSSEC
# sqlite3 /var/lib/opendnssec/db/kasp.db
sqlite> select id from keypairs where HSMKey_id="<CKA_ID"; [notez l'ID]
sqlite> delete from keypairs where id=<ID_noté_ci_dessus>;
sqlite> delete from dnsseckeys where keypair_id=<ID_noté_ci_dessus>;

Note : l'outil pkcs11-tool se trouve dans le package opensc sous Debian. Il permet également de lister les clés présentes dans un slot (la sortie de cette commande est complémentaire à celle de la commande « ods-hsmutil list ») :

pkcs11-tool --module /usr/lib/softhsm/libsofthsm.so --list-objects --slot 0 --login --pin=<USER_PIN>

Supprimer une zone (n'affecte pas les clés dans la base de données SQLite d'OpenDNSSEC) :

ods-ksmutil zone delete -z <nom_zone>

Les commentaires sont fermés