Aller au contenu
medium

Poweradmin : interface web pour PowerDNS avec Docker

12 min de lecture

logo Poweradmin

Gérer des zones DNS à la main dans les tables de PowerDNS ou avec pdnsutil devient vite pénible dès qu'on dépasse quelques enregistrements. Ce guide déploie Poweradmin 4.2, une interface web activement maintenue pour PowerDNS, avec une stack Docker complète (base de données, serveur DNS, interface). Vous allez créer une zone, y ajouter des enregistrements depuis le navigateur, et vérifier la résolution avec dig. Public visé : administrateurs réseau et systèmes à l'aise avec Docker Compose.

  • Déployer Poweradmin, PowerDNS et MariaDB avec Docker Compose
  • Initialiser les schémas de base de données proprement
  • Créer une zone DNS et ses enregistrements depuis l'interface
  • Vérifier que le serveur résout réellement les noms
  • Sécuriser l'accès avant toute mise en production

Poweradmin est une interface web écrite en PHP pour administrer un serveur PowerDNS. Elle gère les zones directes et inverses, les enregistrements, les utilisateurs avec des permissions fines, les modèles de zone, DNSSEC et l'enregistrement en masse. L'outil s'adresse à ceux qui veulent déléguer la gestion DNS sans donner un accès direct à la base ou au serveur.

Son intérêt principal aujourd'hui est d'être activement maintenu. Le projet historique PowerDNS-Admin est passé en mode legacy, sans nouvelle version depuis début 2024. Poweradmin, lui, publie des versions régulières et suit les évolutions de PowerDNS. Pour une nouvelle installation, c'est l'alternative raisonnable, comme l'explique la page sur PowerDNS-Admin.

  • Un hôte Linux avec Docker Engine et le plugin Compose, voir installer Docker
  • La commande dig pour tester la résolution (paquet dnsutils ou bind-utils)
  • Des notions de DNS (zones, enregistrements A, NS, SOA)

Poweradmin ne remplace pas PowerDNS, il le pilote. Trois composants coopèrent, et bien saisir leur rôle évite les erreurs de configuration.

ComposantRôle
MariaDBStocke les zones PowerDNS et les comptes Poweradmin
PowerDNSLe serveur DNS qui répond aux requêtes, lit ses zones dans MariaDB
PoweradminL'interface web ; écrit les zones dans la même base que PowerDNS

Poweradmin et PowerDNS partagent la base des zones : ce que vous créez dans l'interface est immédiatement lisible par le serveur DNS. Poweradmin garde en plus sa propre base pour les utilisateurs et la configuration.

