CentOS 7 x86_64に PowerDNS Authoritative Server 4.0.4 をインストール

# CentOS 7 x86_64に PowerDNS Authoritative Server 4.0.4 をインストール

[PowerDNS Authoritative Server](https://www.powerdns.com/auth.html) (以降「PowerDNS」) はバックエンドに MariaDB などの DB を使用可能な DNS 権威サーバ。
この PowerDNS を CentOS 7 x86_64 にインストールしてみる。
また、PowerDNS のフロントエンドとして Poweradmin を試す。

## OS インストール

CentOS 7 x86_64 を英語で Minimal install する。

インストールが終わったらアップデートをかけておく。

```shell-session
$ sudo yum update
```

動作確認に nslookup (お好みで dig でも hosts でも) を使うので bind-utils を入れておく。

```shell-session
$ sudo yum install bind-utils
```

ないと不便なので wget も入れておく。

```shell-session
$ sudo yum install wget
```

今回は検証環境なので無用なトラブルを避けるため firewalld は止めておく。

```shell-session
$ sudo systemctl stop firewalld.service
$ sudo systemctl disable firewalld.service
```

いったん再起動。

```shell-session
$ sudo systemctl reboot
``` 

## PowerDNS インストール

https://repo.powerdns.com/#centos を参考に、PowerDNS のリポジトリから PowerDNS のパッケージをインストールする。

```shell-session
$ sudo yum install epel-release yum-plugin-priorities
$ sudo curl -o /etc/yum.repos.d/powerdns-auth-master.repo https://repo.powerdns.com/repo-files/centos-auth-master.repo
$ sudo yum install pdns
```

インストール後は pdns アカウントが作成されている。

```shell-session
$ id pdns
uid=996(pdns) gid=994(pdns) groups=994(pdns)
```

この段階では PowerDNS は起動していない。

```shell-session
$ systemctl status pdns.service
* pdns.service - PowerDNS Authoritative Server
   Loaded: loaded (/usr/lib/systemd/system/pdns.service; disabled; vendor preset: disabled)
   Active: inactive (dead)
   Docs: man:pdns_server(1)
         man:pdns_control(1)
         https://doc.powerdns.com
```

## BIND 互換のゾーンファイルを使う

PowerDNS は DB 以外にも[さまざまなバックエンド](https://doc.powerdns.com/md/authoritative/)を使用可能である。
まずは [BIND 互換のバックエンド](https://doc.powerdns.com/md/authoritative/backend-bind/)を使い、 DB を使わずテキストファイルをゾーンファイルとして使うよう設定して起動する。

```shell-session
$ cd /etc/pdns
$ sudo cp -p pdns.conf pdns.conf.orig
$ sudo vi pdns.conf
$ sudo grep -v ^# pdns.conf | grep -v ^$
daemon=no
guardian=no
launch=bind
setgid=pdns
setuid=pdns
bind-config=/etc/pdns/bind/named.conf
```

追加したのは「launch」の行と「bind-config」の行。
「[launch](https://doc.powerdns.com/md/authoritative/settings/#launch)」は使用するバックエンドの種類を指定する。
ここでは bind バックエンドを使用する。
「[bind-](https://doc.powerdns.com/md/authoritative/backend-bind/)」で始まる項目は bind バックエンド用の設定項目。
「bind-config」では BIND の named.conf 互換の設定ファイルを指定する。

その named.conf ファイルを作成する。

```shell-session
$ cd /etc/pdns
$ sudo mkdir bind
$ cd bind
$ sudo vi named.conf
$ cat named.conf
options {
        directory "/etc/pdns/bind";
};

zone "example.com" in {
        type master;
        file "example.com.zone";
};

zone "20.168.192.in-addr.arpa" in {
        type master;
        file "192.168.20.0.rev";
};
```

ゾーンファイルも作成する。

```shell-session
$ sudo vi example.com.zone
$ cat example.com.zone
$TTL    3600

@       IN SOA  ns.example.com. hostmaster.example.com. (
                        2017082500      ; Serial
                        3600            ; Refresh
                        900             ; Retry
                        604800          ; Expire
                        3600 )          ; Minimum

@       IN NS   ns.example.com.
ns      IN A    192.168.20.129
$ sudo vi 192.168.20.0.rev
$ cat 192.168.20.0.rev
$TTL    3600

@       IN SOA  ns.example.com. hostmaster.example.com. (
                        2017082500      ; Serial
                        3600            ; Refresh
                        900             ; Retry
                        604800          ; Expire
                        3600 )          ; Minimum

@       IN NS   ns.example.com.
129     IN PTR  ns.example.com.
```

PowerDNS を起動する。

```shell-session
$ sudo systemctl start pdns.service
```

名前が引けるか動作確認。

```shell-session
$ nslookup ns.example.com 127.0.0.1
Server:         127.0.0.1
Address:        127.0.0.1#53

Name:   ns.example.com
Address: 192.168.20.129

$ nslookup 192.168.20.129 127.0.0.1
Server:         127.0.0.1
Address:        127.0.0.1#53

129.20.168.192.in-addr.arpa     name = ns.example.com.

```

OK ぽいので OS 起動時に PowerDNS が起動するようにしておく。

```shell-session
$ sudo systemctl enable pdns.service
```

## MariaDB を使う

[bind バックエンドのドキュメント](https://doc.powerdns.com/md/authoritative/backend-bind/)によると、BIND 互換機能はあくまでデモ用とのこと。
実環境で使うのは避けた方がいいかもしれない。

せっかく PowerDNS を使うんだから DB をバックエンドにしてみる。
今回は MariaDB を使用する。

### MariaDB インストール

MariaDB をインストールし、起動する。

```shell-session
$ sudo yum install mariadb-server
$ sudo systemctl start mariadb.service
$ sudo systemctl enable mariadb.service
```

MariaDB の初期設定を行なう。

```shell-session
$ sudo mysql_secure_installation
Enter current password for root (enter for none):
  → そのまま Enter
Set root password? [Y/n]
  → y
New password:
  → MariaDB の root ユーザのパスワードを決め、入力
Re-enter new password:
  → 再度入力
Remove anonymous users? [Y/n]
  → y
Disallow root login remotely? [Y/n]
  → y
Remove test database and access to it? [Y/n]
  → y
Reload privilege tables now? [Y/n]
  → y
```

### MariaDB を PowerDNS 用に設定

MariaDB を PowerDNS から使えるよう、テーブル作成などの初期設定を行なう。

初期設定用の SQL ファイルを取得しておく。

```shell-session
$ cd
$ wget https://raw.githubusercontent.com/PowerDNS/pdns/rel/auth-4.0.x/modules/gmysqlbackend/schema.mysql.sql
```

PowerDNS 用のデータベース pdns を作成し、初期設定用の SQL を実行する。

```shell-session
$ mysql -u root -p
MariaDB [(none)]> CREATE DATABASE pdns;
MariaDB [(none)]> USE pdns;
MariaDB [pdns]> source schema.mysql.sql
MariaDB [pdns]> exit
```

データベース pdns に先ほど作った BIND 互換設定ファイル、ゾーンファイルをインポートする。

```shell-session
$ cd
$ zone2sql --named-conf=/etc/pdns/bind/named.conf --gmysql >bind.sql
$ mysql -u root -p
MariaDB [(none)]> USE pdns;
MariaDB [pdns]> source bind.sql
MariaDB [pdns]> exit
```

MariaDB に PowerDNS からのアクセス用のユーザ powerdns を作成する。
権限は SELECT のみでよさそう。

```shell-session
$ mysql -u root -p
MariaDB [(none)]> CREATE USER powerdns@127.0.0.1 IDENTIFIED BY 'pAssw0rd';
MariaDB [(none)]> GRANT SELECT ON pdns.* TO powerdns@127.0.0.1;
MariaDB [(none)]> exit
```

### PowerDNS を MariaDB を使うよう設定

いったん PowerDNS を停止。

```shell-session
$ sudo systemctl stop pdns.service
```

BIND 互換設定はもういらないので、削除しておく。

```shell-session
$ cd /etc/pdns
$ sudo cp pdns.conf.orig pdns.conf
$ sudo rm bind/*
$ sudo rmdir bind
```

MariaDB を使う場合、PowerDNS のバックエンドとしては [Generic MySQL backend](https://doc.powerdns.com/md/authoritative/backend-generic-mysql/) (gmysql) を使用する。

gmysql バックエンドは別パッケージに分かれているので、インストール。

```shell-session
$ sudo yum install pdns-backend-mysql
```

PowerDNS を MariaDB を使うよう設定。

```shell-session
$ cd /etc/pdns
$ sudo vi pdns.conf
$ sudo grep -v ^# pdns.conf | grep -v ^$
daemon=no
guardian=no
launch=gmysql
setgid=pdns
setuid=pdns
gmysql-host=127.0.0.1
gmysql-user=powerdns
gmysql-password=pAssw0rd
gmysql-dbname=pdns
```

「launch」は gmysql を指定。
「[gmysql-](https://doc.powerdns.com/md/authoritative/backend-generic-mysql/)」の各項目で接続先やユーザ名などを指定。

設定が終わったので PowerDNS を起動。

```shell-session
$ sudo systemctl start pdns.service
```

名前が引けるか動作確認。

```shell-session
$ nslookup ns.example.com 127.0.0.1
Server:         127.0.0.1
Address:        127.0.0.1#53

Name:   ns.example.com
Address: 192.168.20.129

$ nslookup 192.168.20.129 127.0.0.1
Server:         127.0.0.1
Address:        127.0.0.1#53

129.20.168.192.in-addr.arpa     name = ns.example.com.

```

## Poweradmin

ここで手で SQL を打てばゾーンデータの更新が可能だが、いささか骨が折れる。
そこでブラウザから使用可能なフロントエンドを導入する。
[PowerDNS のフロントエンド](https://github.com/PowerDNS/pdns/wiki/WebFrontends)はいくつかあるが、今回は [Poweradmin](http://www.poweradmin.org/) を使用する。

PowerDNS のフロントエンドには PowerDNS の API 経由で更新するタイプと DB に直接接続して更新するタイプがある。
Poweradmin は後者のタイプ。

### 構成概略

ここでいったん、全体の構成を整理しておく。
今回構築する環境の概略は下図のとおりである。
![poweradmin.png](https://qiita-image-store.s3.amazonaws.com/0/189570/87c61a1a-3e22-6239-1178-4049a590085e.png)

登場するアカウントが多くなるので混乱しないよう注意してほしい。
都合4組のアカウントとパスワードが必要になる。
MariaDB 上のアカウントの powerdns と poweradmin は一つにまとめることもできるとは思うが、参照しかしない powerdns と更新も行なう poweradmin は念のためわけておく。
pdns データベースには PowerDNS が使用するデータの他に Poweradmin が使用するデータ (Poweradmin のユーザ情報やゾーンファイルのテンプレートなど) も格納される。

### Poweradmin のインストール

Poweradmin には Apache や PHP などが必要なので入れておく。
このとき入れる php-mcrypt と依存で入る libmcrypt は CentOS 7 のパッケージではなく EPEL のパッケージ。

```shell-session
$ sudo yum install httpd php php-mysql php-mcrypt
```

Apache を起動。

```shell-session
$ sudo systemctl start httpd.service
$ sudo systemctl enable httpd.service
```

Poweradmin を取得し、ドキュメントルートに配置。

```shell-session
$ cd
$ wget https://downloads.sourceforge.net/project/poweradmin/poweradmin-2.1.7.tgz
$ cd /var/www/html
$ sudo tar xzvf ~/poweradmin-2.1.7.tgz --no-same-owner
$ sudo mv poweradmin-2.1.7 poweradmin
```

ブラウザで http://(サーバの IP アドレス)/poweradmin/install/ にアクセスする。

Installation step 1
![step1.png](https://qiita-image-store.s3.amazonaws.com/0/189570/94491804-9e2c-4419-ccbe-3c9bd589717a.png)
どうも日本語は文字コードがおかしく文字化けするケースがあるので、「I prefer to proceed in english.」を選び英語で進める。

Installation step 2
![step2.png](https://qiita-image-store.s3.amazonaws.com/0/189570/1c737863-7735-0221-afa7-dc6455d3043f.png)
次のステップへ。

Installation step 3
![step3.png](https://qiita-image-store.s3.amazonaws.com/0/189570/0dc75d7f-2a1b-2144-e9ce-512bfefb9729.png)
以下を入力する。
すべて入力し「Go to step 4」をクリックすると、インストーラは MariaDB に接続し、pdns データベースに Poweradmin が使う情報が書き込まれる。

- Username: MariaDB に変更を加える MariaDB 上のユーザ。root でいいだろう。
- Password: そのパスワード。
- Database type: MariaDB では「MySQL」を選択。
- Hostname: MariaDB が動いているホスト。デフォルトの localhost のまま。
- DB Port: MariaDB のポート。デフォルトの 3306 のまま。
- Database: PowerDNS 用データベースの名前。今回は「pdns」。
- Poweradmin administrator password: ユーザが Poweradmin にアクセスするときのパスワード。適宜決めて入力。

Installation step 4
![step4.png](https://qiita-image-store.s3.amazonaws.com/0/189570/9edf3658-86c7-5bb7-53b2-003cec96a235.png)
Poweradmin が MariaDB にアクセスするときのユーザ情報と、Poweradmin でゾーンを作るときのデフォルト値を入力。

- Username: Poweradmin が MariaDB にアクセスするときのユーザ名。
- Password: そのパスワード。適宜決めて入力。
- Hostmaster: SOA レコードの RNAME (管理者メールアドレス) 欄のデフォルト値。
- Primary nameserver: SOA レコードの MNAME (プライマリ DNS サーバ名) 欄のデフォルト値。
- Secondary nameserver: どうやら入力しても使われない模様?

Installation step 5
![step5.png](https://qiita-image-store.s3.amazonaws.com/0/189570/a710bf4c-da06-f67d-52f6-3ff316797d1b.png)
ここで表示された SQL を実行し、Poweradmin が MariaDB にアクセスするときの権限を設定する。

```shell-session
$ mysql -u root -p
MariaDB [(none)]> GRANT SELECT, INSERT, UPDATE, DELETE
    -> ON pdns.*
    -> TO 'poweradmin'@'localhost'
    -> IDENTIFIED BY 'paSSwoRd';
MariaDB [(none)]> exit
```

Installation step 6
![step6.png](https://qiita-image-store.s3.amazonaws.com/0/189570/f1b54ce1-6cb0-8d61-f957-26a370230298.png)
ここで Poweradmin の設定ファイルを作成する。

```shell-session
$ cd /var/www/html/poweradmin/inc
$ vi config.inc.php
表示された「<?php」以降の内容を入力する。
```

Installation step 7
![step7.png](https://qiita-image-store.s3.amazonaws.com/0/189570/a275a9b8-180c-c55c-8e10-faf2f7818bda.png)
Poweradmin にアクセスするためのユーザ名 admin とパスワードが表示されている。
パスワードを変更するよう書かれているが、今回は検証なのでそのままで。

インストールが終わったらインストーラは削除しておく。

```shell-session
$ cd /var/www/html/poweradmin
$ sudo rm -r install
```

これでブラウザで http://(サーバの IP アドレス)/poweradmin/ にアクセスしユーザ名とパスワードを入力すると Poweradmin を使える。
ゾーンを作るなりホスト名を追加するなりご自由にどうぞ。

「Add master zone」からゾーン追加ができて SOA レコードは埋めてくれるが、NS レコードは自分で作らないといけない模様。

## 所感

BIND の乗り換え先候補として PowerDNS を使ってみたのだが、乗り換え先としてはちょっと微妙かもしれない。
少なくとも「万人におすすめ!」とは言えない感じ。

まず DB を使う構成は大げさすぎる。
よっぽど大量のゾーンを扱うとか大量のクエリを処理するとかでないと管理や勉強の手間と釣り合わないのではないか。

ブラウザでゾーンの管理ができるのは楽、と思うかもしれないが DNS を知らない人にがいじれるようになるわけではなく、テキストファイルを手でいじるのからそれほど楽になった感じもしない。

あとはフロントエンドがどれも微妙。
今回使用した Poweradmin は [GitHub](https://github.com/poweradmin/poweradmin) で見ると最終コミットが2017年2月で (2017年8月現在)、開発が活発とはいいがたい。
他にも[フロントエンドが多数](https://github.com/PowerDNS/pdns/wiki/WebFrontends)あるにはあるが、開発が止まっているものが多く「これが定番」というようなものがない。
フロントエンドの開発にガッツリ噛んでいくくらいの体制じゃないと厳しいかもしれない。