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をソースからインストールする。
# 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
既存のPowerDNSのDB(pdns)のバックアップを取得して、別途pdnssec DBにリストアする
# 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用スキーマの追加
PowerDNSは3.0からDNSSECに対応しているが、リポジトリに登録されていない。ソースからインストールする場合、Boostライブラリのあたらし目のバージョンが必要だが、これもリポジトリにない。面倒なので、PowerDNSの配布元がライブラリをstaticリンクしたパッケージを公開しているので、それを利用する。
※すでにPowerDNS+MySQLにて運用している前提で記載してあります。
# 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
どうもgmysql-dnssecを有効にした場合、以下で行うpdnssec secure-zone コマンドを実行するまでは、digなどでレコードが取得できなくなる模様。
※pdnssec secure-zoneコマンドはKSKと2つのZSKをドメインに追加するコマンド
# 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
今後、レコードを修正したら、以下の2つのコマンドを実行しないと、反映されない。
# pdnssec check-zone furelo.jp # pdnssec rectify-zone furelo.jp
レジストラがDNSSEC未対応のため、JPドメインにはまだ登録出来ないので、
代わりにISC DLV Registryに登録を行ってみる。
先ほど作成した trusted-keysの内容をDNSKEY Recordsとして登録する。
登録したら、TXTレコードに登録する内容が表示されるので、DNSレコードに登録する。
pdnssecコマンドのヘルプ:
# 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