Migrer de Bind à PowerDNS

Après avoir utilisé Bind pendant des années, l'absence de support simple de DNSSEC par Bind dans Debian 8 m'a fait passer à PowerDNS. Petit guide de migration.

Comme toujours, ce guide est plus centré pour les distrubutions Debian et dérivée, mais peut être adapté à d'autres.

Installation

PowerDNS est séparé en deux paquets, pdns-server et pdns-recursor, le premier est le serveur DNS alors que le second est le récurseur DNS, il est conseillé de ne pas installer les deux sur la même machine, même si cela est possible.
Vous devrez également installer le paquet pdns-backend-$BACKEND en fonction du système de backend de stockage des données que vous souhaitez utiliser, ici nous utiliserons MySQL, il nous faudra donc installer pdns-backend-mysql

# apt-get install pdns pdns-recursor pdns-backend-mysql

Préparation

Désactiver DNSSEC sur Bind

Afin de migrer, il est nécessaire de désactiver temporairement DNSSEC sur votre installation de Bind, ceci vous évitera d'avoir des informations DNSSEC inutiles dans la base de données de PowerDNS, celui-ci n'en ayant pas besoin pour utiliser DNSSEC de son coté.
Le plus simple pour se faire est d'avoir gardé une version non DNSSEC à jour de vos fichiers de zones et de changer leur numéro de version avant de relancer BIND.

  1. Editez la configuration de BIND afin que vos zones n'utilisent plus les fichiers de zones signées.
  2. Modifiez le numéro de version de vos fichiers de zones non signées.
  3. Relancez BIND.

Créer la base de données pour PowerDNS

Nous utiliseront ici MySQL comme backend pour stocker nos informations de zones, connectez-vous à MySQL par votre moyen préféré (ligne de commande ou PHPMyAdmin) et créez un utilisateur et une base de données pour PowerDNS. Donnez à l'utilisateur créé les droits sur cette base de données.

Pour créer la base manuellement :

mariadb> CREATE DATABASE pdns;
mariadb> GRANT ALL ON pdns.* TO 'pdns'@'localhost' IDENTIFIED BY 'pdnspassword';

Puis, une fois la base de données créée, la structurer comme suit :

mariadb> CREATE TABLE domains (
  id				INT AUTO_INCREMENT,
  name				VARCHAR(255) NOT NULL,
  master			VARCHAR(128) DEFAULT NULL,
  last_check		INT DEFAULT NULL,
  type				VARCHAR(6) NOT NULL,
  notified_serial	INT UNSIGNED DEFAULT NULL,
  account			VARCHAR(40) CHARACTER SET 'utf8' DEFAULT NULL,
  PRIMARY KEY (id)
) Engine=InnoDB CHARACTER SET 'latin1';
mariadb> CREATE UNIQUE INDEX name_index ON domains(name);

mariadb> CREATE TABLE records (
  id			BIGINT AUTO_INCREMENT,
  domain_id		INT DEFAULT NULL,
  name			VARCHAR(255) DEFAULT NULL,
  type			VARCHAR(10) DEFAULT NULL,
  content		VARCHAR(64000) DEFAULT NULL,
  ttl			INT DEFAULT NULL,
  prio			INT DEFAULT NULL,
  change_date	INT DEFAULT NULL,
  disabled		TINYINT(1) DEFAULT 0,
  ordername		VARCHAR(255) BINARY DEFAULT NULL,
  auth			TINYINT(1) DEFAULT 1,
  PRIMARY KEY (id)
) Engine=InnoDB CHARACTER SET 'latin1';
mariadb> CREATE INDEX nametype_index ON records(name,type);
mariadb> CREATE INDEX domain_id ON records(domain_id);
mariadb> CREATE INDEX ordername ON records (ordername);

mariadb> CREATE TABLE supermasters (
  ip			VARCHAR(64) NOT NULL,
  nameserver	VARCHAR(255) NOT NULL,
  account		VARCHAR(40) CHARACTER SET 'utf8' NOT NULL,
  PRIMARY KEY (ip, nameserver)
) Engine=InnoDB CHARACTER SET 'latin1';

