LoginSignup
35

More than 5 years have passed since last update.

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

Last updated at Posted at 2013-05-10

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

Atomia DNS、PowerDNS構成
構成図

1. PowerDNSとは

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

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

関連サイト

関連ツール

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サーバと同期するには別途モジュールをインストールする必要があります。

関連サイト

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応答が「本当に正しい(偽装されていない)」ことを検証するためには、受け取ったデータについて以下の2点の確認が必要になります。

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

信頼の連鎖

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を通じてDSレコードの情報を反映します。.COMや.NETドメインなどのgTLDや大半のccTLDはEPP(Extensible Provisioning Protocol)というレジストラからレジストリへのデータ登録用プロトコルを用います。GUIが用意されている場合もあります。

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

例えば.ORGドメインの場合は国内では2社(JPRSは除く)が対応可能となっていますが、公式サイトでは取り次ぎのアナウンスはありません。

海外でも対応しているレジストラやリセラーは少ないですが、ドメイン保持数が世界一位である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 ゾーン

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
35