Migrer PowerDNS de Debian 9 à 10

Suite a quelques problèmes avec PowerDNS après la mises à jour vers Debian Buster, voici quelques conseils pour préparer votre migration.

La mises à jour d'un système Debian, ou tout autres système à mises à jour non continue, est toujours un moment assez critique, si la procédure n'est pas très difficile, la quantité de choses à mettre à jour abouti souvent sur de la casse.
Lors de la mise à jour de Debian 9 (Stretch) vers Debian 10 (Buster) j'ai eu la désagréable surprise de voir que suite à des incompatibilités de configuration entre les versions de PowerDNS et PowerDNS-Recursor incluses dans Debian 9 et celles de Debian 10, ceux-ci ne fonctionnaient plus, voici comment préparer le terrain pour ne pas casser PowerDNS et PowerDNS-Recursor lors de la mises à jour vers Debian 10.

Le cas étudié ici correspond au mien, où PowerDNS et PowerDNS-Recursor sont tout deux installé sur le même ordinateur, il faudra sans doute adapter en fonction de votre configuration.

Installer DNSDist

Jusqu'a sa version 4.0, PowerDNS pouvait communiquer avec PowerDNS-Rrecursor via les options de configuration allow-recursion, recursive-cache-ttl et recursor présentent dans son fichier de configuration, avec la version 4.1, fournie dans Debian 10, ce n'est plus possible, la communication entre les deux doit passer par un troisième composant nommé DNSDist.

DNSDist est un répartiteur de charge créé par les auteurs de PowerDNS, il peux être utilisé avec un ou plusieurs serveurs DNS. Dans notre cas, nous l'utiliseront juste pour faire communiquer PowerDNS et PowerDNS-Recursor, l'installation se fait comme n'importe quel paquet.

# apt install dnsdist

Configuration

PowerDNS

Il vous faudra pour commencer, il faudra commenter les paramètres allow-recursion, recursive-cache-ttl et recursor, penser à noter les valeurs données pour allow-recursion, nous en auront besoin plus tard pour configurer DNSDist.

Il vous faudra ensuite modifier les valeurs de local-ipv6, local-address et local-port, dans mon cas, DNSDist et PowerDNS étant sur la même machine, j'ai paramétré comme suit :

local-ipv6=::1
local-address=127.0.0.1
local-port=5300

Vérifiez également que les paramètres query-local-address et query-local-address6 sont paramétré pour écouter sur toutes les interfaces.

query-local-address=127.0.0.1
query-local-address6=::1

Si votre PowerDNS communique avec un serveur secondaire, pensez que les la communication avec ce serveur passera par DNSDist, du coup ses requêtes proviendront à PowerDNS avec l'IP de DNSDist, pensez donc à modifier la valeur de allow-axfr-ips en conséquence.
Dans le cas d'un serveur secondaire, le problème est le même, mais il faudra modifier la valeur de allow-dnsupdate-from. Dans tout les cas, n'hésitez pas à consulter les journaux système si vos échanges de zones entre serveurs ne passent pas.

PowerDNS-Recursor

Modifier les valeurs de local-address et local-port, dans mon cas, DNSDist et PowerDNS-Recursor étant sur la même machine, j'ai paramétré comme suit :

local-address=127.0.0.1, ::1
local-port=5301

Comme pour PowerDNS, vérifiez que les paramètres query-local-address et query-local-address6 sont paramétré pour écouter sur toutes les interfaces.

query-local-address=127.0.0.1
query-local-address6=::1

Enfin, il faudra paramétrer la valeur forward-zones si votre serveur DNS est utilisé pour résoudre des zones privées ou publiques vous appartenant afin de les faire résoudre par PowerDNS, l'exemple donnée ici contient également les syntaxes pour des zones inverse IPv4 ou IPv6 :

forward-zones=private.lan=127.0.0.1:5300, example.net=127.0.0.1:5300, 1.a.8.0.0.0.c.0.0.0.0.d.f.ip6-arpa=127.0.0.1:5300, 1.168.192.ip-arpa=127.0.0.1:5300

DNSDist

Dans notre cas, la configuration de DNSDist ressemblera à ceci :