PowerDNS et Poweradmin ne créent pas leurs schémas de base tout seuls. La préparation consiste donc à charger deux schémas SQL au premier démarrage de MariaDB, via son mécanisme d'initialisation.

  1. Créer l'arborescence du projet.

    Fenêtre de terminal
    mkdir -p poweradmin/initdb poweradmin/conf && cd poweradmin
  2. Récupérer les deux schémas depuis les dépôts officiels, dans le dossier initdb/. MariaDB exécute ces fichiers dans l'ordre alphabétique.

    Fenêtre de terminal
    # schema PowerDNS (zones), prefixe pour cibler la bonne base
    echo "USE pdns;" > initdb/02-pdns.sql
    curl -fsSL https://raw.githubusercontent.com/PowerDNS/pdns/rel/auth-4.9.x/modules/gmysqlbackend/schema.mysql.sql >> initdb/02-pdns.sql
    # schema Poweradmin (utilisateurs, configuration)
    echo "USE poweradmin;" > initdb/03-poweradmin.sql
    curl -fsSL https://raw.githubusercontent.com/poweradmin/poweradmin/v4.2.4/sql/poweradmin-mysql-db-structure.sql >> initdb/03-poweradmin.sql
  3. Créer le script d'initialisation initdb/01-init.sql qui prépare les deux bases et l'utilisateur commun.

    CREATE DATABASE IF NOT EXISTS pdns;
    CREATE DATABASE IF NOT EXISTS poweradmin;
    CREATE USER IF NOT EXISTS 'padmin'@'%' IDENTIFIED BY 'padminpass';
    GRANT ALL PRIVILEGES ON pdns.* TO 'padmin'@'%';
    GRANT ALL PRIVILEGES ON poweradmin.* TO 'padmin'@'%';
    FLUSH PRIVILEGES;
  4. Écrire la configuration PowerDNS conf/pdns.conf pour le backend MySQL. Elle remplace la configuration SQLite par défaut de l'image.

    launch=gmysql
    gmysql-host=db
    gmysql-user=padmin
    gmysql-password=padminpass
    gmysql-dbname=pdns
    local-address=0.0.0.0
    include-dir=/etc/powerdns/pdns.d
  5. Créer le compose.yaml. Les ports sont publiés sur la loopback et le DNS sur 5300 pour ne pas entrer en conflit avec un résolveur local.

    services:
    db:
    image: mariadb@sha256:a794d9eb009e20de605858a11f32f63b4075cbd197c650436f0e3b457e4caed7 # 11.4
    environment:
    MARIADB_ROOT_PASSWORD: rootpass
    volumes:
    - ./initdb:/docker-entrypoint-initdb.d:ro
    - db-data:/var/lib/mysql
    networks: [dnsnet]
    restart: unless-stopped
    pdns:
    image: powerdns/pdns-auth-49@sha256:272fe174990ce108461ed3e953b43691509cdcfb138d8c7c61f64d7a61b8e6ad
    depends_on: [db]
    environment:
    PDNS_AUTH_API_KEY: labsecretkey
    volumes:
    - ./conf/pdns.conf:/etc/powerdns/pdns.conf:ro
    ports:
    - "127.0.0.1:5300:53/udp"
    - "127.0.0.1:5300:53/tcp"
    networks: [dnsnet]
    restart: unless-stopped
    poweradmin:
    image: poweradmin/poweradmin@sha256:6360d2dbbf58d40e479ba352dc986653202eee02497f57846c5967e367c936ab # 4.2.5
    depends_on: [db]
    environment:
    DB_TYPE: mysql
    DB_HOST: db
    DB_USER: padmin
    DB_PASS: padminpass
    DB_NAME: poweradmin # base des comptes Poweradmin
    PA_PDNS_DB_NAME: pdns # base partagee des zones
    PA_PDNS_API_URL: http://pdns:8081
    PA_PDNS_API_KEY: labsecretkey
    PA_CREATE_ADMIN: "1" # cree l'admin, mot de passe genere dans les logs
    ports:
    - "127.0.0.1:8091:80"
    networks: [dnsnet]
    restart: unless-stopped
    networks:
    dnsnet: {}
    volumes:
    db-data: {}
  6. Démarrer la stack.

    Fenêtre de terminal
    docker compose up -d

Poweradmin ne crée aucun compte administrateur par défaut, un bon réflexe de sécurité. La variable PA_CREATE_ADMIN du compose demande la création d'un compte admin dont le mot de passe est généré aléatoirement et affiché dans les journaux du conteneur.

Fenêtre de terminal
docker compose logs poweradmin | grep -A1 "Admin user"
Admin user 'admin' created successfully
Username: admin
Password: bFS3u3EgXGLIytaG

Ouvrez http://127.0.0.1:8091 et connectez-vous avec ce couple. Un sélecteur de langue est disponible sur la page de connexion.

Page de connexion de Poweradmin

L'accueil présente les fonctions sous forme de cartes : gestion des zones directes et inverses, modèles, utilisateurs, permissions.

Tableau de bord de Poweradmin

Une zone regroupe les enregistrements d'un domaine. Depuis le tableau de bord, la carte Master Zone ouvre le formulaire de création. Renseignez le nom de domaine, choisissez le type et validez.

  1. Ouvrir le formulaire via Zones puis Add master zone.

  2. Saisir le nom de la zone, par exemple lab.example, et laisser le type NATIVE pour un serveur unique. Le type MASTER sert quand des serveurs secondaires transfèrent la zone.

  3. Valider. Poweradmin crée la zone avec ses enregistrements SOA et NS initiaux. Elle apparaît dans la liste des zones directes.

    Liste des zones dans Poweradmin

