PowerDNS et PowerAdmin
======================

Deja nous allons commencer par installer PowerDNS et PowerAdmin avec un backend SQLite.

Pour simplifier les choses je pars sur le PowerDNS present dans les depots de base ;
PowerDNS propose aussi ses propres `repos`_.

Installation et configuration PowerDNS
--------------------------------------

.. code-block:: bash

    dnf install epel-release

    dnf install pdns
    dnf install pdns-backend-sqlite

Maintenant on peut passer a la conf de PowerDNS ``/etc/pdns/pdns.conf``.

.. code-block:: ini

    # allow-axfr-ips permet de definir les IP des serveurs qui ont le droit de repliquer
    allow-axfr-ips=127.0.0.0/8,::1,185.119.254.173

    # activation de l'api
    api=yes
    api-key=(openssl rand -hex 32)

    # configuration du SOA par defaut des zones
    default-soa-content=galaxy.as51144.net noc.g3e.fr. 0 10800 3600 604800 3600

    # configuration du backend
    launch=gsqlite3
    gsqlite3-database=/var/lib/powerdns/pdns.sqlite3

    primary=yes

    # activation du serveur web
    webserver=yes
    webserver-address=127.0.0.1
    webserver-port=8081

    # intervalle de rafraichissement du cache, 300 par defaut
    zone-cache-refresh-interval=10

On va donc initialiser la base de donnees.

.. code-block:: bash

    groupadd -r pdnsdb
    usermod -aG pdnsdb pdns

    install -d -o pdns -g pdnsdb -m 2770 /var/lib/powerdns

    sqlite3 /var/lib/powerdns/pdns.sqlite3 \
        < /usr/share/doc/pdns/schema.sqlite3.sql

    chown -R pdns:pdnsdb /var/lib/powerdns


Installation et configuration PowerAdmin
----------------------------------------

.. code-block:: bash

    dnf -y install nginx php-fpm php-cli php-pdo php-intl php-xml php-mbstring \
        sqlite tar

Maintenant je vous laisse recuperer le .tar.gz de `poweradmin`_ dans /tmp.
Ici nous allons installer PowerAdmin 4.4.1, mais pour l'utilisation des catalogs nous aurons
besoin de la version 4.5.x, qui n'est pas encore sortie.

Une fois le .tar.gz present dans /tmp :

.. code-block:: bash

    cd /tmp
    install -d /var/www/poweradmin
    tar xzf poweradmin.tar.gz -C /var/www/poweradmin --strip-components=1

    usermod -aG pdnsdb nginx

    install -d -o pdns -g pdnsdb -m 2770 /var/lib/poweradmin

    sqlite3 /var/lib/poweradmin/pdns.sqlite3 \
        < /var/www/poweradmin/sql/poweradmin-sqlite-db-structure.sql

    chown -R pdns:pdnsdb /var/lib/poweradmin

    chmod 0660 /var/lib/poweradmin/pdns.sqlite3



``/var/www/poweradmin/config/settings.php``

.. code-block:: php

    <?php
    return [
        'database' => [
            'type'     => 'sqlite',
            'file'     => '/var/lib/poweradmin/pdns.sqlite3',
            'host'     => '',
            'port'     => '',
            'user'     => '',
            'password' => '',
            'name'     => '',
            'charset'  => 'utf8',
            'debug'    => false,
        ],
        'security' => [
            'session_key' => '(openssl rand -hex 32)',
        ],
        'dns' => [
            'backend' => 'api',
            'hostmaster' => 'noc.g3e.fr',
            'ns1'        => 'galaxy.as51144.net',
            'ns2'        => 'icare.as51144.net',
        ],
        'pdns_api' => [
            'display_name' => 'PowerDNS',
            'url'          => 'http://127.0.0.1:8081/',
            'key'          => '(valeur generee dans pdns)',
            'server_name'  => 'localhost',
        ],
    ];

.. code-block:: bash

    chown root:nginx /var/www/poweradmin/config/settings.php
    chmod 0640 /var/www/poweradmin/config/settings.php
    rm -rf /var/www/poweradmin/install

Vu que nous venons de supprimer install, nous allons creer manuellement le premier utilisateur :

.. code-block:: bash

    php -r 'echo password_hash("MonMotDePasseTemporaire", PASSWORD_BCRYPT, ["cost" => 12]) . "\n";'
    sqlite3 /var/lib/poweradmin/pdns.sqlite3

Puis on copie et on utilise le mot de passe '$2y$12$…'.

.. code-block:: sql

    INSERT INTO users (username, password, fullname, email, description, perm_templ, active, use_ldap, auth_method)
    VALUES ('admin', '$2y$12$…', 'Administrator', 'hostmaster@example.net', '', 1, 1, 0, 'sql');

Configuration de php-fpm :

.. code-block:: bash

    sed -i -e 's/^user = apache/user = nginx/' \
       -e 's/^group = apache/group = nginx/' \
       -e 's/^listen.owner = nobody/listen.owner = nginx/' \
       -e 's/^listen.group = nobody/listen.group = nginx/' /etc/php-fpm.d/www.conf

    chown root:nginx /var/lib/php/session /var/lib/php/opcache /var/lib/php/wsdlcache
    chmod 0770       /var/lib/php/session /var/lib/php/opcache /var/lib/php/wsdlcache

    systemctl enable --now php-fpm


On peut continuer avec la configuration de nginx ``/etc/nginx/conf.d/poweradmin.conf``.

.. code-block::

    server {
        listen 80;
        server_name galaxy.as51144.net;
        root /var/www/poweradmin;
        index index.php;

        location / {
            try_files $uri $uri/ /index.php$is_args$args;
        }

        location ~ \.php$ {
            fastcgi_pass unix:/run/php-fpm/www.sock;
            fastcgi_index index.php;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            fastcgi_param HTTP_AUTHORIZATION $http_authorization;
            fastcgi_read_timeout 180;
            include fastcgi_params;
        }

        location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ { expires max; access_log off; }

        location ~ /\.                                   { deny all; }
        location ~ ^/vendor/twbs/(bootstrap|bootstrap-icons)/ { allow all; }
        location ~ /(config|lib|tests|vendor)/           { deny all; }
        location ~ \.(sql|sqlite|sqlite3|db|md|log)$     { deny all; }
    }

On peut tester que la conf est bonne :

.. code-block:: bash

    nginx -t


Activation et demarrage
-----------------------

.. code-block::

    systemctl enable --now pdns
    systemctl enable --now php-fpm
    systemctl enable --now nginx

Normalement maintenant tout fonctionne. Youhou.

.. _repos: https://repo.powerdns.com/
.. _poweradmin: https://github.com/poweradmin/poweradmin
