PowerDNS is een Nederlands bedrijf (tegenwoordig onderdeel van Open-Xchange) dat over de afgelopen 20 jaar 3 software-pakketten voor DNS ontwikkelde: * PowerDNS Authoritative Server * PowerDNS Recursor * dnsdist (een load balancer)
De software is geschreven in C++, en is schaalbaar en snel. De code draait op alle Unix-achtigen en de laatste versies zijn in ieder geval als kant-en-klaar package beschikbaar voor de meeste Linux- en BSD-distributies, en via Homebrew voor macOS.
Alle 3 de software-pakketten worden gepubliceerd als open-source software onder de GPLv2-licentie. Het bedrijf verdient zijn geld via advies, ondersteuning en maatwerk. Daarmee heb je als gebruiker alle voordelen van het klassieke business model voor open source: open software die je "gratis" kunt gebruiken als je daar zelf de tijd en expertise voor hebt, een actieve community van gebruikers en ontwikkelaars, met een commercieel bedrijf als fallback. Alternatief is het PowerDNS Platform, een software suite gebaseerd op deze 3 software-producten.
DNSSEC
De implementatie van DNSSEC (vanaf versie 3.0) betekende de grote doorbraak voor PowerDNS: vrijwel alle grote Internet Service Providers die hun domeinen in bulk ondertekenden, deden dat op basis van de Authoritative Server. Validatie van DNSSEC is pas vanaf versie 4.0 onderdeel van de Recursor. De ontwikkeling ervan is destijds door SIDN (financieel) ondersteund. Interessante feature is de Lua engine ingebouwd in zowel de Authoritative Server als de Recursor. Lua is een snel te leren script-taal waarmee de interne datastructuren gemakkelijk toegankelijk worden gemaakt voor beheerders. Verderop meer over het gebruik hiervan. In dit artikel bespreken we de DNSSEC features van de Authoritative Server. Juist omdat DNSSEC voor veel operators reden is om naar PowerDNS over te stappen, doorlopen we daarvoor de basisinstallatie van de Authoritative Server draaiend op CentOS/RHEL, en besteden we ook aandacht aan de Bind connector. De configuratie van de Recursor als validerende resolver bespreken we in een ander artikel.
Inhoudsopgave
Deel I Installatie en configuratie
Deel II Management
Deel III DNSSEC-specifieke opties en commando's
Deel I Installatie en configuratie
1.1 Kant-en-klare packages
De huidige versie (we schrijven najaar 2019) van de PowerDNS Authoritative Server is 4.2.0. De software is als kant-en-klaar pakket beschikbaar voor download vanaf de repo-site. Daar vind je packages voor de meest gebruikte Linux-distributies (Debian, Raspbian, Ubuntu en CentOS/RHEL). DNSSEC wordt door de Authoritative Server ondersteund vanaf versie 3.0. Waar de ondertekening van domeinen op andere autoritatieve servers (BIND named, eventueel in combinatie met OpenDNSSEC) destijds nogal wat voeten in de aarde had, hanteerde PowerDNS vanaf het begin een 'flick the switch'-aanpak. Dat betekent dat beheerders met een enkel commando hun domeinen konden laten ondertekenen. De DNSSEC-configuratie, de herondertekening van de DNS-records en het sleutelbeheer werden vervolgens allemaal automatisch door de server verzorgd. Door de complexiteit van DNSSEC op deze manier te verbergen voor de beheerders heeft PowerDNS met de opkomst van DNSSEC mee kunnen liften en een groot marktaandeel van de ondertekende domeinen weten te veroveren. Voor deze bespreking hebben we gebruik gemaakt van PowerDNS Authorative Server versie 4.1.13 op CentOS 7.6. De documentatie voor de Authoritative Server vind je hier.
1.2 Installatie
De installatie van de Authoritative Server begint met de configuratie van de EPEL en PowerDNS Authoritative Server repositories, en de installatie van het yum-plugin-priorities package:
yum install epel-release yum-plugin-priorities && curl -o /etc/yum.repos.d/powerdns-auth-41.repo https://repo.powerdns.com/repo-files/centos-auth-41.repo
Gevolgd door de pdns en pdns-tools packages:
yum install pdns pdns-tools
Hoewel de PowerDNS software ook direct vanaf de EPEL repository voor CentOS/RHEL beschikbaar is, wordt hier de versie afkomstig van de powerdns-auth-41 repository gebruikt. Voor de laatste versies van Fedora (29, 30 en 31, waarvan die laatste nog in ontwikkeling) worden op dit moment Authoritative Server versies 4.1.11 en 4.2.0 (via de updates) met de distributie meegeleverd. Nog een alternatief is om de packages direct te downloaden van de PDNS repository van Kees Monshouwer.
1.3 Back-ends
De Authoritative Server software bevat een groot aantal backends – dat wil zeggen: connectors voor verschillende bronnen waar de server zijn zone informatie vandaan kan halen (en meestal ook wegschrijven). In de tabel hieronder geven we een overzicht van de beschikbare backends en de additionele packages die je daarvoor moet installeren:
Backend | Package |
---|---|
GeoIP (resolve naar dichtstbijzijnde host) | |
Lua (connector voor de embedded Lua script-taal) | |
MyDNS (oud, alleen om te importeren) | |
Oracle pipe (connector voor named pipes en IPC sockets) | |
remote (connector voor pipes/sockets, HTTP en ZeroMQ) | |
SQLite 3 (embedded) | |
TinyDNS (djbdns; oud, alleen om te importeren) |
Het Oracle backend wordt niet met CentOS/RHEL meegeleverd. Om eventuele inbreuk op rechten te voorkomen, moet je die zelf compileren. Maar dit backend moet je sowieso niet meer gebruiken, want vanaf versie 4.3 zijn de backends voor Oracle, MyDNS en OpenDBX uit de software verwijderd. Sowieso zullen de meeste beheerders de Authoritative Server opzetten met een MySQL/MariaDB backend.
1.4 Modes of Operation
De Authoritative Server ondersteunt verschillende Modes of Operation:
native replication (default): Notificaties en zone transfers worden helemaal niet uitgevoerd; alle updates geschieden via de replicatie-mechanismen van de onderliggende databases (vergelijkbaar met de Infoblox appliances binnen een Grid). Volgens de makers van PowerDNS heeft dit mechanisme zich voor MySQL/MariaDB en Oracle zelfs over slechte intercontinentale verbindingen bewezen.
Master: Notificaties worden naar uitgestuurd naar slaves, die vervolgens om een zone update kunnen vragen.
Supermaster: Een server die een notificatie stuurt maakt dat een ontvangende server zichzelf automatisch als (super)slave voor dat specifieke domein configureert.
binnenkomende zone transfers kunnen gefilterd worden door middel van een Lua-script (per zone) dat vervolgens wordt uitgevoerd voor ieder resource record
Voor native replicatie (de default) hoef je dus niets te doen (anders dan het opzetten van unidirectionele databasereplicatie van master naar slaves). Bovendien kun je alle backends vervolgens instellen op read-only (behalve diegene die met een user/management frontend verbonden zijn; typisch een administratieve hidden master).
1.5 MariaDB
Voor deze bespreking gebruiken we (net als meesten van jullie) MariaDB, de opvolger (fork) van MySQL na de overname van Sun door Oracle. Omdat de ondersteuning van DNSSEC voor veel grote operators de reden was om over te stappen naar de PowerDNS Authoritative Server laten we hieronder de hele basisinstallatie zien. We beginnen met de installatie van de MariaDB-software en de MySQL/MariaDB-backend:
yum install mariadb mariadb-server pdns-backend-mysql
Gevolgd door het (permanent) aanzetten en opstarten van de MariaDB-server:
[root@localhost ~]# systemctl enable mariadb Created symlink from /etc/systemd/system/multi-user.target.wants/mariadb.service to /usr/lib/systemd/system/mariadb.service. [root@localhost ~]# systemctl start mariadb [root@localhost ~]# systemctl status mariadb ● mariadb.service - MariaDB database server Loaded: loaded (/usr/lib/systemd/system/mariadb.service; enabled; vendor preset: disabled) Active: active (running) since Mon 2019-02-04 15:31:09 CET; 1min 17s ago Main PID: 30431 (mysqld_safe) CGroup: /system.slice/mariadb.service ├─30431 /bin/sh /usr/bin/mysqld_safe --basedir=/usr └─30592 /usr/libexec/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib64/mysql/plugin --log... Feb 04 15:31:07 localhost.localdomain mariadb-prepare-db-dir[30215]: MySQL manual for more instructions. Feb 04 15:31:07 localhost.localdomain mariadb-prepare-db-dir[30215]: Please report any problems at http://mariadb.org/jira Feb 04 15:31:07 localhost.localdomain mariadb-prepare-db-dir[30215]: The latest information about MariaDB is available...g/. Feb 04 15:31:07 localhost.localdomain mariadb-prepare-db-dir[30215]: You can find additional information about the MyS...at: Feb 04 15:31:07 localhost.localdomain mariadb-prepare-db-dir[30215]: http://dev.mysql.com Feb 04 15:31:07 localhost.localdomain mariadb-prepare-db-dir[30215]: Consider joining MariaDB's strong and vibrant com...ty: Feb 04 15:31:07 localhost.localdomain mariadb-prepare-db-dir[30215]: https://mariadb.org/get-involved/ Feb 04 15:31:07 localhost.localdomain mysqld_safe[30431]: 190204 15:31:07 mysqld_safe Logging to '/var/log/mariadb/ma...og'. Feb 04 15:31:07 localhost.localdomain mysqld_safe[30431]: 190204 15:31:07 mysqld_safe Starting mysqld daemon with dat...ysql Feb 04 15:31:09 localhost.localdomain systemd[1]: Started MariaDB database server. Hint: Some lines were ellipsized, use -l to show in full.
Vervolgens initialiseren we de verse installatie van MariaDB als volgt:
[root@localhost ~]# mysql_secure_installation NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB SERVERS IN PRODUCTION USE! PLEASE READ EACH STEP CAREFULLY! In order to log into MariaDB to secure it, we'll need the current password for the root user. If you've just installed MariaDB, and you haven't set the root password yet, the password will be blank, so you should just press enter here. Enter current password for root (enter for none): OK, successfully used password, moving on... Setting the root password ensures that nobody can log into the MariaDB root user without the proper authorisation. Set root password? [Y/n] y New password: ************ Re-enter new password: ************ Password updated successfully! Reloading privilege tables.. ... Success! By default, a MariaDB installation has an anonymous user, allowing anyone to log into MariaDB without having to have a user account created for them. This is intended only for testing, and to make the installation go a bit smoother. You should remove them before moving into a production environment. Remove anonymous users? [Y/n] y ... Success! Normally, root should only be allowed to connect from 'localhost'. This ensures that someone cannot guess at the root password from the network. Disallow root login remotely? [Y/n] y ... Success! By default, MariaDB comes with a database named 'test' that anyone can access. This is also intended only for testing, and should be removed before moving into a production environment. Remove test database and access to it? [Y/n] y - Dropping test database... ... Success! - Removing privileges on test database... ... Success! Reloading the privilege tables will ensure that all changes made so far will take effect immediately. Reload privilege tables now? [Y/n] y ... Success! Cleaning up... All done! If you've completed all of the above steps, your MariaDB installation should now be secure. Thanks for using MariaDB!
1.6 Databasegebruiker en -definitie
In de volgende stap maken we via de MariaDB-monitor een gebruikersaccount ('pdns') en de database zelf (hier ook 'pdns') aan voor de Authoritative Server:
[root@localhost ~]# mysql -u root -p Enter password: ************ Welcome to the MariaDB monitor. Commands end with ; or \g. Your MariaDB connection id is 10 Server version: 5.5.60-MariaDB MariaDB Server Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. MariaDB [(none)]> CREATE USER 'pdns'@'localhost' IDENTIFIED BY '************'; Query OK, 0 rows affected (0.00 sec) MariaDB [(none)]> GRANT DELETE, INSERT, SELECT, UPDATE ON pdns.* TO 'pdns'@'localhost'; Query OK, 0 rows affected (0.00 sec) MariaDB [(none)]> FLUSH PRIVILEGES; Query OK, 0 rows affected (0.00 sec) MariaDB [(none)]> CREATE DATABASE pdns; Query OK, 1 row affected (0.00 sec) MariaDB [(none)]> USE pdns; Database changed MariaDB [pdns]>
Gevolgd door de database-tabellen specifiek voor de Authoritative Server. Daarvoor hebben we de definities zoals die op de website van PowerDNS zelf staan [1] overgenomen:
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 DEFAULT NULL, account VARCHAR(40) CHARACTER SET 'utf8' DEFAULT NULL, PRIMARY KEY (id) ) Engine=InnoDB CHARACTER SET 'latin1'; CREATE UNIQUE INDEX name_index ON domains(name); 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'; CREATE INDEX nametype_index ON records(name,type); CREATE INDEX domain_id ON records(domain_id); CREATE INDEX ordername ON records (ordername); 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'; 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'; CREATE INDEX comments_name_type_idx ON comments (name, type); CREATE INDEX comments_order_idx ON comments (domain_id, modified_at); 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'; CREATE INDEX domainmetadata_idx ON domainmetadata (domain_id, kind); 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'; CREATE INDEX domainidindex ON cryptokeys(domain_id); CREATE TABLE tsigkeys ( id INT AUTO_INCREMENT, name VARCHAR(255), algorithm VARCHAR(50), secret VARCHAR(255), PRIMARY KEY (id) ) Engine=InnoDB CHARACTER SET 'latin1'; CREATE UNIQUE INDEX namealgoindex ON tsigkeys(name, algorithm);
1.7 Configuratie van de PowerDNS Authoritative Server
Na het opzetten van de MariaDB-server en onze 'pdns'-database kunnen we verder met de configuratie van de Authoritative Server zelf. Daarvoor voegen we om te beginnen deze 'launch'-opdracht voor de MySQL/MariaDB-backend toe aan het configuratiebestand '/etc/pdns/pdns.conf':
launch=gmysql gmysql-host=127.0.0.1 gmysql-port=3306 gmysql-user=pdns gmysql-password=************ gmysql-dbname=pdns gmysql-dnssec=yes
Let op het laatste statement om de ondersteuning van DNSSEC aan te zetten. De rest (timing, herondertekening, sleutelbeheer en dergelijke) volgen dan vanzelf. Dit 'gmysql' backend zal straks worden geladen bij het (her)starten van de Authoritative Server. Let op dat halverwege de configuratie-template een verdwaald 'lauch=' statement staat. Dus als je de melding "Unable to launch, no backends configured for querying" krijgt, controleer dan eerst of je configuratiebestand verder helemaal schoon is. Andere eerste configuratie-opties betreffen de IP-adressen waarop de Authoritative Server luistert voor binnenkomende DNS queries en het adres dat de server zelf gebruikt om uitgaande verbindingen te initiëren:
local-address
=192.0.2.3
local-ipv6
=2001:db8::2:3
query-local-address
=192.0.2.3
query-local-address6
=2001:db8::2:3
Daarnaast moet je alle Modes of Operation behalve de native mode (default) expliciet aanzetten in het configuratiebestand:
master=yes
of:
slave=yes
of: slave=yes, in combinatie met:
superslave=yes
1.8 Generieke backends
Voor MySQL/MariaDB, ODBC, Oracle, PostgreSQL en SQLite3 levert PowerDNS (vanaf versie 4.0.0) generieke backends. Deze bevatten algemene SQL-commando's die je zelf makkelijk kunt aanpassen via het configuratiebestand. Zo kun je de backend-database interface op maat maken voor jouw specifieke set-up en database schema. Dit is de opdracht waarmee je alle SQL query's ingebakken in het generieke MySQL/MariaDB backend kunt laten zien:
pdns_server --no-config --launch=gmysql --config
De hele lijst van opties is te lang om integraal af te drukken, maar hier zie je bijvoorbeeld de query die gebruikt wordt om een nieuw domein aan de database toe te voegen:
################################# # gmysql-insert-zone-query # # gmysql-insert-zone-query=insert into domains # (type,name,master,account,last_check,notified_serial) # values(?,?,?,?,NULL,NULL)
De details van de generieke interface worden hier beschreven. Daar lees je hoe je verschillende records naar de 'domain' en 'records' tabellen en de administratieve tabel 'supermasters' schrijft voor verschillende serverconfiguraties (native/Slave/Superslave/Master). Nieuwe slavedomeinen worden binnen 60 seconden ('slave-cycle-interval') opgehaald en geactiveerd. Daarna is de TTL van het SOA-record bepalend voor de volgende check. Op een Masterserver wordt 'slave-cycle-interval' gebruikt voor het uitsturen van NOTIFY-berichten.
1.9 Opstarten van de PowerDNS Authoritative Server
Starten we de Authoritative Server nu op, dan moet deze via het 'gmysql' backend verbinding maken met de eerder geconfigureerde database:
[root@localhost ~]# systemctl enable pdns.service Created symlink from /etc/systemd/system/multi-user.target.wants/pdns.service to /usr/lib/systemd/system/pdns.service. [root@localhost ~]# systemctl start pdns.service [root@localhost pdns]# systemctl status pdns.service ● pdns.service - PowerDNS Authoritative Server Loaded: loaded (/usr/lib/systemd/system/pdns.service; enabled; vendor preset: disabled) Active: active (running) since Fri 2019-08-16 17:07:06 CEST; 4s ago Docs: man:pdns_server(1) man:pdns_control(1) https://doc.powerdns.com Main PID: 3678 (pdns_server) Tasks: 8 CGroup: /system.slice/pdns.service └─3678 /usr/sbin/pdns_server --guardian=no --daemon=no --disable-syslog --log-timestamp=no --write-pid=no Aug 16 17:07:03 localhost.localdomain pdns_server[3678]: TCP server bound to 0.0.0.0:53 Aug 16 17:07:04 localhost.localdomain pdns_server[3678]: TCPv6 server bound to [::]:53 Aug 16 17:07:04 localhost.localdomain pdns_server[3678]: PowerDNS Authoritative Server 4.1.13 (C) 2001-2018 PowerDNS.COM BV Aug 16 17:07:04 localhost.localdomain pdns_server[3678]: Using 64-bits mode. Built using gcc 4.8.5 20150623 (Red Hat ...81d. Aug 16 17:07:04 localhost.localdomain pdns_server[3678]: PowerDNS comes with ABSOLUTELY NO WARRANTY. This is free sof...n 2. Aug 16 17:07:06 localhost.localdomain pdns_server[3678]: Polled security status of version 4.1.13 at startup, no know...: OK Aug 16 17:07:06 localhost.localdomain pdns_server[3678]: Creating backend connection for TCP Aug 16 17:07:06 localhost.localdomain systemd[1]: Started PowerDNS Authoritative Server. Aug 16 17:07:06 localhost.localdomain pdns_server[3678]: About to create 3 backend threads for UDP Aug 16 17:07:06 localhost.localdomain pdns_server[3678]: Done launching threads, ready to distribute questions Hint: Some lines were ellipsized, use -l to show in full.
Zoals je hieronder kunt zien luistert de Authoritative Server nu op alle netwerkinterfaces naar UDP en TCP voor poortnummer 53, en dat voor zowel IPv4 als IPv6:
[root@localhost ~]# netstat -lntup | grep pdns tcp 0 0 0.0.0.0:53 0.0.0.0:* LISTEN 3757/pdns_server tcp6 0 0 :::53 :::* LISTEN 3757/pdns_server udp 0 0 0.0.0.0:53 0.0.0.0:* 3757/pdns_server udp6 0 0 :::53 :::* 3757/pdns_server
Deel II Management
2.1 Database-interface
Bij de Authoritative Server fungeert meestal de database als interface tussen de infrastructuur van DNS-servers enerzijds en de administratieve omgeving anderzijds. Domeinen en bijbehorende records worden aangemaakt en aangepast in de database, waarna deze informatie automatisch door de Authoritative Server wordt opgenomen voor publicatie en naar eventuele slaves gedistribueerd. Voor zo'n complex systeem als DNS is het database schema onder de Authoritative Server (zie hierboven) verbazingwekkend eenvoudig. De 'records' tabel bevat 2 velden die specifiek voor DNSSEC zijn bedoeld:
'auth': deze moet 1/true zijn voor alle DNS-records waarvoor deze zone autoritatief is, behalve voor NS en glue-records voor gedelegeerde zones
'ordername': deze moet ingevuld worden bij gebruik van NSEC/NSEC3; de waarde is afhankelijk van het record type en de gebruikte NSEC/NSEC3 modus
Maar we raden je aan de management-ingang, de web-interface of de web API (alledrie hierna beschreven) te gebruiken. Dat is eenvoudiger, minder gevoelig voor fouten en makkelijker te onderhouden. Bij binnenkomende zone transfers of gebruik van het commando 'pdnsutil rectify-zone' worden deze 2 velden automatisch door de Authoritative Server ingevuld. De standaard installatie van PowerDNS gebruikt NSEC. We raden je aan om daar NSEC3 van te maken door het NSEC3PARAM record te zetten, waarmee je beschermd bent tegen name walking:
pdnsutil set-nsec3 example.nl '1 0 0 0'
2.2 Managementingang
De Authoritative Server biedt een beheersingang op TCP poort 53000 en op de Unix socket '/var/run/pdns.controlsocket'. Deze 2 interfaces bieden exact dezelfde functionaliteit voor servergeoriënteerde beheerszaken (serverconfiguratie, statistieken, en het initiëren van DNS transfers en notificaties). Voor het openzetten van de managementingang voor localhost en lokale netwerken voeg je deze statements aan het configuratiebestand toe:
tcp-control-address=127.0.0.1 tcp-control-port=53000 tcp-control-range=127.0.0.0/8, 10.0.0.0/8, 192.168.0.0/16, 172.16.0.0/12, ::1/128, fe80::/10 tcp-control-secret=************
De locatie van de Unix socket wordt als volgt geconfigureerd:
socket-dir=/var/run/
Als je deze interface direct zou willen gebruiken, dan kun je de opdracht 'telnet localhost 53000' geven. Na het intypen van het password kun je dan 1 commando geven voordat de verbinding weer afgesloten wordt. Maar in het algemeen benader je deze ingang via het 'pdns_control'-commando. De algemene syntax is als volgt:
pdns_control <command> <arguments>
Zie hier de man page, of gebruik de opdracht 'pdns_control --help'. Andere opdrachten geven direct de output zoals verkregen via de beheersingang door. Zie hier bijvoorbeeld voor de opdracht 'pdns_control help':
[root@localhost ~]# pdns_control help ccounts get cache statistics current-config retrieve the current configuration list-zones [master|slave|native] show list of zones notify <domain> queue a notification notify-host <domain> <host> notify host for specific domain purge [<record>] purge entries from packet cache qtypes get QType statistics quit quit daemon rediscover discover any new zones reload reload all zones remotes get top remotes respsizes get histogram of response sizes retrieve <domain> retrieve slave domain rping ping instance set <var> <value> set config variables show <statistic> show a specific statistic or * to get a list token-login <module> <slot> <pin> Login to a PKCS#11 token uptime get instance uptime version get instance version
Voor de duidelijkheid: deze hulp is dus niet afkomstig van het pdns_control-programma zelf, maar een dump van de 'help'-opdracht zoals die via de control socket naar de server is gestuurd. Om ditzelfde op afstand via de netwerkinterface te doen, geef je deze opdracht:
pdns_control --remote-address=192.0.2.3 --remote-port=53000 --secret=************ help
2.3 Webinterface
Naast deze tekstgeoriënteerde management-ingang biedt de Authoritative Server ook een ingebouwde webserver. Je zet deze als volgt aan en open (hier op poort 8081) voor localhost en lokale netwerken:
webserver=yes webserver-address=127.0.0.1 webserver-port=8081 webserver-allow-from=127.0.0.0/8, 10.0.0.0/8, 192.168.0.0/16, 172.16.0.0/12, ::1/128, fe80::/10 webserver-password=************ webserver-print-arguments=no webserver-loglevel=normal [vanaf versie 4.2.0]
Zoals je vervolgens in je eigen scherm (na het openzetten van poort 8081 in je firewall) of in onderstaand screenshot kunt zien, levert deze webserver alleen een ingang voor (performance) monitoring van je server.
![](http://images.ctfassets.net/yj8364fopk6s/4o40F3U86vuxy04cHihHcu/59127180fac1cb2212ccabc1fb393fc1/PDNS-web-screenshot0.png?w=900&fl=progressive)
2.4 Web API
Als volwaardige interface biedt de Authoritative Server een web API, gebaseerd op REST en JSON volgens de OpenAPI Specification (Swagger). Deze interface maakt gebruikt van dezelfde webserver als de webinterface maar biedt naast statistieken ook functies voor het aanpassen van zone-informatie, metadata en DNSSEC-sleutelmateriaal. Aanzetten van de web API doe je als volgt:
Het voert te ver om hier te laten zien hoe je tegen de web API van de Authoritative Server aan programmeert, maar de beschikbaarheid van de web API is wel makkelijk te testen:
curl -v -H 'X-API-Key: ************' http://127.0.0.1:8081/api/v1/servers/localhost [offerman@vegas DNSSEC2]$ curl -v -H 'X-API-Key: ************' http://192.0.2.3:8081/api/v1/servers/localhost * Trying 192.0.2.3... * TCP_NODELAY set * Connected to 192.0.2.3 (192.0.2.3) port 8081 (#0) > GET /api/v1/servers/localhost HTTP/1.1 > Host: 192.0.2.3:8081 > User-Agent: curl/7.53.1 > Accept: */* > X-API-Key: ************ > < HTTP/1.1 200 OK < Access-Control-Allow-Origin: * < Connection: close < Content-Length: 248 < Content-Security-Policy: default-src 'self'; style-src 'self' 'unsafe-inline' < Content-Type: application/json < Server: PowerDNS/4.1.13 < X-Content-Type-Options: nosniff < X-Frame-Options: deny < X-Permitted-Cross-Domain-Policies: none < X-Xss-Protection: 1; mode=block < * Closing connection 0
Voor de volledige beschrijving van de web API verwijzen we je naar de documentatie van PowerDNS of de machineleesbare Swagger interfacespecificatie hier.
2.5 Bind backend
Voordat we overgaan tot de beschrijving van de DNSSEC-specifieke functionaliteit van de Authoritative Server besteden we hier eerst nog aandacht aan het Bind backend. Juist de 'flick the switch'-ondersteuning van DNSSEC was voor veel operators immers de reden om hun DNS-infrastructuur naar PowerDNS te migreren [1, 2]. Het Bind backend, laat je een (beperkt) 'named.conf' configuratiebestand met bijbehorende zone files inlezen. Omdat het hier niet om een database gaat (dynamisch) maar om bestanden (statisch), kan de Authoritative Server deze connector alleen gebruiken om zone-informatie in te lezen (read-only backend, behalve voor slave zones). Het Bind backend is op het CentOS/RHEL-platform standaard onderdeel van de Authoritative Server, en hoeft dus niet apart geïnstalleerd te worden. Voor deze bespreking hebben we deze connector gecombineerd met die voor MySQL/MariaDB. De configuratie daarvoor ziet er als volgt uit:
launch=bind bind-config=/etc/pdns/named.conf bind-check-interval=600
Daarbij hebben we twee eenvoudige configuratiebestanden 'named.conf' en 'db.example.nl' gecreëerd en in de directory '/etc/pdns/' geplaatst. Het Bind backend ondersteunt maar een handvol van de normale opties in 'named.conf':
options
directory
also-notify
zone
file
type
masters
also-notify
Dit is de inhoud van de 'named.conf' file die we gebruiken om de DNS-server voor ons domein example.nl te initiëren:
options { directory "/etc/pdns"; }; zone "example.nl" { type master; file "db.example.nl"; };
In de log file kunnen we vervolgens zien dat de betreffende zone succesvol is ingelezen:
Sep 15 18:02:47 localhost pdns_server: [bindbackend] Parsing 1 domain(s), will report when done Sep 15 18:02:47 localhost pdns_server: [bindbackend] Done parsing domains, 0 rejected, 1 new, 0 removed
2.6 Gecombineerde backends
Voor ingewikkelder migraties kun je meerdere backends met elkaar combineren door ze achter elkaar in het 'launch' statement te zetten:
launch=gmysql,bind
Bij het beantwoorden van binnenkomende DNS queries worden de verschillende backends in die specifieke volgorde bevraagd. Heb je meerdere backends van hetzelfde type (meestal op verschillende servers), dan kun je die een aparte naam geven:
launch=gmysql,gmysql:server2,bind
In dit voorbeeld is er naast de eerste MySQL/MariaDB-server nog een tweede database server in dienst. Verdere configuratie van die tweede server doe je door de server-naam als volgt in de configuratie-opties te verwerken:
gmysql-server2-host=192.0.2.14 gmysql-server2-port=3306 gmysql-server2-user=pdns gmysql-server2-password=************ gmysql-server2-dbname=pdns gmysql-server2-dnssec=yes
Maar let op: het Bind backend mag maar één enkele keer in het 'launch' statement gebruikt worden. Extra zone files moet je dus aan de bestaande 'named.conf' configuratie toevoegen. Het gebruik van gecombineerde backends wordt door PowerDNS zelf afgeraden als daar geen goede redenen voor zijn. Deze mogelijkheid is nog niet goed uitgedefinieerd en kan bij updates dus voor verrassingen zorgen.
2.7 Meer opties voor het Bind backend
Andere Bind-specifieke opties voor in het configuratiebestand van de Authoritative Server zijn:
bind-dnssec-db: een file voor het opslaan van DNSSEC meta-informatie; nodig als deze server als slave fungeert voor een (al elders) ondertekende zone.
bind-check-interval: deze optie gebruik je in het algemeen als je de informatie in de zone files regelmatig verandert; maar hiermee kun je ook makkelijk een combinatie opzetten met OpenDNSSEC, waarbij je de zone files automatisch laat ondertekenen en wegschrijven, waarna die ondertekende zones ook weer automatisch worden opgepakt door de Authoritative Server.
Daarnaast is er voor Masters een hybride Bind modus. Daarbij komt de zone-informatie uit het Bind backend, maar worden de ondertekening en het sleutelbeheer door de Authoritative Server gedaan. De DNSSEC-gerelateerde records worden in een ander backend opgeslagen, typisch SQLite3 (embedded). Daarmee is dit een logisch vervolg op de gecombineerde backends zoals hierboven beschreven, waarbij de verschillende backends in volgorde worden bevraagd bij het beantwoorden van binnenkomende queries. Net als voor de gecombineerde backends raadt PowerDNS het gebruik van de hybride mode af als daar geen goede redenen voor zijn.
2.8 Migratie naar PowerDNS
De documentatie van PowerDNS geeft nog diverse relatief makkelijke manieren om je oude DNS-informatie naar de Autoritative Server te migreren:
door alle bestaande domeinen eerst als slave aan te maken op de Autoritative Server, en deze domeinen na de zone transfer op de Autoritative Server om te schakelen naar master/native mode;
door de zone files zelf naar (generieke) SQL te converteren met behulp van de tool 'zone2sql';
of door de zone files direct in te lezen met behulp van het 'pdnsutil load-zone'-commando.
Daarnaast is er het 'pdnsutil b2b-migrate'-commando waarmee zones binnen de Autoritative Server zelf over verschillende backends gemigreerd kunnen worden. Daarmee kun je de Autoritative Server ook gebruiken als een tool om allerlei backend/platform conversies op je zone files te doen.
Deel III DNSSEC-specifieke opties en commando's
In dit derde en laatste deel besteden we aandacht aan de DNSSEC-specifieke opties en commando's die nog niet in het voorafgaande aan bod zijn gekomen.
3.1 Cryptografische algoritmen
Daarbij beginnen we met de configuratie-opties voor de cryptografische algoritmen:
default-ksk-algorithm=ecdsa256 het encryptie-algoritme gebruikt voor het KSK-sleutelpaar bij ondertekening via een 'pdnsutil secure-zone'-opdracht of de web API
default-ksk-size= de sleutellengte voor het KSK-sleutelpaar (alleen nodig bij gebruik van crypto-algoritmen waarbij dit niet in de standaard is vastgesteld)
default-zsk-algorithm= idem voor het ZSK-sleutelpaar
default-zsk-size= idem voor het ZSK-sleutelpaar
PowerDNS geeft een lijst van ondersteunde algoritmen, maar of deze ook daadwerkelijk allemaal beschikbaar zijn is afhankelijk van de opties meegegeven bij het compileren van de software. Je kunt een overzicht opvragen met het 'pdnsutil list-algorithms'-commando:
[root@localhost ~]# pdnsutil list-algorithms DNSKEY algorithms supported by this installation of PowerDNS: 5 - RSASHA1 7 - RSASHA1-NSEC3-SHA1 8 - RSASHA256 10 - RSASHA512 13 - ECDSAP256SHA256 14 - ECDSAP384SHA384 15 - ED25519
Hoewel de Authoritative Server dus ook diverse andere cryptografische algoritmen voor DNSSEC [1, 2] ondersteunt, raden we je aan om ECDSA256 te (blijven) gebruiken [3, 4]. Voor wie meer wil weten over de verschillen tussen de cryptografische algoritmen hebben we een aparte sectie op onze 'DNSSEC – Veelgestelde vragen'-pagina geschreven.
3.2 Random generator
Bij het kiezen van het cryptografische algoritme is het belangrijk te weten dat vooral DSA-gebaseerde algoritmen zijn erg gevoelig zijn voor een slecht geïnitialiseerde random generator. Dat kan dus resulteren in een onveilig sleutelpaar. Voor productiesystemen moet daarom altijd deze optie worden gebruikt:
entropy-source=/dev/random
Compleet andere random generators kunnen worden geselecteerd met behulp van de 'rng'-optie:
rng=openssl
Gaat het om een grotere DNS-infrastructuur, dan is omwille van zowel de veiligheid als de schaalbaarheid een bump-in-the-wire architectuur op basis van OpenDNSSEC en een HSM (Hardware Security Module) aan te bevelen. De installatie en configuratie van OpenDNSSEC hebben we in een ander artikel besproken. De Authoritative Server zelf biedt op dit moment experimentele ondersteuning voor PKCS#11.
3.3 Meer DNSSEC-specifieke opties
Hieronder geven we een overzicht van de nog niet besproken DNSSEC-specifieke configuratie-opties:
als deze optie aanstaat worden ook de DNSKEY-, CDS- en CDNSKEY-records uit de zone-informatie ingelezen | |
het aantal seconden dat DNSSEC-sleutels uit de database in de cache worden bewaard | |
maximaal aantal NSEC3 iteraties; deze zet je tegenwoordig altijd op 0 | |
maximaal aantal handtekeningen dat in de cache bewaard kan worden | |
aantal threads dat de server mag gebruiken bij het ondertekenen van domeinen |
3.4 Het 'pdnsutil'-commando
In deze sectie bespreken we het 'pdnsutil'-commando. Dit is het commando dat je als operator waarschijnlijk direct (via de command line) of indirect (in scripts) het meest zult gebruiken bij het beheer van je (ondertekende) zones. Het 'pdnsutil'-commando grijpt direct aan op de database, wat betekent dat je je opdrachten ook makkelijk via het netwerk kunt uitvoeren. Het programma maakt daarbij gebruik van het locale PDNS configuratiebestand. Het 'pdnsutil'-commando droeg eerder de naam 'pdnssec', en dat zie je duidelijk terug in de geboden functionaliteit. Hieronder geven we een overzicht van de DNSSEC-specifieke functies die door dit commando worden ondersteund. In de volgende sectie gebruiken we deze opdrachten om onze zone example.nl te ondertekenen.
activate-zone-key < zone > < key-id > | activeer sleutel < key-id > voor < zone > |
deactivate-zone-key < zone > < key -id> | deactiveer sleutel < key-id > voor < zone > |
add-zone-key < zone > KSK/ZSK [active/inactive] |
genereer een nieuw sleutelpaar voor < zone >, en gebruik 'active' om de zone direct te ondertekenen |
create-bind-db < file > | creëer de (embedded) DNSSEC database (SQLite3) voor de hybride Bind modus (vergeet niet deze file in te stellen in de bind-dnssec-db configuratie-optie) |
disable-dnssec < zone > | deactiveer DNSSEC voor < zone > |
export-zone-dnskey < zone > < key-id > | exporteer (dump) DNSKEY en DS records voor sleutel < key-id > in < zone > |
export-zone-ds < zone > | exporteer (dump) alle KSK DS records in < zone > (waarna je deze kunt uploaden naar de beheerder van het bovenliggende domein voor publicatie) |
export-zone-key < zone > < key-id > | exporteer (dump) de volledige sleutelinformatie (inclusief private key) voor < key-id > in < zone > |
generate-zone-key KSK/ZSK [algorithm] [keybits] | genereer (en dump) een nieuw sleutelpaar (default cryptografisch algoritme: ECDSA256) |
import-zone-key |
importeert een sleutelpaar uit < file > in < zone > |
list-keys [zone] | laat alle sleutelparen zien (voor < zone >) |
rectify-zone < zone > | maak de database-velden auth en ordername opnieuw aan voor < zone> |
rectify-all-zones | maak de database-velden auth en ordername opnieuw aan voor alle zones |
remove-zone-key < zone > < key-id > | verwijder sleutel < key-id > uit < zone > |
secure-zone < zone > | onderteken < zone > (volgens default-instellingen) |
secure-all-zones [increase-serial] | onderteken alle zones (en verhoog daarbij het serial-nummer) |
set-nsec3 < zone > ['< hash-algorithm > < flags > < iterations > < salt >'] [narrow] | geef de NSEC3-instellingen voor < zone >; de parameter-string bevat de informatie die in het NSEC3PARAM record wordt opgenomen; de 'narrow'-optie zet de ondersteuning van White Lies volgens RFC 7129 (Appendix B) aan (ter voorkoming van zone walking) |
unset-nsec3 < zone > | converteer een NSEC3-instelling van < zone > terug naar NSEC |
set-presigned < zone > | gebruik de meegeleverde in-zone) DNSSEC-records voor < zone > |
unset-presigned < zone > | gebruik niet langer de in-zone DNSSEC-records voor < zone > |
show-zone < zone > | laat alle DNSSEC-gerelateerde instellingen voor < zone > zien |
set-publish-cds < zone > [digestalgos] | publiceer de CDS records van < zone >; [digestalgos] bevat een lijst van hash algoritmen voor (C)DS records (default: 2: SHA-256) |
unset-publish-cds < zone > | deactiveer de publicatie van CDS records voor < zone > |
set-publish-cdnskey < zone > | publiceer de CDNSKEY records van < zone > |
unset-publish-cdnskey < zone > | deactiveer de publicatie van CDNSKEY records voor < zone > |
Voor de overige functies van het 'pdnsutil'-commando verwijzen we je naar de man page.
3.5 Ondertekening van een zone
Na al dit voorwerk om de PowerDNS Autoritative Server te installeren, te configureren en een beetje beter te leren kennen, zijn we toe aan de daadwerkelijke ondertekening van onze zone example.nl. Daarbij gaan we uit van de hiervoor beschreven installatie, waarbij deze zone via het Bind backend wordt ingelezen. Omdat dit backend read-only is, creëren we hiermee een hybride Bind-configuratie, waarbij de zone-informatie uit het Bind backend komt maar de ondertekening en het sleutelbeheer door de Authoritative Server gedaan wordt. De handtekeningen (RRSIG records) en het sleutelmateriaal voor het domein wordt in een (embedded) SQLite3 database opgeslagen. Daartoe moeten we om te beginnen deze database aanmaken (als dat nog niet gebeurd is), en genereren we vervolgens de KSK- en ZSK-sleutelparen, waarmee we vervolgens de zone example.nl ondertekenen. Hieronder laten we het hele proces zien, aangevuld met wat commando's om de huidige status weer te geven.
[root@localhost ~]# pdnsutil create-bind-db /etc/pdns/bind-db.sqlite3 [root@localhost ~]# pdnsutil add-zone-key example.nl KSK inactive ecdsa256 Sep 19 17:50:40 [bindbackend] Done parsing domains, 0 rejected, 1 new, 0 removed Added a KSK with algorithm = 13, active=0 1 [root@localhost ~]# pdnsutil add-zone-key example.nl ZSK inactive ecdsa256 Sep 19 17:51:07 [bindbackend] Done parsing domains, 0 rejected, 1 new, 0 removed Added a ZSK with algorithm = 13, active=0 2 [root@localhost ~]# pdnsutil list-keys example.nl Sep 19 17:52:31 [bindbackend] Done parsing domains, 0 rejected, 1 new, 0 removed Zone Type Size Algorithm ID Location Keytag -------------------------------------------------------------------------- example.nl ZSK 256 ECDSAP256SHA256 2 cryptokeys 7300 example.nl KSK 256 ECDSAP256SHA256 1 cryptokeys 4293 [root@localhost ~]# pdnsutil set-nsec3 example.nl '1 0 0 -' NSEC3 set, please secure and rectify your zone. [root@localhost ~]# pdnsutil set-publish-cdnskey example.nl [root@localhost ~]# pdnsutil set-publish-cds example.nl [root@localhost ~]# pdnsutil activate-zone-key example.nl 1 [root@localhost ~]# pdnsutil activate-zone-key example.nl 2 [root@localhost ~]# pdnsutil check-zone example.nl Sep 19 17:53:14 [bindbackend] Done parsing domains, 0 rejected, 1 new, 0 removed Checked 19 records of 'example.nl', 0 errors, 0 warnings. [root@localhost ~]# pdnsutil show-zone example.nl Sep 19 18:01:16 [bindbackend] Done parsing domains, 0 rejected, 1 new, 0 removed This is a Master zone Last SOA serial number we notified: 0 != 2017101300 (serial in the database) Metadata items: NSEC3PARAM 1 0 0 - PUBLISH-CDNSKEY 1 PUBLISH-CDS 1,2 Zone has hashed NSEC3 semantics, configuration: 1 0 0 - keys: ID = 2 (ZSK), flags = 256, tag = 7300, algo = 13, bits = 256 Active ( ECDSAP256SHA256 ) ID = 1 (KSK), flags = 257, tag = 4293, algo = 13, bits = 256 Active ( ECDSAP256SHA256 ) KSK DNSKEY = example.nl. IN DNSKEY 257 3 13 y5JN0NxY8vYMyKDSR3D+6lJDJmQUAp1SsCRaMSOPSAMGvslhBOy4GXQxeMpxmhvM4aFdHAm09TtGwirSBS/ULw== ; ( ECDSAP256SHA256 ) DS = example.nl. IN DS 4293 13 1 78776d2a17958d3bac818b26172477119f4c2213 ; ( SHA1 digest ) DS = example.nl. IN DS 4293 13 2 a31facbfd1dff2003b91bb4348bd923dc9dabab3987b70371af1e6fc8eb7eda2 ; ( SHA256 digest ) DS = example.nl. IN DS 4293 13 4 3bd91b55b497a11a27efbb63bd97180b3946186257f6f02b3ce780d7c837fb419206ba70891c3fd45a4a3071f9e83172 ; ( SHA-384 digest ) [root@localhost ~]# pdnsutil export-zone-dnskey example.nl 1 example.nl IN DNSKEY 257 3 13 y5JN0NxY8vYMyKDSR3D+6lJDJmQUAp1SsCRaMSOPSAMGvslhBOy4GXQxeMpxmhvM4aFdHAm09TtGwirSBS/ULw== [root@localhost ~]# pdnsutil export-zone-ds example.nl Sep 19 18:07:06 [bindbackend] Done parsing domains, 0 rejected, 1 new, 0 removed example.nl. IN DS 4293 13 1 78776d2a17958d3bac818b26172477119f4c2213 ; ( SHA1 digest ) example.nl. IN DS 4293 13 2 a31facbfd1dff2003b91bb4348bd923dc9dabab3987b70371af1e6fc8eb7eda2 ; ( SHA256 digest ) example.nl. IN DS 4293 13 4 3bd91b55b497a11a27efbb63bd97180b3946186257f6f02b3ce780d7c837fb419206ba70891c3fd45a4a3071f9e83172 ; ( SHA-384 digest )
Welke sleutelinformatie je nodig hebt om de cryptografische koppeling (een schakel in de chain of trust) te maken met het bovenliggende domein, hangt af van de registry. Wij als beheerder van het .nl top-level domein vragen onze registrars niet om de DS records maar om de DNSKEY records. Door uit die DNSKEY records zelf de DS records te genereren, houden wij controle over het daarbij gebruikte hash-algoritme. Maak je een vergelijkbare hybride set-up, vergeet dan niet om de locatie van de SQLite3 database aan de configuratie van de Autoritative Server toe te voegen:
bind-dnssec-db=/etc/pdns/bind-db.sqlite3
3.6 Alles in één keer ondertekend
Wil je een bestaande zone in één keer ondertekenen, uitgaande van de defaults, dan kun je de hele klus uitvoeren met behulp van slechts twee opdrachten:
pdnsutil secure-zone example.nl pdnsutil rectify-zone example.nl
Maar dat kan ook in één keer voor alle domeinen:
pdnsutil secure-all-zones pdnsutil rectify-all-zones
Als je de eenvoud hiervan vergelijkt met de configuratie van DNSSEC op andere DNS-server software, dan begrijp je gelijk waarom de PowerDNS Autoritative Server zo populair was bij de introductie van DNSSEC (voor de .nl-zone sterk gedreven door de incentive-regeling voor registrars).
3.7 Dynamische Lua records
Als laatste willen we hier nog de in Autoritative Server ingebouwde Lua engine bespreken. Lua is een wat ongelukkig ontworpen taal, maar als embedded engine wel enorm handig om gebruikers een run-time scripting-ingang tot je software te geven. Voor ontwikkelaars is het namelijk heel makkelijk om snel nieuwe interfaces naar hun C-code toe te voegen. Met behulp van de ingebouwde Lua-faciliteit (vanaf versie 4.2) kun je de antwoorden van de DNS-server afhankelijk maken van de huidige omstandigheden. Dat doe je door kleine stukjes Lua-code in je DNS-records op te nemen, waarmee de response van de server dynamisch bepaald wordt op het moment dat er een query voor het betreffende record binnen komt. Een eenvoudig voorbeeld maakt het een stuk duidelijker:
www IN LUA A "pickclosest({'192.0.2.14','198.51.100.14'})"
Hier krijgt de bevrager de dichtstbijzijnde server terug in de response. Daarbij wordt gebruik gemaakt van het GeoIP backend om de kortste (fysieke) afstand tussen bevrager en host te bepalen. Om de dynamische Lua records te kunnen gebruiken, moet je eerst deze configuratie-optie aan zetten:
enable-lua-records=yes
of per zone:
ENABLE-LUA-RECORDS = 1
Daarnaast is er nog een instelling waarbij de scripts bij executie niet steeds een aparte maar een gedeelde context (per thread) krijgen. Deze mogelijkheid activeer je als volgt:
enable-lua-records=shared
Omdat de inhoud van de records dynamisch bepaald wordt, kunnen Lua records niet worden gecombineerd met presigned zones. Dat betekent dat de Authoritative Server de DNS responses alleen on-the-fly kan ondertekenen, en dat daarvoor ook de private sleutel op de publieke servers aanwezig moet zijn. Het is de bedoeling dat de dynamische Lua records gestandaardiseerd worden, zodat deze feature tezijnertijd ook door andere DNS server software geïmplementeerd kan worden. Meer informatie over de dynamische Lua records vind je hier.
3.8 Afsluitend
De PowerDNS Autoritative Server is nogal uitgebreid, waardoor het even kan duren voordat je je weg hebt gevonden, maar de software heeft een mooie architectuur: de DNS-server zelf fungeert als centrale spil met daaromheen allerlei in- en uitgangen. Via de backend connectors gaat het naar de onderliggende databases. Transfers naar andere Autoritative Servers kunnen eenvoudig plaatsvinden via database replicatie. Naast directe toegang tot de database zijn er de web-interface en API, en de control socket met bijbehorende command line tools. Opvallende features van de PowerDNS Autoritative Server zijn de 'flick the switch'-ondersteuning van DNSSEC (zoals je ziet spreken we in dit artikel nergens over timing, herondertekening en sleutelbeheer), de dynamische Lua records, en de mogelijkheid om zone-informatie tussen verschillende formaten te converteren door deze van de ene naar de andere back-end over te zetten. Meer informatie over de PowerDNS Autoritative Server vind je hier [1, 2, 3].