JPドメインがDNSSECに対応したということでDNSSEC対応のDNSキャッシュサーバーの構築方法をまとめました
JPドメイン名がいよいよDNSSECに対応 - @IT
JPドメイン名がDNSSECに完全対応、大手レジストラ3社が1月中の対応を表明 – ニュース:ITpro
DNSSECとはゾーン情報に署名を付加することで正しいゾーン情報であるかを保証することが出来るため
DNSキャッシュポイズニングを防ぐことが出来ます。
既にBINDでDNSキャッシュサーバーを構築しているという前提で設定します
またBIND9.6.0以降が必要ですので最新版をインストールしておく必要があります
DNSSECに対応させるには?
DNSキャッシュサーバーのみの場合以下の二つを行うだけです
DNSSECの有効化
BIND9.5以降であればデフォルトで有効になっていますが、
明示的にnamed.confのoptions内へ以下の設定を追加します
options {
dnssec-enable yes;
dnssec-validation yes;
};
トラストアンカーの登録
ここの設定が一番重要です
トラストアンカーとは署名が正しいかどうかを検証するための公開鍵暗号です
トラストアンカーを登録することでゾーン情報の検証を行うことが出来ます
ルートサーバーのトラストアンカーを設定することで「信頼の連鎖」によって下位のDNS情報が保証されます
よって、各ドメインのトラストアンカーを登録する必要はなくルートサーバーのトラストアンカーを設定するだけでOKです
詳しい説明はDNSSECチュートリアル[pdf]の71ページにあります
トラストアンカーの登録方法
ルートサーバーのトラストアンカーが正しいかどうかを確認する必要があります
流れとしては
1.IANAのWebサイトからルートサーバーのトラストアンカーのハッシュ値を入手、OpenPGPで検証
2.DNSでルートサーバーのトラストアンカーを入手しハッシュ値を出力させて比較する
こうしてトラストアンカーが正しいものかを確認したうえでBINDに登録させます
1.OpenPGPの公開鍵を入手する
以下のどちらかの方法でdnssec@iana.orgのOpenPGP公開鍵を入手します
$ wget http://data.iana.org/root-anchors/icann.pgp
$ gpg --import icann.pgp
$ gpg --search-keys --keyserver pgp.mit.edu dnssec@iana.org
gpg: “dnssec@iana.org”をhkpサーバーpgp.mit.eduから検索
(1) DNSSEC Manager <dnssec@iana.org>
1024 bit DSA key 0F6C91D2, 作成: 2007-12-01
Keys 1-1 of 1 for "dnssec@iana.org". 番号(s)、N)次、またはQ)中止を入力してください >1
gpg: 鍵0F6C91D2をhkpからサーバーpgp.mit.eduに要求
gpg: /home/carme/.gnupg/trustdb.gpg: 信用データベースができました
gpg: 鍵0F6C91D2: 公開鍵“DNSSEC Manager <dnssec@iana.org>”を読み込みました
gpg: 絶対的に信用する鍵が見つかりません
gpg: 処理数の合計: 1
gpg: 読込み: 1
2.IANAからハッシュデータと署名データを入手する
$ wget http://data.iana.org/root-anchors/root-anchors.xml
$ wget http://data.iana.org/root-anchors/root-anchors.asc
3.署名を検証する
$ gpg --verify root-anchors.asc root-anchors.xml
gpg: 2010年07月07日 07時49分10秒 JSTにDSA鍵ID 0F6C91D2で施された署名
gpg: “DNSSEC Manager <dnssec@iana.org>”からの正しい署名
gpg: 警告: この鍵は信用できる署名で証明されていません!
gpg: この署名が所有者のものかどうかの検証手段がありません。
主鍵の指紋: 2FBB 91BC AAEE 0ABE 1F80 31C7 D1AF BCE0 0F6C 91D2
4.DNSでルートサーバーのDNSKEYを入手する
$ dig . dnskey | grep 257 > rootzone-dnskey
5.ハッシュ値を出力してroot-anchors.xmlのハッシュ値と比較する
$ dnssec-dsfromkey -2 -f rootzone-dnskey .
. IN DS 19036 8 2 49AAC11D7B6F6446702E54A1607371607A<省略>
$ cat root-anchors.xml
<中略>
<Digest>49AAC11D7B6F6446702E54A1607371607A<省略></Digest>
</KeyDigest>
</TrustAnchor>
6.named.confにトラストアンカーを登録する
ハッシュ値が同一であることが確認できたらトラストアンカーをnamed.confに記述します
rootzone-dnskeyからキー部分(下線部分)を抜き出しキー部分を””で囲みます
. 63810 IN DNSKEY 257 3 8 AwEAAagAIKlVZrpC6I<省略>
抜き出した部分をnamed.confに以下のように記述します(太字が抜き出し部分)
trusted-keys {
"." 257 3 8
"AwEAAagAIKlVZrpC6Ia7gEzahOR+9W29e
<中略>nNnulq QxA+Uk1ihz0=";
};
named-checkconfで設定に問題がないか確認したらnamedを再起動させます
動作確認
digコマンドを使ってDNSSECの検証が出来ているかを確認します
$ dig @127.0.0.1 +dnssec .
; <<>> DiG 9.7.0-P1 <<>> @127.0.0.1 +dnssec .
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 953
;; flags: qr rd ra ad; QUERY: 1, ANSWER: 0, AUTHORITY: 4, ADDITIONAL: 1
adフラグは署名が検証できたデータであることを示すもので
これが表示されていれば正しく動作しています
jpドメインもちゃんと対応していることが確認できます
$ dig @127.0.0.1 +dnssec jp
; <<>> DiG 9.7.0-P1 <<>> @127.0.0.1 +dnssec jp
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 28396
;; flags: qr rd ra ad; QUERY: 1, ANSWER: 0, AUTHORITY: 4, ADDITIONAL: 1
参考文献
DNSSEC関連情報 / JPRS
DNSSECを利用するリゾルバーのための トラストアンカーの設定方法について[pdf]
DNSSECチュートリアル[pdf]