-- dnsdist configuration file, an example can be found in /usr/share/doc/dnsdist/examples/

setLocal('IPADDRESS:PORT')
addLocal('ANOTHERIPADDRESS:PORT')
setACL({'0.0.0.0/0', '::/0'}) -- Allow all IPs access

newServer({address='127.0.0.1:5300', pool='auth'})
newServer({address='127.0.0.1:5301', pool='recursor'})

recursive_ips = newNMG()
recursive_ips:addMask('NETWORKMASK1') -- These network masks are the ones from allow-recursion in the Authoritative Server
recursive_ips:addMask('NETWORKMASK2')

addAction(NetmaskGroupRule(recursive_ips), PoolAction('recursor'))
addAction(AllRule(), PoolAction('auth'))

-- disable security status polling via DNS
setSecurityPollSuffix("")
  • setLocal indique sur quel coupe IP et port écoute DNSDist, vous pouvez ajouter une directive addLocal pour ajouter un second couple d'écoute. Le port par défaut est le 53.
  • Les deux directives newServer indiquent sur quelles adresses IP et ports écoutent PowerDNS et PowerDNS-Recursor. PowerDNS est identifié via pool='auth' et PowerDNS-Recursor via pool='recursor'
  • Remplacer la variable NETWORKMASK1 de recursive_ips:addMask('') par l'un des sous-réseaux qui étaient présent dans l'option allow-recursion de PowerDNS. Vous pouvez ajouter plusieurs directives recursive_ips:addMask('').

Si vous utilisez IPv6, vous devrez les noter sous la forme [Mon:IP:v6]:Port, les réseau IPv6 se notent sous la forme [Réseau:IP:v6]/Masque.

Redémarrer les services

Couper les services PowerDNS, PowerDNS-Recursor et DNSDist, puis, les redémarrer.

# systemctl stop pdns pdns-recursor dnsdist
# systemctl start pdns pdns-recursor dnsdist

Installer PowerDNS-Admin

Jusqu'à Debian 9, il était possible d'utiliser PowerAdmin afin de gérer PowerDNS via une interface web, cependant, celui-ci n'étant plus maintenu depuis juin 2014, il n'est plus fonctionnel sous Debian 10 suite au passage à PHP 7.3, autant passer à une autre solution telle PowerDNS Admin avant de mettre à jour le système.

Préliminaires

Si vous utilisiez PowerAdmin avec PowerDNS utilisant en utilisant une base de données MariaDB/MySQL, il sera nécessaire de supprimer des tables dans la base de données de PowerDNS, connectez-vous à la base de PowerDNS et ne laissez que les tables suivantes :

  • comments
  • cryptokeys
  • domainmetadata
  • domains
  • records
  • supermasters
  • tsigkeys

Installation

PowerDNS-Admin nécessite le paquet yarn qui n'est pas founir avec Debian, vous pouvez cependant utilisez les dépôts de Yarn pour l'installer.

# apt -y install curl
# curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add -
# echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list
# apt update

Puis, installer les paquets nécessaires au fonctionnement de PowerDNS-Admin.

# apt install jq yarn libmariadbclient-dev python-mysqldb python3-dev libsasl2-dev libffi-dev libldap2-dev libssl-dev libxml2-dev libxslt1-dev libxmlsec1-dev pkg-config

Remplacez libmariadbclient-dev par libmysqlclient-dev si vous utilisez MySQL et non MariaDB

On peut ensuite procéder à l'installer de PowerDNS-Admin.

Commençons par créer la base de données MariaDB/MySQL nécessaire à PowerDNS-Admin

# mysql -u root -p
Password:
mariadb> CREATE DATABASE powerdnsadmin;
mariadb> GRANT ALL PRIVILEGES ON powerdnsadmin.* TO 'powerdnsadminuser'@'%' IDENTIFIED BY 'strongpassword';
mariadb> FLUSH PRIVILEGES;
mariadb> quit

On peut ensuite récupérer la dernière version de PowerDNS-Admin et installer les dépendances Pythons nécessaires :

