DNSSEC対応キャッシュサーバー構築

JPドメインがDNSSECに対応したということでDNSSEC対応のDNSキャッシュサーバーの構築方法をまとめました

JPドメイン名がいよいよDNSSECに対応 - @IT

JPドメイン名がDNSSECに完全対応、大手レジストラ3社が1月中の対応を表明 – ニュース:ITpro

DNSSECとはゾーン情報に署名を付加することで正しいゾーン情報であるかを保証することが出来るため

DNSキャッシュポイズニングを防ぐことが出来ます。

既にBINDでDNSキャッシュサーバーを構築しているという前提で設定します

またBIND9.6.0以降が必要ですので最新版をインストールしておく必要があります

DNSSECに対応させるには?

DNSキャッシュサーバーのみの場合以下の二つを行うだけです

  • DNSSECの有効化
  • トラストアンカーの登録

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公開鍵を入手します

  • Webサーバーから直接入手する場合
$ 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]

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください