# Pdns admin setup

  1. Installation benötigter Software
  2. Einrichtung von PowerDNS-Admin
  3. Konfiguration vom Ngnix
  4. Erstellen von Diensten
  5. PowerDNS-Admin GUI

# Installation benötigter Software

Zunächst installieren wir den Ngnix-Webserver sowie die benötigten Packete. Die Installation starten wir mit dem folgenden Befehl.

apt install nginx python3-dev libsasl2-dev libldap2-dev libssl-dev libxml2-dev libxslt1-dev libxmlsec1-dev libffi-dev pkg-config apt-transport-https virtualenv build-essential libmariadb-dev git python3-flask -y

Im nächsten Schritt installieren wir NodeJS und Yarn. Dies geht mit den folgenden Befehlen.

curl -sL https://deb.nodesource.com/setup_14.x | bash - 
apt-get install nodejs -y

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 -y
apt install yarn -y

# Einrichtung von PowerDNS-Admin

Als erstes laden wir PowerDNS-Admin von Github runter.

git clone https://github.com/ngoduykhanh/PowerDNS-Admin.git /var/www/html/pdns

Im nächsten Schritt wechseln wir in den Ordner, erstellen das virtuelle Environment von Python, aktivieren das virtuelle Environment, installieren die benötigten Packete und deaktivieren dies danach.

cd /var/www/html/pdns/
virtualenv -p python3 flask
source ./flask/bin/activate
pip install -r requirements.txt
deactivate

Nun hinterlegen wir die Datenbank verbindung in der Config-Datei.

nano /var/www/html/pdns/powerdnsadmin/default_config.py
SALT = 'yoursecretekey'
SECRET_KEY = 'yoursecretekey'
BIND_ADDRESS = '0.0.0.0'
PORT = 9191
HSTS_ENABLED = False
OFFLINE_MODE = False

SQLA_DB_USER = 'pdns'
SQLA_DB_PASSWORD = 'secret'
SQLA_DB_HOST = 'localhost'
SQLA_DB_NAME = 'powerdns'
SQLALCHEMY_TRACK_MODIFICATIONS = True

Jetzt aktivieren wir das virtuelle Environment von Python, lassen die Datenbank anpassen, erzeugen die benötigten Datein und deaktivieren das Environment.

cd /var/www/html/pdns/
source ./flask/bin/activate

export FLASK_APP=powerdnsadmin/__init__.py
flask db upgrade
yarn install --pure-lockfile
flask assets build

deactivate

Damit PowerDNS-Admin mit der API vom PowerDNS komunizieren kann müssen wir einen API-Key in der Konfituration von PowerDNS hinterlegen.

nano /etc/powerdns/pdns.conf
api=yes
api-key=yoursecretekey

# Konfiguration vom Ngnix

Im ersten Schritt legen wir eine Konfiguration für den Ngnix an.

nano /etc/nginx/conf.d/pdns-admin.conf
server {
  listen	*:80;
  server_name               pdnsadmin.example.de;

  index                     index.html index.htm index.php;
  root                      /var/www/html/pdns;
  access_log                /var/log/nginx/pdnsadmin_access.log combined;
  error_log                 /var/log/nginx/pdnsadmin_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 /var/www/html/pdns/powerdnsadmin;

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

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

  location / {
    proxy_pass            http://unix:/run/pdnsadmin/socket;
    proxy_read_timeout    120;
    proxy_connect_timeout 120;
    proxy_redirect        off;
  }

}

Um die Konfiguration zu testen verwenden wir den Befehl

nginx -t
Sample Output
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Wenn die Konfiguration angepasst ist bearbeiten wir die Besitzer der Konfiguration und starten den Ngnix neu.

systemctl restart nginx

# Erstellen von Diensten

Zunächst legen wir einen Dienst sowie einen für PowerDNS-Admin an.

printf "[Unit]
Description=PowerDNS-Admin
Requires=pdnsadmin.socket
After=network.target

[Service]
PIDFile=/run/pdnsadmin/pid
User=pdns
Group=pdns
WorkingDirectory=/var/www/html/pdns
ExecStart=/var/www/html/pdns/flask/bin/gunicorn --pid /run/pdnsadmin/pid --bind unix:/run/pdnsadmin/socket 'powerdnsadmin:create_app()'
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s TERM $MAINPID
PrivateTmp=true

[Install]
WantedBy=multi-user.target" >> /etc/systemd/system/pdnsadmin.service

printf "[Unit]
Description=PowerDNS-Admin socket

[Socket]
ListenStream=/run/pdnsadmin/socket

[Install]
WantedBy=sockets.target" >> /etc/systemd/system/pdnsadmin.socket

Nun passen wir die Rechte von den erstellen Datein an.

echo "d /run/pdnsadmin 0755 pdns pdns -" >> /etc/tmpfiles.d/pdnsadmin.conf
mkdir /run/pdnsadmin/
chown -R pdns: /run/pdnsadmin/
chown -R pdns: /var/www/html/pdns/powerdnsadmin/

Jetzt laden wir den Systemd-Daemon neu und aktivieren PowerDNS-Admin

systemctl daemon-reload
systemctl enable --now pdnsadmin.service pdnsadmin.socket

-- ##PowerDNS-Admin GUI

Um PowerDNS-Admin zu nutzen rufen wir http://pdnsadmin.example.de auf und erstellen uns einen Benutzer. Danach gehen wir unter Settings->PDNS unt hinterlegen die PowerDNS-API URL, den PowerDNS-API Key und die PowerDNS Version. Dies sieht dann wie folgt aus.

Zum Schluss empfiehlt es sich unter Settings->Authentication die Registration zu deaktivieren.