# git clone https://github.com/ngoduykhanh/PowerDNS-Admin.git /opt/powerdns-admin
# cd /opt/powerdns-admin
# virtualenv -p python3 flask
# . ./flask/bin/activate
(flask)# pip install -r requirements.txt

On copie le fichier de configuration modèle et on le personnalise.

(flask)# cp config_template.py config.py
(flask)# vim config.py
# DATABASE CONFIG
#You'll need MySQL-python
SQLA_DB_USER = 'powerdnsadmin'
SQLA_DB_PASSWORD = 'strongpassword'
SQLA_DB_HOST = 'localhost'
SQLA_DB_NAME = 'powerdnsadmin'

Remplir la base de données de PowerDNS-Admin et générer les assets avec Yarn :

(flask)# export FLASK_APP=app/__init__.py
(flask)# flask db upgrade
(flask)# flask db migrate -m "Init DB"
(flask)# yarn install --pure-lockfile
(flask)# flask assets build

Configuration

PowerDNS

Pour commencer, PowerDNS-Admin nécessite pour fonctionner d'activer l'API de PowerDNS afin de pouvoir communiquer avec lui. Modifier la configuration de PowerDNS et activer les options liées à la gestion de son API.

api=yes
api-key=secret
webserver=yes
webserver-port=8081

Modifiez à votre convenant, l'API sera disponible à l'adresse http://localhost:8081/ via le mot de passe secret dans le cas ci-dessus.
PowerDNS-Admin demandera aussi de connaître la version de PowerDNS, pour en être sûr, vous pouvez demander à PowerDNS de vous retourner son numéro de version via son API.

# systemctl retart pdns
# curl -v -H 'X-API-Key: secret' http://127.0.0.1:8081/api/v1/servers/localhost | jq .
*   Trying 127.0.0.1...
[…]
  "version": "4.1.5",
[…]

SystèmeD

Créer le fichier de configuration /etc/systemd/system/powerdns-admin.service nécessaire afin d'enregistrer PowerDNS-Admin comme service auprès de SystemD.

[Unit]
Description=PowerDNS-Admin
After=network.target

[Service]
User=root
Group=root
WorkingDirectory=/opt/powerdns-admin
ExecStart=/opt/powerdns-admin/flask/bin/gunicorn --workers 2 --bind unix:/opt/powerdns-admin/powerdns-admin.sock app:app

[Install]
WantedBy=multi-user.target

Puis l'activer.

# systemctl daemon-reload
# systemctl enable powerdns-admin
# systemctl start powerdns-admin

Si vous utilisez NGinx, le Virtual Host pour PowerDNS-Admin ressemblera au suivant :

server {
	listen *:80;
	server_name powerdns-admin.example.net;

	index index.html index.htm index.php;
	root /opt/powerdns-admin;
	access_log /var/log/nginx/powerdns-admin.local.access.log combined;
	error_log /var/log/nginx/powerdns-admin.local.error.log;

	client_max_body_size 10m;
	client_body_buffer_size 128k;
	proxy_redirect off;
	proxy_connect_timeout 90;
	proxy_send_timeout 90;
	proxy_read_timeout 90;
	proxy_buffers 32 4k;
	proxy_buffer_size 8k;
	proxy_set_header Host $host;
	proxy_set_header X-Real-IP $remote_addr;
	proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
	proxy_headers_hash_bucket_size 64;

	location ~ ^/static/ {
		include	/etc/nginx/mime.types;
		root /opt/powerdns-admin/app;

		location ~* .(jpg|jpeg|png|gif)$ {
			expires 365d;
		}

		location ~* ^.+.(css|js)$ {
			expires 7d;
		}
	}

	location / {
		proxy_pass http://unix:/opt/powerdns-admin/powerdns-admin.sock;
		proxy_read_timeout 120;
		proxy_connect_timeout 120;
		proxy_redirect off;
	}
}

Redémarrez NGinx et vérifiez que la page de login de PowerDNS-Admin s'affiche, si c'est le cas, il ne vous reste plus qu'à créer un utilisateur et a indiquer les paramètres relatifs à l'API de PowerDNS pour commencer à vous en servir.

Vus : 1854
Publié par Zergy : 41