Cliquez sur l'icône d'édition d'une zone pour ouvrir sa table d'enregistrements. Chaque ligne est modifiable directement : nom, type, contenu, priorité et TTL. Le bouton Add record ajoute une entrée.

Édition des enregistrements d'une zone

Pour publier un site sur www.lab.example, ajoutez un enregistrement de type A pointant vers son adresse IP, puis enregistrez. Poweradmin écrit directement dans la base partagée avec PowerDNS, la modification est donc prise en compte sans étape supplémentaire. Les boutons Bulk add et Export facilitent la gestion de zones volumineuses.

L'interface affiche les enregistrements, mais la vraie preuve est que le serveur répond. Interrogez directement PowerDNS avec dig, sur le port 5300 publié par le compose.

Fenêtre de terminal
dig @127.0.0.1 -p 5300 www.lab.example A +short
192.0.2.10

Cette réponse confirme la chaîne complète : Poweradmin a écrit la zone dans MariaDB, et PowerDNS la sert. Si dig ne renvoie rien alors que l'enregistrement existe dans l'interface, videz le cache du serveur :

Fenêtre de terminal
docker compose exec pdns pdns_control purge

L'interface donne un contrôle total sur votre DNS. Quelques précautions s'imposent avant de l'exposer.

  • Garder le port en loopback (127.0.0.1:8091) et placer un reverse proxy avec HTTPS et authentification pour tout accès distant.
  • Changer le mot de passe admin généré et créer des comptes nommés avec des permissions restreintes plutôt que de partager le compte administrateur.
  • Protéger la clé d'API PowerDNS (PDNS_AUTH_API_KEY) : elle autorise la modification de toutes les zones. Ne jamais publier le port 8081 de l'API sur un réseau non maîtrisé.
  • Utiliser des mots de passe forts pour MariaDB et un utilisateur dédié, jamais root, ce que fait déjà ce compose.
SymptômeCause probableSolution
Le conteneur poweradmin redémarre en boucleSchéma de base non chargéVérifier que initdb/03-poweradmin.sql existe avant le premier démarrage
PowerDNS refuse de démarrerRéglage gsqlite3 par défaut résiduelVérifier que conf/pdns.conf est bien monté et en launch=gmysql
dig ne résout pas une zone existanteCache du serveurdocker compose exec pdns pdns_control purge
Mot de passe admin introuvableLogs déjà tournésRecréer via PA_CREATE_ADMIN sur une base vierge, ou réinitialiser en base
Modifications de schéma ignoréesVolume MariaDB déjà initialiséLes scripts initdb ne s'exécutent qu'à la première création du volume
  • Poweradmin est l'interface web activement maintenue pour PowerDNS, à préférer à PowerDNS-Admin devenu legacy.
  • La stack repose sur trois composants : MariaDB, PowerDNS et Poweradmin, les deux derniers partageant la base des zones.
  • Les schémas de base doivent être chargés au premier démarrage ; ils ne se créent pas automatiquement.
  • Aucun admin par défaut : PA_CREATE_ADMIN génère un mot de passe visible dans les logs, à changer aussitôt.
  • Toujours vérifier la résolution avec dig, la seule preuve que le serveur répond vraiment.
  • Garder le port en loopback derrière un reverse proxy authentifié.

Ce site vous est utile ?

Sachez que moins de 1% des lecteurs soutiennent ce site.

Je maintiens +700 guides gratuits, sans pub ni tracking. Un soutien, même symbolique, m'aide à couvrir l'hébergement et à garder ces ressources gratuites. Merci pour votre appui.

Le formulaire ne s'affiche pas ? Ouvrir Ko-fi dans un onglet.

Abonnez-vous et suivez mon actualité DevSecOps sur LinkedIn