PowerDNS auf einem autoritativem Nameserver installieren



PowerDNS ist in den meisten Paketmanagern verbreiteter Distributionen vorhanden, allerdings nicht notwendigerweise in der aktuellsten Version. Es ist daher zu empfehlen die PowerDNS Repositories, die auf der Entwicklerseite zur Verfügung gestellt werden, einzubinden und dann nach einem Update der Pakete die neueste stabile Version (4.1.3) zu installieren. Diese unterstützt auch nahezu alle gängigen DNSSEC-Algorithmen.

Auf Homepage findet sich auch eine umfangreiche Dokumentation für den Betrieb als autoritativer Nameserver, unsere Seite soll aber den schnellen Einstieg und den Betrieb mit DNSSEC darlegen.


  1. Repositories einbinden
  2. Pakete installieren
  3. Datenbank anpassen
  4. PowerDNS konfigurieren
  5. Firewall konfigurieren
  6. DNSSEC aktivieren
  7. Testen


Backend

PowerDNS unterstützt eine Vielzahl von Backends für die Speicherung der Zonendaten. In unserem Beispiel verwenden wir aber nur das MySQL-Backend.


Repositories einbinden


Auf der PowerDNS repositories-Seite finden sich Repositories fur Debian, Ubuntu, CentOS und SLES für deren verschiedenen Versionen, aufgeteilt in Recursor und autoritativen PowerDNS. Die Repos für Debian 9 müssen in


/etc/apt/sources.list.d/pdns.list

deb [arch=amd64] http://repo.powerdns.com/debian stretch-auth-41 main


und


/etc/apt/preferences.d/pdns

Package: pdns-*
Pin: origin repo.powerdns.com
Pin-Priority: 600


eingetragen werden. Sowie noch den öffentlichen GPG-Schlüssel aufnehmen


curl https://repo.powerdns.com/FD380FBB-pub.asc | sudo apt-key add -


Pakete pdns-server und mysql-server installieren

Dann kann man die Distributionspakete updaten und den autoritativen Teil, d.h. pdns-server, installieren:


apt-get update
apt-get install pdns-server pdns-backend-mysql mysql-server


Datenbank anpassen

Nach der MySQL-Installation über den Paketmanager, das wir im selben Aufruf mit pdns-server erledigt haben, müssen wir noch die Datenbank anpassen.


mysql_secure_installation

mysql_secure_installation Passwort und Ausgabe

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!


Dann wird in MySQL die Datendank "pdns" mit den nachfolgenden Tabellen erzeugt:


CREATE DATABASE pdns character set utf8;
GRANT ALL ON pdns.* TO 'pdns'@'localhost' IDENTIFIED BY '<PDNSPASSWORD>';
FLUSH PRIVILEGES;


mysql -u root -p'YOURMYSQLPASSWORD' powerdns < /usr/share/doc/pdns-backend-mysql/schema.mysql.sql

erzeugt das für Powerdns benötigte pdns-Schema in der MySQL-Datennbank.


Dies kann man dann noch aus Interesse bzw. zur Kontrolle sich ansehen:


MariaDB [(none)]> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| powerdns           |
+--------------------+
4 rows in set (0.00 sec)

MariaDB [(none)]> use powerdns;
Database changed
MariaDB [pdns]> SHOW TABLES;
+--------------------+
| Tables_in_powerdns |
+--------------------+
| comments           |
| cryptokeys         |
| domainmetadata     |
| domains            |
| records            |
| supermasters       |
| tsigkeys           |
+--------------------+
7 rows in set (0.01 sec)


Der Datenbank-Storagemanager sollte innodb sein, und die Dateigröße in der MySQL-Konfiguration auf 64M erhöht werden. Dazu stoppen wir MySQL:


service mysql stop


löschen die existierenden Dateien - wenn schon immodb benutzt wurde, eine Sicherungskopie erstellen!


rm /var/lib/mysql/ib_logfile*


Dann setzen wir die file_size auf 64M:


cp /etc/mysql/my.cnf /etc/mysql/my.cnf.orig
vim /etc/mysql/my.cnf


[mysql]
innodb_log_file_size = 64M


einkommentieren und starten den MySQL-Server wieder:


service mysql start



PowerDNS-Konfiguration anpassen

Wir behalten eine Sicherungskopie der Originalkonfiguration bei:

cp /etc/powerdns/pdns.d/pdns.local.gmysql.conf /etc/powerdns/pdns.d/pdns.local.gmysql.conf.orig


Editieren dann die Konfigurationsdatei, /etc/powerdns/pdns.d/pdns.local.gmysql.conf, um das MySQL-Backend anzubinden, hier setzen wir das Passwort für den Benutzer pdns.


# MySQL Configuration

#

# Launch gmysql backend

launch+=gmysql


# gmysql parameters

gmysql-host=localhost

gmysql-port=3306

gmysql-dbname=pdns

gmysql-user=pdns

gmysql-password=<PDNSPASSWORD>

gmysql-dnssec=yes


Firewall anpassen

PowerDNS soll die Zonendaten von dnssec-phpipam per MySQL übernehmen. Daher erlauben wir Verbindungen über Port 3306 von dessen IP 10.156.108.35:


ufw allow from 10.156.108.35 port 3306


Für die Zonentransfers, bzw. wenn der Server der öffentliche PowerDNS sein soll, muss noch TCP Port 53 geöffnet werden. Wenn man ganz auf Nummer sicher gehen will, kann man das nur auf die IPs der jeweiligen Slave-Nameserver, z.B. den nachgeschalteten Signing Proxy (in unserem Fall dnssec-powerproxy mit der IP 10.156.116.43), einschränken:


ufw allow from 10.156.116.43 port 53


DNSSEC für Zonen aktivieren

Die DNSSEC-Signierung muss pro Zone gesetzt werden. Daher muss hierfür schon mindestens eine Zone vorhanden sein. Wir werden darauf beim Import der Daten aus phpIPAM eingehen.


Test von PowerDNS

Nun können wir unsere PowerDNS-Installation einen ersten Test unterziehen.


service pdns start
service pdns status
● pdns.service - PowerDNS Authoritative Server
   Loaded: loaded (/lib/systemd/system/pdns.service; enabled; vendor preset: enabled)
   Active: active (running) since Mon 2018-05-28 15:12:34 CEST; 1 weeks 2 days ago
     Docs: man:pdns_server(1)
           man:pdns_control(1)
           https://doc.powerdns.com
 Main PID: 97810 (pdns_server)
    Tasks: 8 (limit: 19660)
   CGroup: /system.slice/pdns.service
           └─97810 /usr/sbin/pdns_server --guardian=no --daemon=no --disable-syslog --write-pid=no


Um die Netzwerkverbindungen zu überprüfen, installieren wir die net-tools, die uns netstat zur Verfügung stellen:


apt-get install net-tools


netstat -npl | grep 'pdns\|mysql'
tcp        0      0 0.0.0.0:53              0.0.0.0:*               LISTEN      97810/pdns_server   
tcp        0      0 127.0.0.1:3306          0.0.0.0:*               LISTEN      116326/mysqld       
tcp6       0      0 :::53                   :::*                    LISTEN      97810/pdns_server   
udp        0      0 0.0.0.0:53              0.0.0.0:*                           97810/pdns_server   
udp6       0      0 :::53                   :::*                                97810/pdns_server   
unix  2      [ ACC ]     STREAM     LISTENING     1710697  97810/pdns_server    /var/run/pdns.controlsocket
unix  2      [ ACC ]     STREAM     LISTENING     1874800  116326/mysqld        /var/run/mysqld/mysqld.sock


zeigt die geöffneten Ports 53 und 3306, sowie die Sockets in /var/run, die von den Control-Programmen verwendet werden.


Eine dig-Anfrage an den localhost liefert dann eine - allerdings noch leere - Antwort:


dig @127.0.0.1

; <<>> DiG 9.10.3-P4-Debian <<>> @127.0.0.1
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: REFUSED, id: 65467
;; flags: qr rd; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 1
;; WARNING: recursion requested but not available

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1680
;; QUESTION SECTION:
;.                IN    NS

;; Query time: 4 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Wed Jun 06 15:36:51 CEST 2018
;; MSG SIZE  rcvd: 28