BIND 9.6.1でDNSSEC対応してみた

ここの内容を参考にして、ウチのサーバでDNSSEC対応にしてみた。

DNS Security Extensions(略称DNSSEC)は、DNSにおける応答の正当性を保証するための拡張仕様である。サーバとクライアントの双方がこの拡張に対応し、かつ拡張機能を使った形式で該当ドメイン情報が登録されていれば、DNS応答の偽造や改竄を検出することができる。

DNS Security Extensions - Wikipedia

日本でもJPRSが.jpドメインでのDNSSEC対応を2010年から始めると言う状況だし、対応が出来ていないレジストラも多いようなので、"DNSSEC Look-aside Validation Registry"サービスを利用するのが、現時点ではベターなようです。
JPRSが正式にサービスを開始したら、.jpドメインの方はJPRSに合わせた対応にする事になると思うんだけど、まぁまずは試してみましょう、ということで。


まずは、Keyを生成する

普通にやるなら、KSKキーとZSKキーを順番に生成する事になるのだけど、参考にしたページの作者が、この二つのキーを一気に作ってくれるシェルスクリプト(dnssec.sh)を用意してくれているので、そいつを利用することに。
dnssec.shは、dnssec-keygenコマンドとdnssec-sigzoneコマンドのwrapperになっているので、実際にはそれぞれのコマンドが必要。で、Debian的にはbind9utilsパッケージに含まれているものなので、"aptitude install bind9utils"を実行してインストールします。

dnssec.shをwgetなどで取得したら、エディタで開いて自分のところのサーバの環境にあわせて、ゾーンファイルの格納ディレクトリや各コマンドへのPATHを修正&パーミッション変更をします。(うちでは、下のように修正。)

eswat2:~/bin# diff -u dnssec.sh.orig dnssec.sh
0 --- dnssec.sh.orig 2009-11-08 02:43:03.000000000 +0900
+++ dnssec.sh 2009-11-15 13:12:20.000000000 +0900
@@ -70,11 +70,11 @@
DIR=`dirname $0`
CONFIGFILE="$DIR/dnssec.conf"

-keygen="/usr/local/sbin/dnssec-keygen"
-signzone="/usr/local/sbin/dnssec-signzone"
-dsfromkey="/usr/local/sbin/dnssec-dsfromkey"
-rndc="/usr/local/sbin/rndc"
-MASTERDIR="/etc/namedb/master"
+keygen="/usr/sbin/dnssec-keygen"
+signzone="/usr/sbin/dnssec-signzone"
+dsfromkey="/usr/sbin/dnssec-dsfromkey"
+rndc="/usr/sbin/rndc"
+MASTERDIR="/etc/bind/zone"

KSK_PARAM="-n zone -a RSASHA1 -b 2048 -f ksk"
ZSK_PARAM="-n zone -a RSASHA1 -b 1024"

修正したら、このdnssec.shを

# ~/bin/dnssec.sh keygen opt2.biz

のように実行します。
キー生成には、とても時間がかかるので「固まったか?」と思うかも知れませんが、とにかく待ちます。ちなみに、Pentium Dual-Core E2200が載ったサーバでも、KSKキーとZSKキーが出来上がるまで約1時間半から2時間程度(場合によっては4時間以上)かかるようなので、気長に待ってください。

キーの生成が終わると、下のようにいくつかファイルが作られます。タイムスタンプが若い方がZSKキーで、実際使うのは、".key"が付いてるもの(下の場合だと、"Kopt2.biz.+005+53616.key")になるので、注意してください。

eswat2:/etc/bind/zone/config# find ./ -name \*opt2\* | xargs ls -ltr
-rw-r--r-- 1 root bind 21 2009-11-16 02:04 ./ksk-opt2.biz
-rw------- 1 root bind 1701 2009-11-16 02:04 ./keydir/Kopt2.biz.+005+58396.private
-rw-r--r-- 1 root bind 383 2009-11-16 02:04 ./keydir/Kopt2.biz.+005+58396.key
-rw-r--r-- 1 root bind 21 2009-11-16 02:31 ./zsk-opt2.biz
-rw------- 1 root bind 937 2009-11-16 02:31 ./keydir/Kopt2.biz.+005+53616.private
-rw-r--r-- 1 root bind 208 2009-11-16 02:31 ./keydir/Kopt2.biz.+005+53616.key

どっちがどっちか判らない場合は、"zsk-ゾーン名"ファイルの中身を確認するか、"dnssec.sh status ゾーン名"で確認することも出来ます。

アカウントを作る & ゾーンの登録

