CentOS5.5の環境でPowerDNSを利用してDNSSECに対応する。
Bindを利用したDNSSECの方法はいろいろ検索して出てくるが、PowerDNSについては見つからなかったのでその方法をメモしておく。
DNSSEC対応出来たかチェックするためにdigコマンドを用いるが、標準パッケージでは+sigchaseオプションが利用できない(DiG 9.3.6-P1-RedHat-9.3.6-4.P1.el5_5.3)。その為、bindをソースからインストールする。
[shell]
# wget http://ftp.isc.org/isc/bind9/9.7.2-P3/bind-9.7.2-P3.tar.gz
# tar zxvf bind-9.7.2-P3.tar.gz
# cd bind-9.7.2-P3
# ./configure –disable-openssl-version-check STD_CDEFINES="-DDIG_SIGCHASE=1"
※sigchaseオプションを有効にする
# make
# make install
※新しいバージョンが/usr/local/bin/digにインストールされる。
# hash -r
[/shell]
既存のPowerDNSのDB(pdns)のバックアップを取得して、別途pdnssec DBにリストアする
[shell]
# mysqldump -p DB名 > pdnssec.sql
# wget http://wiki.powerdns.com/trac/browser/trunk/pdns/pdns/dnssec.schema.mysql.sql
# mysqladmin -p create pdnssec
# mysql -u root -p pdnssec < dnssec.schema.mysql.sql
※DNSSEC用スキーマの追加
[/shell]
PowerDNSは3.0からDNSSECに対応しているが、リポジトリに登録されていない。ソースからインストールする場合、Boostライブラリのあたらし目のバージョンが必要だが、これもリポジトリにない。面倒なので、PowerDNSの配布元がライブラリをstaticリンクしたパッケージを公開しているので、それを利用する。
※すでにPowerDNS+MySQLにて運用している前提で記載してあります。
[shell]
# wget http://powerdnssec.org/downloads/packages/pdns-static-3.0pre.20110207.1990-1.i386.rpm
# rpm -ivh –force pdns-static-3.0pre.20110207.1990-1.i386.rpm
※既存のpdnsパッケージと競合するので強制的にインストールする。
# rpm -qlp pdns-static-3.0pre.20110207.1990-1.i386.rpm
/etc/init.d/pdns
/etc/powerdns
/etc/powerdns/pdns.conf
/usr/bin/pdns_control
/usr/bin/pdnssec
/usr/bin/zone2sql
/usr/man/man8/pdns_control.8
/usr/man/man8/pdns_server.8
/usr/man/man8/zone2sql.8
/usr/sbin/pdns_server
# cd /etc/powerdns
# cp /etc/pdns/pdns.conf /etc/powerdns/pdns.conf
※既存の設定ファイルで上書き
# vi pdns.conf
launchの箇所にgmysql-dnssecを追加し、DB名を変更する。
ここから——-
gmysql-dbname=pdnssec
gmysql-dnssec
ここまで——-
必要であれば、MySQLの接続権限を追加する。
# mysql -p
GRANT SELECT,INSERT,UPDATE,DELETE ON pdnssec.* TO ‘DB接続ユーザID’@’localhost’;
FLUSH PRIVILEGES;
quit
またPowerAdminを使っているのであれば、接続先DB名を変える。
# /etc/init.d/pdns stop
# /etc/init.d/pdns start
[/shell]
どうもgmysql-dnssecを有効にした場合、以下で行うpdnssec secure-zone コマンドを実行するまでは、digなどでレコードが取得できなくなる模様。
※pdnssec secure-zoneコマンドはKSKと2つのZSKをドメインに追加するコマンド
[shell]
# pdnssec secure-zone furelo.jp
# dig +dnssec -t A furelo.jp @localhost
※RSSIGレコードがAレコードの他に返ってくることを確認する。
# pdnssec export-zone-dnskey furelo.jp 1 | grep DNSKEY > trusted-keys
※KSK(Key Signing Key)をエクスポートする。
# dig +dnssec +sigchase +trusted-key=./trusted-keys -t A furelo.jp @127.0.0.1
※理解していないが、以下のようにsuccssと出たのでOKと思われる。
;; WE HAVE MATERIAL, WE NOW DO VALIDATION
;; VERIFYING CNAME RRset for www.furelo.jp. with DNSKEY:64131: success
;; OK We found DNSKEY (or more) to validate the RRset
;; Ok, find a Trusted Key in the DNSKEY RRset: 38374
;; VERIFYING DNSKEY RRset for furelo.jp. with DNSKEY:38374: success
;; Ok this DNSKEY is a Trusted Key, DNSSEC validation is ok: SUCCESS
[/shell]
今後、レコードを修正したら、以下の2つのコマンドを実行しないと、反映されない。
[shell]
# pdnssec check-zone furelo.jp
# pdnssec rectify-zone furelo.jp
[/shell]
レジストラがDNSSEC未対応のため、JPドメインにはまだ登録出来ないので、
代わりにISC DLV Registryに登録を行ってみる。
先ほど作成した trusted-keysの内容をDNSKEY Recordsとして登録する。
登録したら、TXTレコードに登録する内容が表示されるので、DNSレコードに登録する。
pdnssecコマンドのヘルプ:
[shell]
# pdnssec -h
Usage:
pdnssec [options] [show-zone] [secure-zone] [rectify-zone] [add-zone-key] [deactivate-zone-key] [remove-zone-key] [activate-zone-key]
[import-zone-key] [export-zone-key] [set-nsec3] [set-presigned] [unset-nsec3] [unset-presigned] [export-zone-dnskey]
activate-zone-key ZONE KEY-ID Activate the key with key id KEY-ID in ZONE
add-zone-key ZONE [zsk|ksk] Add a ZSK or KSK to a zone
[bits] [rsasha1|rsasha256] and specify algorithm & bits
check-zone ZONE Check a zone for correctness
deactivate-zone-key Dectivate the key with key id KEY-ID in ZONE
export-zone-dnskey ZONE KEY-ID Export to stdout the public DNSKEY described
export-zone-key ZONE KEY-ID Export to stdout the private key described
import-zone-key ZONE FILE Import from a file a private key, ZSK or KSK
[ksk|zsk] Defaults to KSK
rectify-zone ZONE Fix up DNSSEC fields (order, auth)
remove-zone-key ZONE KEY-ID Remove key with KEY-ID from ZONE
secure-zone Add KSK and two ZSKs
set-nsec3 ZONE ‘params’ [narrow] Enable NSEC3 with PARAMs. Optionally narrow
set-presigned ZONE Use presigned RRSIGs from storage
show-zone ZONE Show DNSSEC (public) key details about a zone
unset-nsec3 ZONE Switch back to NSEC
unset-presigned ZONE No longer use presigned RRSIGs
[/shell]