Comment configurer DNSSEC pour Bind (named)

DNSSEC est une extension du protocole DNS qui sécurise la résolution de noms de domaine. Il y a une ébauche d’explication en français sur Wikipedia, mais pour des infos plus consistantes rendez-vous sur la page en anglais.

La configuration est un peu compliquée ; il faut créer une clef pour signer la zone (Zone Signing Key, ZSK), une clef pour signer la clef (Key Signing Key, KSK), ajouter ces clefs au fichier de zone (Zone file). Comme ce fichier est modifié, il faut incrémenter son numéro de série (Serial).

Ensuite il faut signer la zone, configurer Bind pour utiliser le fichier signé au lieu du fichier original, relancer Bind et… attendre.

Quand le ou les DNS secondaires sont à jour, il faut déclarer la clef KSK à la zone parent, ce qui se fait généralement chez le registrar.

Voici un script qui effectue la plupart des opérations, mais s’arrête juste avant la mise en œuvre.

Il ouvre named.conf dans Vim à la ligne à mettre à jour éventuellement. Le fichier signé a le même nom que le fichier d’origine suivi de .signed.

Le script est à vérifier et à adapter. En particulier, les utilitaires Unix/Linux peuvent différer d’un système à l’autre et certaines options peuvent ne pas exister. ZSU est un script Perl qui incrémente le numéro de série.

#!/bin/bash
 
DOMAIN=6502.fr
ZONEDIR=/var/named/run-root/var
ZONEFILE=$DOMAIN
 
# All files must be in Zone directory
# Beware, named is chrooted
cd $ZONEDIR
 
# ZSU - update serial numbers in DNS zone files
# http://search.cpan.org/~azs/zsu-1.20/zsu
ZSU=/root/zsu
 
# Generate ZSK file
ZSK=`dnssec-keygen -a RSASHA1 -b 1024 -r /dev/urandom -n ZONE $DOMAIN`
ZSK_PUBLIC=${ZSK}.key
 
# Generate KSK file
KSK=`dnssec-keygen -a RSASHA1 -b 2048 -r /dev/urandom -n ZONE -f KSK $DOMAIN`
ID=${KSK/?*+}
KSK_PUBLIC=${KSK}.key
FLAG=`awk '{print $4}' $KSK_PUBLIC`
ALGO=`awk '{print $6}' $KSK_PUBLIC`
 
# Add keys to zone file after removing old keys
sed -i.bak -e "/K${DOMAIN}/d" $ZONEFILE
echo "\$include $ZSK_PUBLIC" >> $ZONEFILE
echo "\$include $KSK_PUBLIC" >> $ZONEFILE
# Increment Serial
$ZSU $ZONEFILE
 
# Sign the zone, validity is 1 year (31556926 seconds)
dnssec-signzone -e now+31556926 -p -g -k $KSK_PUBLIC -o $DOMAIN $ZONEFILE $ZSK_PUBLIC
 
# Edit named.conf to use ZONEFILE.signed
/usr/bin/vim /etc/named.conf "+/file .*$DOMAIN"
 
# Print info to configure the parent zone
echo "Id:    $ID"
echo "Flag:    $FLAG"
echo "Algorithm: $ALGO"
echo "Public key:"
cut -d" " -f7- $KSK_PUBLIC

À faire à la main

  • Relancer bind
/etc/init.d/named restart
  • Déclarer la clef dans la zone parent (le script imprime les paramètres à déclarer).