キーの生成の待ち時間で、今回利用するDNSSEC Look-aside Validation Registryであるisc.orgのサイト(https://dlv.isc.org/)へアクセスしてレジストレーションを済ませておきます。

Zone List画面

レジストレーションが完了したら、"Manage Zone"でZone Listを表示させます。
新規のゾーンを登録するので、"(add a zone)"のリンクをクリック。指示に従って、DNSSEC化したいゾーン(ドメイン名)を登録します。

ゾーンがすでに登録された状態だと、画像のように登録状態や登録しているZSKキーの数、詳細情報画面へのリンクも表示されます。


ZSKキーの登録

ゾーンの登録が終わると、そのゾーンに対応したZSKキーの登録画面になるので、これ以降のステップはキーの生成が終わってから。

ZSKキーが出来上がったら、その中身をコピー&ペーストするか、ZSKキー自体をアップロードします。


Zoneの詳細情報

ZSKキーの登録が完了すると、ゾーンの詳細情報画面に遷移します。この時点では、ゾーンデータの認証が出来ていないので、StatusがPending状態。
画面の下に表示されるTXTレコードは、dlv.isc.orgがゾーンデータを認証するために使われるキーの役割を果たすものなので、あとの手順で必要になる情報です。


ここまで終わったら、実際にnamed.confなどを弄っていきます。

named.confとゾーンファイルの修正

まず、named.confの"options{};"の中に、次の3行

dnssec-enable yes;
dnssec-validation yes;
dnssec-lookaside . trust-anchor dlv.isc.org. ;

と、named.confのどこかに、

trusted-keys {
dlv.isc.org. 257 3 5 "BEAAAAPHMu/5onzrEE7z1egmhg/WPO0+ju
oZrW3euWEn4MxDCE1+lLy2brhQv5rN32RKtMzX6Mj70jdzeND4XknW58
dnJNPCxn8+jAGl2FZLK8t+1uq4W+nnA3qO2+DL+k6BD4mewMLbIYFwe0
PG73Te9fZ2kJb56dhgMde5ymX4BI/oQ+cAK50/xvJv00Frf8kw6ucMTw
FlgPe+jnGxPPEmHAte/URkY62ZfkLoBAADLHQ9IrS2tryAe7mbBZVcOw
IeU/Rw/mRx/vwwMCTgNboMQKtUdvNXDrYJDSHZws3xiRXF1Rf+al9UmZ
fSav/4NWLKjHzpT59k/VStTDN0YUuWrBNh";
};

を追加します。このあたりは、このページの"Configuring Resolvers to use DLV"の節を参照してください。
また、dnssec.shを使ってsignするとゾーンファイル名が変更されるので、その部分

zone "opt2.biz" {
type master ;
// file "zone/opt2.biz" ;
file "zone/opt2.biz.signed" ;←signされたゾーンファイル
};

を修正、今回DNSSEC対応にするopt2.bizのゾーンファイル(のSOAレコードの直下)に、

$INCLUDE "/etc/bind/zone/config/keydir/Kopt2.biz.+005+53616.key"

と、dlv.isc.orgでゾーンに対応したZSKキーを登録した時に表示されたTXTレコード

dlv.opt2.biz. 0 IN TXT "DLV:1:xxxxxxxxxxxx"

を追記します。

ゾーンファイルへの署名と動作確認

ここまで出来たら、ゾーンファイルへ署名します。
署名もdnssec.shを使えば、細かい引数の指定無しに、"dnssec.sh sign ゾーン名"と実行すれば、OK。

# ~/bin/dnssec.sh sign opt2.biz
/usr/sbin/dnssec-signzone -N unixtime -o opt2.biz -k /etc/bind/zone/config/keydir/Kopt2.biz.+005+58396.private -f opt2.biz.signed opt2.biz /etc/bind/zone/config/keydir/Kopt2.biz.+005+53616.private
opt2.biz.signed
signzone returns 0
zone reload queued

Statusが"Good

と表示されれば、OK。この時点で、rndcコマンドによって署名済みの新しいゾーンファイルが読み込まれています。

"dig +dnssec @localhost opt2.biz SOA"を実行してみて、SOAレコードに対するRRSIGレコードが表示されることを確認出来れば、署名されたゾーンファイルが読み込まれたことがわかります。
あとは多少時間をおいてから、dlv.isc.orgにアクセスして、Zone Listで"Zone Status"が"Good"に変われば変わって、dlv.isc.org側に正しく情報が反映されたことを確認できれば、設定自身はほぼ終わりとなります。

もし、なかなかStatusが変わらないとうことであれば、dlv.isc.org側からのアクセスログを確認して、どこかで失敗しているのかを確認してみると良いでしょう。手動で再チェックの指示を出すことも出来るので、bind側の設定が出来ていれば、すぐStatusを更新することも出来ます。

RRSIGレコード自身の有効期限があるので、"dnssec.sh sign ゾーン名"を週1で実行するようcronを設定しておけば、運用上は問題ないようです。
もしかすると、年1ペースでKSKキーとZSKキーを作り直した方がいいのかもしれません。

うちでは、しばらくそんな感じで運用してみようと思います。>DNSSEC

トラックバック(0)

コメントする