mariadb> CREATE TABLE comments (
  id			INT AUTO_INCREMENT,
  domain_id		INT NOT NULL,
  name			VARCHAR(255) NOT NULL,
  type			VARCHAR(10) NOT NULL,
  modified_at	INT NOT NULL,
  account		VARCHAR(40) CHARACTER SET 'utf8' DEFAULT NULL,
  comment		TEXT CHARACTER SET 'utf8' NOT NULL,
  PRIMARY KEY (id)
) Engine=InnoDB CHARACTER SET 'latin1';
mariadb> CREATE INDEX comments_name_type_idx ON comments (name, type);
mariadb> CREATE INDEX comments_order_idx ON comments (domain_id, modified_at);

mariadb> CREATE TABLE domainmetadata (
  id		INT AUTO_INCREMENT,
  domain_id	INT NOT NULL,
  kind		VARCHAR(32),
  content	TEXT,
  PRIMARY KEY (id)
) Engine=InnoDB CHARACTER SET 'latin1';
mariadb> CREATE INDEX domainmetadata_idx ON domainmetadata (domain_id, kind);

mariadb> CREATE TABLE cryptokeys (
  id		INT AUTO_INCREMENT,
  domain_id	INT NOT NULL,
  flags		INT NOT NULL,
  active	BOOL,
  content	TEXT,
  PRIMARY KEY(id)
) Engine=InnoDB CHARACTER SET 'latin1';
mariadb> CREATE INDEX domainidindex ON cryptokeys(domain_id);

mariadb> CREATE TABLE tsigkeys (
  id		INT AUTO_INCREMENT,
  name		VARCHAR(255),
  algorithm	VARCHAR(50),
  secret	VARCHAR(255),
  PRIMARY KEY (id)
) Engine=InnoDB CHARACTER SET 'latin1';
mariadb> CREATE UNIQUE INDEX namealgoindex ON tsigkeys(name, algorithm);

Installer PowerAdmin

PowerAdmin est une interface web permettant de facilement gérer vos zones, je ne peut que vous conseiller de l'utiliser pour une administration plus simple.
Si vous désirez l'installer dans un sous-domaine, vous devrez mettre une nouvelle fois le fichier de la zone concernée à jour.

Une fois l'archive décompressée et votre serveur web configuré -au besoin-, faites pointer votre navigateur internet vers l'URL où vous avez installé PowerAdmin.

L'installation est assez simple, vous devriez vous en sortir. Pensez à indiquer les paramètre de connexion à MySQL et à exécuter la commande MySQL qu'il vous donnera, vous devrez également créer le fichier inc/config.inc.php dans le dossier de PowerAdmin avec les informations qu'il vous donnera.

Une fois l'installation terminée, supprimez le dossier install/ dans le répertoire de PowerAdmin.

Configuration

Configurer PowerDNS

Fichier de backend

Le fichier de backend est différent selon celui que vous utilisez, dans notre cas, nous utilisons MySQL, le fichiez est /etc/powerdns/pdns.d/pdns.local.gmysql.conf.
Editez le est indiquez les informations nécessaires.

Par exemple :

# MySQL Configuration

#
# Launch gmysql backend
launch+=gmysql
# gmysql parameters
gmysql-dnssec

gmysql-host=localhost
gmysql-port=3306
gmysql-dbname=pdns
gmysql-user=pdns
gmysql-password=S3cr37
gmysql-dnssec=yes
# gmysql-socket=

Si vous êtes sous Debian 7, pensez à supprimer le fichier /etc/powerdns/pdns.d/pdns.simplebind.conf, celui-ci est inutile puisque nous utilisons le Backend MySQL, et sa présence, même non configuré, semble gêner PowerDNS dans cette version de Debian.

Fichier pdns.conf

Le fichier de configuration de PowerDNS est /etc/powerdns/pdns.conf, le fichier est commenté et son édition ne devrait pas vous poser trop de problème.

Voyons quelques options utiles&bnsp;:

  • allow-axfr-ips= : Adresses IP, séparés par une virgule, autorisé à faire des demande de transfert de zone. Indiquez ici les IP de vos serveurs DNS esclaves.
  • allow-recursion=127.0.0.0/8, ::1/128 : Réseaux ou adresses IP, séparés par une virgule, autorisés à faire des requêtes récursives sur ce serveur. Indiquez au moins les adresses de boucle locale.
  • also-notify= : Adresses IP, séparés par une virgule, à notifier en cas de mise à jour d'une zone. Indiquez ici les IP de vos serveurs DNS esclaves.
  • disable-axfr=no : Activer ou non le transfert de zone, indiquez yes si vous n'avez pas de serveurs DNS secondaire.
  • launch=gmysql : Backend à utiliser, ici, MySQL
  • local-address=127.0.0.1 : Adresses IPv4 locales, séparés par une virgule, indiquez celles sur lesquelles le service doit écouter.
  • local-ipv6=::1 : Adresses IPv6 locales, indiquez celles sur lesquelles le service doit écouter.
  • master=yes : Activer ou non le rôle de serveur DNS primaire.
  • recursor= : Adresse et port, sous la forme AdresseIP:Port du récurseur DNS.
  • slave=yes : Activer ou non le rôle de serveur DNS secondaire.
  • tcp-control-range=127.0.0.0/8, ::1/128 : Réseaux ou adresses IP, séparés par une virgule, depuis lesquels la gestion de ce serveur est autorisé. Indiquez au moins les adresses de boucle locale.
  • query-local-address=0.0.0.0 : Adresse où émettre les requêtes de résolution IPv4.
  • query-local-address6=:: : Adresse où émettre les requêtes de résolution IPv6.

Configurer PowerDNS Recursor

Le fichier de configuration de PowerDNS Recursor est /etc/powerdns/recursor.conf, le fichier est commenté et son édition ne devrait pas, là aussi, vous poser trop de problème.

Qelques options utiles&bnsp;:

  • allow-from=127.0.0.0/8, ::1/128 : Réseaux ou adresses IP, séparés par une virgule, autorisés à faire des requêtes récursives sur ce serveur. Indiquez au moins les adresses de boucle locale.
  • local-address=127.0.0.1, ::1 : Adresses IPv4 et IPv6 locales, séparés par une virgule, indiquez celles sur lesquelles le service doit écouter.
  • local-port=5353 : Port d'écoute du service.
  • query-local-address=0.0.0.0 : Adresse où émettre les requêtes de résolution IPv4.
  • query-local-address6=:: : Adresse où émettre les requêtes de résolution IPv6.

Si le récurseur DNS est installé sur la même machine que PowerDNS, laissez le port 53 pour le serveur DNS et faites écoutez le récurseur sur un autre port.

Migration

Migrer les zones vers PowerDNS

La migration se faitvia la commande zone2sql, vous devrez lui indiquer le fichier de configuration de BIND, généralement /etc/bind/named.conf via l'option --named-conf et le backend utilisé par PowerDNS via une autre option, comme nous utilisons MySQL, l'option sera --gmysql.
Le résultat de cette commande doit être inséré dans la base de données MySQL utilisé par PowerAdmin, il est possible de faire celà d'une seule commande via zone2sql --named-conf=/etc/bind/named.conf --gmysql | mysql -u MysqlPdnsUser -p MysqlPdnsDB

Par exemple :

# zone2sql --named-conf=/etc/bind/named.conf --gmysql | mysql -u pdns -p pdns
0% done (/etc/bind/db.local) Warning! Skipping 'hint' zone ''

100%

done

10 domains were fully parsed, containing 268 records
******** # 

Une fois fait, connectez-vous à PowerAdmin et vérifiez que vos zones sont bien présentes, si tous s'est bien passé, vous pouvez arrêter BIND et démarrer PowerDNS Recursor, si utilisé, et PowerDNS.

# systemctl stop bind9
# systemctl start pdns-recursor
# systemctl start pdns

Vérifiez dans les journaux système est avec les commandes ps et ss que les service se sont correctement lancés. De même, utilisez la commande dig afin de vérifier que PowerDNS est capable de faire une résolution DNS.

Sécuriser les zones

Le passage d'une zone vers DNSSEC se fait via la commande pdnssec secure-zone suivi du nom de la zone.
Il est possible de vérifier que la zone est bien passé à DNSSEC avec la commande pdnssec show-zone suivi du nom de la zone.

# pdnssec secure-zone test.tld
# pdnssec show-zone test.tld

Vous pouvez ensuite utiliser la commande pdns_control notify pour forcer la mise à jour de la zone sur vos serveurs DNS secondaires.

# pdns_control notify test.tld
Vus : 1367
Publié par Zergy : 41