[DNS] PowerDNSとAtomia DNSを使ってみる


PowerDNS、Atomia DNSのインストールからDNSSECの設定(上位ゾーンへの登録は行わない)までを行う。

| Atomia DNS、PowerDNS構成 |
|:---|
| ![構成図](https://dl.dropboxusercontent.com/u/2435006/powerdns-atomiadns.png)|

# 1. PowerDNSとは
PowerDNSはGPLライセンスのC++で実装されたDNSサーバです。ほとんどのUNIXライクなOS上で動作します。PowerDNSはシンプルなBINDスタイルのゾーンファイルからRDBMSやロードバランシング／フェイルオーバーアルゴリズムまで多岐に渡る特徴があります。別プログラムとしてDNS recursorも含みます。

PowerDNSはオランダの企業PowerDNS.COM BVとオープンソースコミュニからの多くの貢献によって生み出されました。著名なデベロッパはBer Hubert氏です。

## 関連サイト
+ [PowerDNS公式サイト](https://www.powerdns.com/)
+ [PowerDNSマニュアル](http://doc.powerdns.com/html/index.html)
+ [PowerDNSコミュニティサイト](http://wiki.powerdns.com/trac)
+ [PowerDNSホスティング](https://www.powerdns.net/en/)

## 関連ツール
+ [Poweradmin](https://www.poweradmin.org/trac/)
+ [pdnsops](https://code.google.com/p/pdnsops/)
+ [PowerDNS on Rails](http://kennethkalmer.github.io/powerdns-on-rails/)
+ [JPower Admin](http://www.nicmus.com/community.html)
+ [Atomia DNS](http://atomiadns.com/)

# 2. Atomia DNSとは
Atomia DNSはスウェーデンの企業Atomia ABが提供するオープンソースのDNS管理システムです。Atomia DNSはそれ単体では動作せず、BINDやPowerDNSとゾーン情報を同期することで作用します。

Atomia DNSは主に2つのモジュール、Atomia DNS DatabaseとAtomia DNS APIから構成されています。同じマシン上まはた異なるマシン上にインストールすることが可能です。またオプションとしてAtomia DNS APIを呼び出すCLIツールのAtomia DNS Client、GUIツールのAtomia DNS Web Appがあります。

さらにBINDやPowerDNS等のDNSサーバと同期するには別途モジュールをインストールする必要があります。

## 関連サイト
+ [Atomia DNS公式サイト](http://atomiadns.com/)
+ [Atomia DNSマニュアル](http://atomiadns.com/documentation/)
+ [Atomia DNS APIドキュメント](http://atomia.github.io/atomiadns/apidocs.html#apidocs-manual)

# 3. インストール
## 3.1 Atomia DNSのインストール

### 3.1.1 Atomia DNS Masterのインストール
Atomia DNS MasterはAtomia DNS DatabaseとAtomia DNS APIの組み合わせです。同じマシン上にインストールする場合はAtomia DNS Masterをインストールしましょう。

```
# wget -q -O - http://public.apt.atomia.com/setup.sh.shtml | sed s/%distcode/`lsb_release -c | awk '{ print $2 }'`/g | sh
# apt-get install atomiadns-masterserver
```

Atomia DNSの設定を行う

```
# vim /etc/atomiadns.conf
```

### 3.1.2 Atomia DNS Clientのインストール

```
# apt-get install atomiadns-client
```

### 3.1.3 Atomia DNS Web Appのインストール

```
# apt-get install atomiadns-webapp
```

## 3.2 PowerDNSとの連携

### 3.2.1 Atomia DNS PowerDNS databaseのインストール

atomiadns-powerdns-databaseパッケージをインストールすると、mysql-server及びmysql-clientがインストールされpowerdns用のデータベースが作成されます。またpowerdns用のconfファイルも生成されます。

```
# apt-get install atomiadns-powerdns-database
# dpkg -L atomiadns-powerdns-database
/.
/usr
/usr/share
/usr/share/doc
/usr/share/doc/atomiadns-powerdns-database
/usr/share/doc/atomiadns-powerdns-database/copyright
/usr/share/doc/atomiadns-powerdns-database/changelog.gz
/usr/share/atomiadns
/usr/share/atomiadns/powerdns.sql
/usr/share/atomia
/usr/share/atomia/conf
/usr/share/atomia/conf/atomiadns.conf.atomiapowerdns-database
/usr/share/atomia/conf/pdns.conf
```

インストール時に作成されるデータベース。
powerdns_schemaversionテーブル以外は空です。

```
# mysql -u root -p
Enter passowrd:
mysql> use powerdns;
mysql> show tables;
+------------------------+
| Tables_in_powerdns     |
+------------------------+
| cryptokeys             |
| domainmetadata         |
| domains                |
| global_cryptokeys      |
| global_domainmetadata  |
| outbound_tsig_keys     |
| powerdns_schemaversion |
| records                |
| supermasters           |
| tsigkeys               |
+------------------------+
10 rows in set (0.00 sec)
```

インストール時に生成されるpowerdns用confファイル。
PowerDNSのバックエンドにMySQLを使うように設定されているのと、DNSSECが有効になっている。

```
# cat /etc/powerdns/pdns.conf 
launch=gmysql
gmysql-host=localhost
gmysql-user=powerdns
gmysql-dbname=powerdns
gmysql-password=02c98b78a3db6de9d98454f36d286f00d862b51d
gmysql-dnssec=yes
```

### 3.2.2 Atomia DNS PowerDNS syncのインストール

上記のatomiadns-powerdns-databaseパッケージだけではPowerDNSと連携することは出来ません。
追加でatomiadns-powerdnssyncパッケージをインストールする必要があります。

atomiadns-powerdnssyncはAtomia DNS APIを利用し必要な情報を取得、その情報を直接PowerDNSのデータベース(今回であれば上記のMySQL)へ反映します。

```
# apt-get install atomiadns-powerdnssync
# dpkg -L atomiadns-powerdnssync
/.
/usr
/usr/share
/usr/share/doc
/usr/share/doc/atomiadns-powerdnssync
/usr/share/doc/atomiadns-powerdnssync/copyright
/usr/share/doc/atomiadns-powerdnssync/changelog.gz
/usr/share/atomia
/usr/share/atomia/conf
/usr/share/atomia/conf/atomiadns.conf.atomiapowerdnssync
/usr/share/atomia/opendnssec_scripts
/usr/share/atomia/opendnssec_scripts/add_to_opendnssec.sh
/usr/share/atomia/opendnssec_scripts/remove_from_opendnssec.sh
/usr/share/atomia/opendnssec_scripts/export_keys_for_zone.sh
/usr/share/perl5
/usr/share/perl5/Atomia
/usr/share/perl5/Atomia/DNS
/usr/share/perl5/Atomia/DNS/PowerDNSDatabase.pm
/usr/share/perl5/Atomia/DNS/PowerDNSSyncer.pm
/usr/share/man
/usr/share/man/man1
/usr/share/man/man1/atomiapowerdnssync.1p.gz
/usr/bin
/usr/bin/atomiapowerdnssync
/etc
/etc/init
/etc/init/atomiadns-powerdnssync.conf
/etc/init.d
/etc/init.d/atomiadns-powerdnssync
```

同期プログラムのデーモンを起動します。

```
# /etc/init.d/atomiadns-powerdnssync start
```

全ゾーンを同期します。

```
# atomiapowerdnssync full_reload_online
```

詳細はmanページで参照してください。

```
# man atomiapowerdnssync
```

ここまでインストール及び設定して、ようやくAtomia DNSとPowerDNSの連携が可能になりますが、未だ肝心のPowerDNSをインストールしていません。

## 3.3 PowerDNSのインストール

### 3.3.1 PowerDNSのインストール

まずはPowerDNSをインストールします。

```
# wget http://downloads.powerdns.com/releases/deb/pdns-static_3.2-1_amd64.deb
# dpkg -i pdns-static_3.2-1_amd64.deb
# dpkg -L pdns-static
/.
/etc
/etc/powerdns
/etc/powerdns/pdns.conf
/etc/init.d
/etc/init.d/pdns
/usr
/usr/share
/usr/share/man
/usr/share/man/man8
/usr/share/man/man8/pdns_server.8
/usr/share/man/man8/zone2sql.8
/usr/share/man/man8/pdns_control.8
/usr/share/doc
/usr/share/doc/pdns
/usr/share/doc/pdns/copyright
/usr/share/doc/pdns/changelog.gz
/usr/share/doc/pdns/changelog.Debian.gz
/usr/sbin
/usr/sbin/pdns_server
/usr/bin
/usr/bin/pdnssec
/usr/bin/zone2json
/usr/bin/dnsreplay
/usr/bin/pdns_control
/usr/bin/zone2sql
```

### 3.3.2 PowerDNS用MySQLモジュールをインストール

次にPowerDNS用のMySQLドライバをインストールします。

```
# wget https://www.monshouwer.eu/download/3rd_party/pdns-server/el6/x86_64/pdns-server-backend-mysql-3.2-1.el6.MIND.x86_64.rpm
# alien pdns-server-backend-mysql-3.2-1.el6.MIND.x86_64.rpm
# dpkg -i pdns-server-backend-mysql_3.2-2_amd64.deb
# dpkg -L pdns-server-backend-mysql
/.
/usr
/usr/share
/usr/share/doc
/usr/share/doc/pdns-server-backend-mysql-3.2
/usr/share/doc/pdns-server-backend-mysql-3.2/no-dnssec.schema.mysql.sql
/usr/share/doc/pdns-server-backend-mysql-3.2/dnssec.schema.mysql.sql
/usr/share/doc/pdns-server-backend-mysql
/usr/share/doc/pdns-server-backend-mysql/changelog.Debian.gz
/usr/share/doc/pdns-server-backend-mysql/copyright
/usr/lib64
/usr/lib64/libgmysqlbackend.so
```

※ alienがインストールされてなければ

```
# apt-get install alien dpkg-dev debhelper build-essential
```

### 3.3.3 PowerDNSの設定
バックエンドにMySQLを使うように設定します。

```
# vim /etc/powerdns/pdns.conf
launch=gmysql
gmysql-host=localhost
gmysql-user=powerdns
gmysql-dbname=powerdns
gmysql-password=02c98b78a3db6de9d98454f36d286f00d862b51d
gmysql-dnssec
gmysql-socket=/var/run/mysqld/mysqld.sock
```

### 3.3.4 テストデータで動作の確認

テストデータを登録

```
# mysql -u root -p
Enter passowrd:
mysql> use powerdns;
mysql> INSERT INTO domains (name, type) values ('test.com', 'NATIVE');
mysql> INSERT INTO records (domain_id, name, content, type,ttl,prio) VALUES (1,'test.com','localhost ahu@ds9a.nl 1','SOA',86400,NULL);
mysql> INSERT INTO records (domain_id, name, content, type,ttl,prio) VALUES (1,'test.com','dns-us1.powerdns.net','NS',86400,NULL);
mysql> INSERT INTO records (domain_id, name, content, type,ttl,prio) VALUES (1,'test.com','dns-eu1.powerdns.net','NS',86400,NULL);
mysql> INSERT INTO records (domain_id, name, content, type,ttl,prio) VALUES (1,'www.test.com','199.198.197.196','A',120,NULL);
mysql> INSERT INTO records (domain_id, name, content, type,ttl,prio) VALUES (1,'mail.test.com','195.194.193.192','A',120,NULL);
mysql> INSERT INTO records (domain_id, name, content, type,ttl,prio) VALUES (1,'localhost.test.com','127.0.0.1','A',120,NULL);
mysql> INSERT INTO records (domain_id, name, content, type,ttl,prio) VALUES (1,'test.com','mail.test.com','MX',120,25);
```

PowerDNSを起動

```
# /etc/init.d/pdns monitor
May 07 21:36:42 Reading random entropy from '/dev/urandom'
May 07 21:36:42 This is a standalone pdns
May 07 21:36:42 UDP server bound to 0.0.0.0:53
May 07 21:36:42 TCP server bound to 0.0.0.0:53
May 07 21:36:42 PowerDNS 3.2 (C) 2001-2013 PowerDNS.COM BV (Jan 17 2013, 09:33:38, gcc 4.4.5) starting up
May 07 21:36:42 PowerDNS comes with ABSOLUTELY NO WARRANTY. This is free software, and you are welcome to redistribute it according to the terms of the GPL version 2.
May 07 21:36:42 Creating backend connection for TCP
May 07 21:36:42 gmysql Connection successful
May 07 21:36:42 gmysql Connection successful
May 07 21:36:42 About to create 3 backend threads for UDP
% May 07 21:36:42 gmysql Connection successful
May 07 21:36:42 gmysql Connection successful
May 07 21:36:42 gmysql Connection successful
May 07 21:36:42 gmysql Connection successful
May 07 21:36:42 gmysql Connection successful
May 07 21:36:42 gmysql Connection successful
May 07 21:36:42 Done launching threads, ready to distribute questions
```

"/etc/init.d/pdns monitor"の実体

```
/usr/sbin/pdns_server --daemon=no --guardian=no --control-console --loglevel=9
```

pdns_serverに関してはmanページを参照

```
# man pdns_server
```

テストデータを検証する

```
# host www.test.com 127.0.0.1
Using domain server:
Name: 127.0.0.1
Address: 127.0.0.1#53
Aliases: 

www.test.com has address 199.198.197.196
```

```
# host -v -t mx www.test.com 127.0.0.1
Trying "www.test.com"
Using domain server:
Name: 127.0.0.1
Address: 127.0.0.1#53
Aliases: 

;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 20874
;; flags: qr aa rd; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 0

;; QUESTION SECTION:
;www.test.com.			IN	MX

;; AUTHORITY SECTION:
test.com.		3600	IN	SOA	localhost. ahu.ds9a.nl. 1 10800 3600 604800 3600

Received 86 bytes from 127.0.0.1#53 in 0 ms
```

テストが完了すればテストデータは削除しておく。

```
# mysql -u root -p
Enter passowrd:
mysql> use powerdns;
mysql> delete from domains;
mysql> delete from records;
```

### 3.3.5 PowerDNSの起動

PowerDNSを起動する

```
# /etc/init.d/pdns start
```

"/etc/init.d/pdns start"の実体

```
# /usr/sbin/pdns_server --daemon --guardian=yes
```

OS起動時に起動するか確認

```
# sysv-rc-conf --list | grep pdns
pdns         0:off	1:off	2:on	3:on	4:on	5:on	6:off
```

※ sysv-rc-confがインストールされてなければ

```
# apt-get install sysv-rc-conf
```

### 3.3.6 PowerDNSへゾーン/レコードを登録する

※ atomiapowerdnssyncが起動していない場合は、予め下記のコマンドにて起動しておいてください。

```
# /etc/init.d/atomiadns-powerdnssync start
```

#### Atomia DNS Web Appでゾーン/レコードを登録する

GUIツールにログインし、[+ Add New Zone]ボタンから新規ゾーンを登録する。その後[Edit]ボタンからレコードを登録する。

```
http://[your machine]:5380
```

#### Atomia DNS Clientでゾーン/レコードを登録する

atomiadnsclientコマンドを使ってゾーンを登録する。

```
# atomiadnsclient --uri http://[your machine]/atomiadns --method AddZone --arg …
```

atomiadnsclientコマンドを使ってレコードを登録する。

```
# atomiadnsclient --uri http://[your machine]/atomiadns --method AddDnsRecords --arg ...
```

### 3.3.7 PowerDNSへ登録したレコードを更新する

#### Atomia DNS Web Appでレコードを更新する

GUIツールにログインし、[Edit]ボタンからレコードを更新する。

```
http://[your machine]:5380
```

#### Atomia DNS Clientでレコードを更新する

atomiadnsclientコマンドを使ってレコードを更新する。

```
# atomiadnsclient --uri http://[your machine]/atomiadns --method EditDnsRecords --arg ...
```

### 3.3.8 PowerDNSへ登録したレコードを削除する

#### Atomia DNS Web Appでレコードを削除する

GUIツールにログインし、[Edit]ボタンからレコードを削除する。

```
http://[your machine]:5380
```

#### Atomia DNS Clientでレコードを削除する

atomiadnsclientコマンドを使ってレコードを削除する。

```
# atomiadnsclient --uri http://[your machine]/atomiadns --method DeleteDnsRecords --arg ...
```

### 3.3.8 PowerDNSへ登録したゾーンを削除する

#### Atomia DNS Web Appでゾーンを削除する

GUIツールにログインし、[Delete]ボタンからゾーンを削除する。

```
http://[your machine]:5380
```

#### Atomia DNS Clientでゾーンを削除する

atomiadnsclientコマンドを使ってゾーンを削除する。

```
# atomiadnsclient --uri http://[your machine]/atomiadns --method DeleteZone --arg ...
```

### 3.3.10 PowerDNSの停止

PowerDNSを停止する

```
# /etc/init.d/pdns stop
```

"/etc/init.d/pdns stop"の実体

```
# /usr/bin/pdns_control quit 2> /dev/null
```

pdns_controlに関してはmanページを参照

```
# man pdns_control
```

# 4. DNSSEC
## 4.1 DNSSECとは
DNSSECとはデータの応答送信の際に公開鍵暗号を利用した署名を付加し、受信側で付加された署名を検証することによりデータの出自認証と完全性を確認でき、DNS応答の偽造(キャッシュポイズニング)を防ぐことができるDNSのセキュリティ拡張です。

ここでは詳細な説明は省きます。

### 信頼の連鎖 (chain of trust)
DNSSECと言えば信頼の連鎖。受け取ったDNS応答が「本当に正しい(偽装されていない)」ことを検証するためには、受け取ったデータについて以下の２点の確認が必要になります。

1. 「正しい相手から」… 本当にその相手が登録したデータであること(データ出自の認証)
2. 「そのままの形で」… 通信途中で置き換えられたり、一部が失われたりしていないこと(データの完全性)

![信頼の連鎖](http://rs.impressrd.jp/files/images/rs19/sp/04_zu07.jpg)

#### example.jpの例
署名(コンテンツサーバ)

```
1. example.jpゾーンのレコードをZSK秘密鍵で署名します。
2. example.jpゾーンのZSK公開鍵をKSK秘密鍵で署名します。
3. example.jpゾーンのKSK公開鍵(と同等の情報)をDSとして親ゾーン(jp)に登録します。
4. jpゾーンのレコードをZSK秘密鍵で署名します。
5. jpゾーンのZSK公開鍵をKSK秘密鍵で署名します。
6. jpゾーンのKSK公開鍵(と同等の情報)をDSとして親ゾーン(ルート)に登録します。
7. ルートゾーンのレコードをZSK秘密鍵で署名します。
8. ルートゾーンのZSK公開鍵をKSK秘密鍵で署名します。
```

検証(キャッシュサーバ)

```
1. ルートゾーンのKSK公開鍵はキャッシュサーバが予め保持します。
2. キャッシュサーバはルートゾーンKSK公開鍵を用いて検証し、ルートゾーンのZSK公開鍵を入手します。
3. キャッシュサーバはルートゾーンZSK公開鍵を用いて検証し、JPゾーンのKSK公開鍵を入手します。
4. キャッシュサーバはJPゾーンのKSK公開鍵を用いて検証し、JPゾーンのZSK公開鍵を入手します。
5. キャッシュサーバはJPゾーンのZSK公開鍵を用いて検証し、exampleゾーンのKSK公開鍵を入手します。
6. キャッシュサーバはexampleゾーンのKSK公開鍵を用いて検証し、exampleゾーンのZSK公開鍵を入手します。
7. キャッシュサーバはexampleゾーンのZSK公開鍵を用いて検証し、レコード情報を取得します。
```

### KSK (Key Signing Key)

「正しい相手から」

ゾーン内の公開鍵情報に署名するための比較的暗号強度の高い(RSAで2048bitほど)鍵。利用期間を長く(年次)できるため、鍵更新の頻度を低くできる。署名コストは高いが、少数の鍵情報のみを署名対象とするため問題にはならない。KSK公開鍵と暗号論的に等価な情報(DS)を作成し、親ゾーンに登録する必要がある。ロールオーバーした場合は、同時にDSも更新する必要がある。

### ZSK (Zone Signing Key)

「そのままの形で」

ゾーンに署名するための比較的暗号強度の低い(RSAで1024bitほど)鍵。署名コストが低いため、大規模ゾーンの署名にも適応できる。安全確保のため、ある程度頻繁(月次)に鍵を更新する必要がある。ロールオーバーは親ゾーンとは関係なく独立で行える。

### DS (Delegation Singer) レコード
KSK公開鍵にSHA-1やSHA-256等のハッシュ関数を適用して作成した、KSK公開鍵と等価な情報。親ゾーンに登録する必要がある。また親ゾーンにのみ存在する。

### DNSKEYレコード
KSKとZSKの公開鍵を格納するためのレコード。

### RRSIGレコード
レコードの署名レコード。

## 4.2 Atomia DNSのDNSSEC関連API
Atomia DNS Web AppからではDNSSECの設定が行えません。そのためDNSSECの設定はAtomia DNS Client(atomiadnsclientコマンド)を用います。

### API一覧

| メソッド名 | 概要 |
|:---|:---|
| GetDNSSECKeys | ストアされている全てのDNSSEC鍵のリストを取得する |
| GetDNSSECKeysDS | ストアされている全てのアクティブなKSK鍵に対して生成されたDSレコードのリストを取得する |
| GetExternalDNSSECKeys | ストアされている全ての外部DNSSEC鍵のリストを取得する |
| AddDNSSECKey | データベースへDNSSEC鍵を追加する |
| AddExternalDNSSECKey | データベースへ外部DNSSEC鍵を追加する |
| ActivateDNSSECKey | DNSSEC鍵を有効にする |
| DeactivateDNSSECKey | DNSSEC鍵を無効にする |
| DeleteDNSSECKey | データベースからDNSSEC鍵を削除する |
| DeleteExternalDNSSECKey | データーベスから外部DNSEC鍵を削除する |
| GetDNSSECZSKInfo | 自動化されたZSKロールオーバーを実行できるようにストアされているすべてのZSK鍵に関する必要な情報を取得する |

## 4.3 DNSSEC鍵を登録する
### 4.3.1 KSK鍵を登録する

鍵生成にrng-toolsを使うので予めインストールしておきます。

```
# apt-get install rng-tools
# vim /etc/default/rng-tools
HRNGDEVICE=/dev/urandom

# /etc/init.d/rng-tools start
```

KSK鍵を登録します。

```
# atomiadnsclient --method AddDNSSECKey --arg RSASHA256 --arg 2048 --arg KSK --arg 1
```

KSK鍵が登録されたか確認します。

```
# atomiadnsclient --method GetDNSSECKeys
$VAR1 = [
          {
            'algorithm' => 'RSASHA256',
            'activated' => '1',
            'keysize' => '2048',
            'activated_at' => '2013-05-09 20:15:54.240659',
            'keytype' => 'KSK',
            'created_at' => '2013-05-09 20:15:54.240659',
            'deactivated_at' => undef,
            'keydata' => 'Private-key-format: v1.2
Algorithm: 8 (RSASHA256)
Modulus: sE6t8Fw429Nww9wGaP5ygT0CdD8oadcMGCbWg5qg2SzTPhapTFtR7uXXkSSyURBkw2kUK02/gK8Zc5KDmMYSmqKL2ugdvjj2yfLpb8iYdt5qCG6bi0ICGeSGgdQ6lkNFCkiwohcl7LhJVjNigbcxC54JPCUZuMGfq0chPE3uJGmYrkE4ZCLnKacVFIAn92FozmeQ1vOneMJZ1iL1saUZtkqVVTjikbkI9qjr7V5KYQbcth7/zTmphVvs6hKU6LATNA4Ieq0I0E+u3mtmrgcjEsRdNVHALwCnbcE+o/oAC3gywlgimmjfTPthbrXoqAwxN9ipnfebhNLyNet0VuLraQ==
PublicExponent: AQAB
PrivateExponent: jLafGKFiOACvlYJ8EzxRg1iAJutpg9/ApV4KA4tcKTkfeAR6JpkT8Ym73Pne39gns9af5FfvKfOWaqlbIomju4tT9+keI/4u6ctYCIGfPfARzJ0Kw8BxEN1VhTUvdVJHPgf6AcRb3mzPC1+DlWfyWwVM9ZXey5itqPPiUNEZ6jCSKDoGz90iN/RGNqTxI+bVUk1hJNAd/AZ9jE5TaHmNbm7UBVfau6xP9arm90axLhICaIH252tZxET+lXoJLS8RQ3N05Rx4deTPMooAeawWMsX/cZZTuFKD0lcR1n5XkGU0RLEruK9Yw+fN22aGOWpPsuoaWQ62WyvNZwHcssDJoQ==
Prime1: 1t78VT6rylDXWoMDKNDEGqx1CDlMmsC+PjQIIxuzEgVyl3tBHkeOmRBvXqSrkuqf7ScR2kz95SXrYWobYIR0wOFqjZQYcGbbBqPaz5XjBFzghOPpbxZ8J7/W2fkzuESyFC6fAWx+e5oGAt6FSyyc0zRYVPCDZnoAv98bVptRw8U=
Prime2: 0g4DR4JH1WUbvG71WRV8ESx5+ISCZb64CI0q7RlXnbhSJoglXIiLCEceEoPcnoR95bqCvT791EBvgM73TKG95g8TEWCZDR56nO+bpXSo5Hvm1FYJ4VYxr9g6JkRnrHo7w8nqUykQpVM+RBHMWlU/TMylr//Cu9xOG2uO+YqY71U=
Exponent1: r49z5oaVQHG681Y2P6QLhqu/159RiuPOzO4gc+cO8buHvGNVelMHHOMDy/WJxjlzwAX7HT1o+VB5OJfElKDE8E99iv4k1boEXTGF97REz2y/eXTqZvydJrEk7+YgLv/Z7ImHG1e1JHJdVPzRNfHWlO6g+Y2mHxWyBRNat/Gh5e0=
Exponent2: Uxb/7RV33M21/v/VRXveK9zwEoI4Io8itR9CT6+qnNUAigVo4gWRGaEoICLQ7lNyiaERflKgjYk/kjBMWp/QQmTMIh+X6zyXO+T8KKLQ/DCWyn+OQPibhvd9aQ2+BNgFNBl2+5ZO41beVobD0yfNdk+tasU8/prSur39PHC6tlE=
Coefficient: pE/z+rrNRHpNqJsvdReFrsgrybUuOYEUYQqtywYQO2gKlqfveQVvP5c+n2Uzjlo2mr63KyOAUQyzV+SoElRNL8+aOZeYqovdxBQXkQEvlEpUhAdAqxWdYhkwuyWN+14W4wjBW7cln86mtxZskmRsWvQtEM9Gl9O6uBBLe2/ZyRc=
',
...
```

PowerDNS側ではcryptokeysテーブルに登録されます。PowerDNSでDNSSECを利用する場合、cryptokeys、domainmetadata、tsigkeysテーブルを使います。

### 4.3.2 ZSK鍵を登録する

```
# atomiadnsclient --method AddDNSSECKey --arg RSASHA256 --arg 1024 --arg ZSK --arg 1
```

非アクティブなZSKを登録する場合は最後の引数の値を0に

```
# atomiadnsclient --method AddDNSSECKey --arg RSASHA256 --arg 1024 --arg ZSK --arg 0
```

## 4.4 pdnssecツール

pdnssecコマンドはPowerDNSSEC用のコマンドラインツールです。

| コマンド名 | 概要 |
|:---|:---|
| activate-zone-key ゾーン 鍵ID | ゾーンの指定した鍵IDの鍵を有効にします |
| add-zone-key ゾーン [zsk│ksk] [bits] [rsasha1│rsasha256│rsasha512│gost│ecdsa256│ecdsa384] | ゾーン用のKSKまたはZSK鍵を指定されたアルゴリズムで作ります |
| check-zone ゾーン | 指定したゾーンがDNSSECの正しさをチェックします |
| check-all-zones | 全てのゾーンに対し、DNSSECの正しさをチェックします |
| create-bind-db FNAME | BINDバックエンド用のDNSSECデータベースを作成します |
| deactivate-zone-key ゾーン 鍵ID | ゾーンの指定した鍵IDの鍵を無効にします |
| disable-dnssec ゾーン | ゾーンの署名と全ての鍵を非アクティブかします |
| export-zone-dnskey ゾーン 鍵ID | 指定したゾーンの指定した公開鍵をエクスポートします |
| export-zone-key ゾーン 鍵ID | 指定したゾーンの指定した秘密鍵をエクスポートします |
| hash-zone-record ゾーン RNAME | ゾーンのレコード用NSEC3ハッシュ値を計算します |
| import-zone-key ゾーン ファイル [ksk│zsk] | ゾーンに対しKSKまたはZSK鍵を伊ポートします |
| rectify-zone ゾーン [ゾーン ..] | 指定ゾーンのDNSSECフィールドをFIXします |
| rectify-all-zones | 全てのゾーンをFIXします |
| remove-zone-key ゾーン 鍵ID | ゾーンから指定した鍵IDの鍵を削除します |
| secure-zone ゾーン [ゾーン ..] | ゾーンに対し、DNSSEC設定を行います |
| set-nsec3 ゾーン ['params' [narrow]] | ゾーンにNSEC3パラメータを設定します |
| set-presigned ゾーン | 事前署名ゾーンに切り替えます |
| show-zone ゾーン | ゾーンのDNNSEC鍵の詳細を表示します |
| unset-nsec3 ゾーン | NSEC3からNSECへ戻します |
| unset-presigned ゾーン | ゾーンの事前署名を解除します |

## 4.5 DSの取得と上位ゾーンへの反映

DSは以下のコマンドにて取得できます。

```
# pdnssec show-zone ゾーン | grep DS
DS = test.com IN DS 55216 8 1 382c270fa3e842a144994f79818d2dca82b50f45
DS = test.com IN DS 55216 8 2 b7fe7d2bf358a8f92026fd7f065aa5c7856902c5c28a293689bc08d3efacb3f4
DS = test.com IN DS 55216 8 3 6450eb2a4bff6663c7a4f7632e247ed3fdb3f0c0cb86f6f1a9c2d22894ad105e
...
```

DSレコードとして反映するのは以下の部分となります。

```
DS = test.com IN DS 55216 8 1 382c270fa3e842a144994f79818d2dca82b50f45
```

の

```
55216 8 1 382c270fa3e842a144994f79818d2dca82b50f45
```

の部分を反映します。先頭から鍵タグ(対応するDNSKEYレコードから生成した整数値)、アルゴリズム(署名鍵のアルゴリズムを表す整数値)、ダイジェスト型(ダイジェスト方式を表す整数値)、ダイジェストデータ(DNSKEYのダイジェストを16進数で表した文字列)です。

APIで取得する場合はatomiadnsclientを使います。


```
# atomiadnsclient --method GetDNSSECKeysDS --arg test.com
$VAR1 = [
          {
            'digest' => '382C270FA3E842A144994F79818D2DCA82B50F45',
            'digestType' => '1',
            'alg' => '8',
            'keyTag' => '55216'
          },
...
```

### 4.5.1 上位ゾーンへの反映

上位ゾーンへの反映方法はレジストリやレジストラによって違います。

例えば自身がレジストラの場合、.JPドメインを扱うJPRSとやりとりする場合は[GUIまたはAPI](http://jppartners.jp/member/gjp/f_doc/dnssec/jp-dnssec.html)を通じてDSレコードの情報を反映します。.COMや.NETドメインなどのgTLDや大半のccTLDはEPP(Extensible Provisioning Protocol)というレジストラからレジストリへのデータ登録用プロトコルを用います。GUIが用意されている場合もあります。

自身がリセラーの場合はレジストラが用意したGUIやAPIにて、自身がクライアントの場合はリセラーまたはレジストラが用意したGUIやAPIにてDSレコードを登録することになります。国内ではそもそもgTLDに対するDSレコードの取り次ぎを[レジストラ](http://www.icann.org/registrar-reports/accredited-list.html)が行っていない場合が多数です。(Japanとなっているのが国内レジストラです)

例えば.ORGドメインの場合は[国内では2社(JPRSは除く)](http://www.pir.org/get/registrars?order=field_dnssec_value&sort=desc)が対応可能となっていますが、公式サイトでは取り次ぎのアナウンスはありません。

海外でも対応しているレジストラやリセラーは少ないですが、ドメイン保持数が世界一位であるGo DaddyはDNSSECに対応しています。

どうしてもgTLDでDNSSECを採用したい場合は、レジストリへの取り次ぎを行っているレジストラ(Go Daddy等)か、そのレジストラと契約しているリセラーにてドメインを取得しましょう。

## 4.6 ZSKロールオーバー

事前公開法によるZSKのロールオーバーを行う。

非アクティブ化されているZSK鍵をアクティブ化する。

```
# atomiadnsclient --method ActivateDNSSECKey --arg 次のZSK鍵ID
```

以前のZSK鍵を非アクティブ化する。

```
# atomiadnsclient --method DeactivateDNSSECKey --arg 前のZSK鍵ID
```

以前のZSK鍵を削除する。

```
# atomiadnsclient --method DeleteDNSSECKey --arg 前のZSK鍵ID
```

非アクティブなZSKを登録する。

```
# atomiadnsclient --method AddDNSSECKey --arg RSASHA256 --arg 1024 --arg ZSK --arg 0
```

以降、定期的(月次)に繰り返し。
ある程度自動化は可能。

## 4.7 KSKロールオーバー

二重署名法によるKSKのロールオーバーを行う。

新しいKSK鍵を登録する。

```
# atomiadnsclient --method AddDNSSECKey --arg RSASHA256 --arg 2048 --arg KSK --arg 1
```

DS情報を取得し、親ゾーンへ登録する。

```
# pdnssec show-zone ゾーン | grep DS
```

以前のKSK鍵を非アクティブ化する。

```
# atomiadnsclient --method DeactivateDNSSECKey --arg 前のKSK鍵ID
```

以前のKSK鍵を削除する。

```
# atomiadnsclient --method DeleteDNSSECKey --arg 前のKSK鍵ID
```

KSKをロールオーバーした場合、DSを上位ゾーンへ再登録しなければいけないが、現状自動化するツールは存在しない。OpenDNSSECはeppclientというレジストリ(つまり上位ゾーン)のデータを更新sるうプラグインがあったが、保守されなかったためデフォルトから外されている。

## 4.8 DNSSECを無効に

```
# pdnssec disable-dnssec ゾーン
```