こんにちは、ネットエージェント株式会社研究開発部、大阪支社の山口です。今回は、DNS のキートピックのひとつである DNSSEC(DNS Security Extension) について紹介したいと思います。

-----

 DNS(Domain Name System) とは、ご存じの通り、インターネット上に展開されている階層的な分散型データベースのことで、主にホスト名とIPアドレスの対応付け等に使用されています。現在のインターネットにおいては DNS はもはや必要不可欠なシステムであり、インターネット技術の根幹といっても過言ではありません。しかし、にも関わらず問題のある設定の DNS サーバが修正されないままサービスを継続している場合も多く、DNSはセキュリティ的な問題点を指摘されやすいサービスのひとつとも言えます。
 そんな中で注目され始めた DNSSEC ですが、つい一昨日の2010年10月17日に、jp ゾーンに公開鍵情報である DNSKEY RR が追加され、jp ゾーンへの署名が開始されました。DiG コマンドで確認してみると、DNSKEY RR と RRSIG RR がセットになって返ってくることが確認できます。

$ dig jp. dnskey +dnssec +multiline

; <<>> DiG 9.7.1-P2 <<>> jp. dnskey +dnssec +multiline
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 42388
;; flags: qr rd ra; QUERY: 1, ANSWER: 5, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags: do; udp: 4096
;; QUESTION SECTION:
;jp. IN DNSKEY

;; ANSWER SECTION:
jp. 84802 IN DNSKEY 256 3 8 (
AwEAAbYhrQMQH9ItfsO/SFNAFVwpV669OF9+FGtEe5IO
TuajY871KONNqqyojToAiyQSTmhibS7q1zaNNx4cZlQw
l/PvF4yVwYU51OYPs5SsMntZlWTkebDpTbfyVzPkKZ2b
rrS/+6QOmxB5IpqzdbdLc/mjH6UWVWOgrG+CBSmD9PoX
) ; key id = 39186
jp. 84802 IN DNSKEY 256 3 8 (
AwEAAcxWIhw/wv6vwbOKO+umDTP+cPMkoRykho4kLycc
g6MB8XkXMThBNd1GXEolvzuyd/RAjGJqo2mdzxLyq3T5
4NTE9iIezmFhM00LWNLFH8rSzhx0PyIid3GJT/SQnH4w
qdaYZ3gVEzGfriWFWP3u2LqntGjdTr9+rdAf0V+ekrEj
) ; key id = 58308
jp. 84802 IN DNSKEY 257 3 8 (
AwEAAbPUX+Fy7ONuMs8+HY77DX/qaI2ZCaGUNJRKDxdv
k2XiecvXNu8upgjg9B9UH6fP6TRxE3NQ6iP3DeHkNSQC
FeWa7ItBxY0gQyPZPJATzIc/lWPcjWAwMOYUI/Un0KSq
93suzUhS5sDjW6O7FWfURLYeAhg4zvDHEksCG0wULldI
7qQENO/zKhtz1MpNDHjZrMdSbfPgCseodrfsgOlD+Br5
Nz97mSXg5RbYYhEJ9+yWcUA9YT/sYMNr7JRRzd71UIII
bvo5Th+YM+f34s+O0JTqwOyvNmehlRElvyTyicvk6db8
0PLTslWLHSNrUkI06Yo9JyHuitcQKumIGnA8tO8=
) ; key id = 1369
jp. 84802 IN RRSIG DNSKEY 8 1 86400 20101116044500 (
20101017044500 58308 jp.
MBS36a1Uicbj/DjsEHe8wFKrnkGz6cdawvbgO3AKvPNy
h7bz6q1+NgUTHnjlPppIexQPymR/8GKQuZE+kgQM0Pen
XJ1n6IqJ+jCJHjuGSRXBYCwfJ8mGhFqS3iYRuQKV3uf4
dGubI4/6ETN/WBWAvchPJyTn4vnivO12ZZCElc0= )
jp. 84802 IN RRSIG DNSKEY 8 1 86400 20101204082432 (
20101004082432 1369 jp.
onmVsz3gbgEhYsjyVB0AhS0pNayOZXGwftUjKNC8Ap2Z
xyg/YANWi3RxbgIP20KfZohVPPqXTWlNXVt56pR2ldcI
w8PhTt8JzB1E5pUveeg5o/cXkxsaTZdCk1yztLTn+qp/
dxCPCP/sqqB7XGO9L3/sViL3SB0AGSUF1R8etb/hRqVT
grx4ud3tElom3VtmxU9Aph8+T55hG6lWue/GN+Ku37Vq
ovmjBeJy5RVlJ6UFRI+LqtevL2ZhSMCiTe5z6DS3j07b
9+6FUtgw4U2dw7Z/G5HFUe6fz0WrNqgKrqBwqIR9YHgT
09S8REkHQOy2f3KR161cQ334k5lWNiK6zA== )

;; Query time: 1 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Tue Oct 19 00:11:15 2010
;; MSG SIZE rcvd: 1055

 JP ゾーンの署名に先行して、今年7月から root zone に署名されるようになっているので DNSSEC の簡単な確認手順を紹介します(参照)。確認には、ISC BIND 9.7.1-P2 付属のツールを使用しています。

 まず root zone の DNSKEY を取得します。

$ dig +nocmd +nocomments +noquestion +nostats -t dnskey . > trusted-key.key

 取得した DNSKEY から、DS を得ます。DS は KSK のハッシュです。

$ dnssec-dsfromkey -2 -f trusted-key.key .
. IN DS 19036 8 2 49AAC11D7B6F6446702E54A160
7371607A1A41855200FD2CE1CDDE32 F24E8FB5

 この値を root-anchors.xml の値と比較します。root-anchors.xml の真正性は同じディレクトリにある root-anchors.asc(OpenPGP 署名) もしくは root-anchors.p7s(S/MIME 署名) で確認します。OpenPGP 署名の確認は GnuPG を使います。dnssec@iana.org で登録されている公開鍵を手近な鍵サーバから取得(あるいは icann.pgp をインポート)し、確認します。

$ gpg2 --search-key dnssec@iana.org
Warning: using insecure memory!
gpg: searching for "dnssec@iana.org" from hkp server pgp.nic.ad.jp
(1) DNSSEC Manager <dnssec@iana.org>
1024 bit DSA key 0F6C91D2, created: 2007-12-01
Enter number(s), N)ext, or Q)uit > 1
gpg: requesting key 0F6C91D2 from hkp server pgp.nic.ad.jp
gpg: key 0F6C91D2: "DNSSEC Manager <dnssec@iana.org>" not changed
gpg: Total number processed: 1
gpg: imported: 1

$ gpg2 --verify root-anchors.asc root-anchors.xml
Warning: using insecure memory!
gpg: Signature made Tue Jul 6 22:49:10 2010 UTC using DSA key ID 0F6C91D2
gpg: Good signature from "DNSSEC Manager <dnssec@iana.org>"
gpg: WARNING: This key is not certified with a trusted signature!
gpg: There is no indication that the signature belongs to the owner.
Primary key fingerprint: 2FBB 91BC AAEE 0ABE 1F80 31C7 D1AF BCE0 0F6C 91D2

 S/MIME 署名の確認に GnuPG 2.0 以降に付属する gpgsm が利用できます。本稿を書いている時点では ICANN Root CA 証明書の安全な入手方法や、CRL の取得手段について十分調べられていないので以下の手順については参考程度にしてください。
 何らかのかたちで ICANN Root CA の証明書が正しいものであると確認できたとして、icannbundle.pem を gpgsm で取り込み、trustlist に fingerprint を登録したのち、CRL チェックを無効にして verify を実行します。

$ gpgsm --disable-crl-checks --verify root-anchors.p7s root-anchors.xml
Warning: using insecure memory!
gpgsm: Signature made 2010-07-15 01:39:36 using certificate ID 0x4A45F57D
gpgsm: CRLs not checked due to --disable-crl-checks option
gpgsm: Good signature from
"/CN=dnssec@iana.org/O=ICANN/EMail=dnssec@iana.org"

 確認の済んだ root zone の DNSKEY を検証に使うリゾルバに登録します(ISC BIND の場合: Using the root DNSSEC key in BIND 9 resolvers、Unbound の場合: Unbound: Howto enable DNSSEC)。
 信頼済キーとして root zone の DNSKEY が設定されているリゾルバに問い合わせると、DNSSEC の鍵確認ができた応答には ad フラグが確認できます。

$ dig . ns +dnssec +multiline

; <<>> DiG 9.7.1-P2 <<>> . ns +dnssec +multiline
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 40247
;; flags: qr rd ra ad; QUERY: 1,
ANSWER: 14, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags: do; udp: 4096
;; QUESTION SECTION:
;. IN NS

;; ANSWER SECTION:
. 518352 IN NS h.root-servers.net.
. 518352 IN NS e.root-servers.net.
. 518352 IN NS m.root-servers.net.
. 518352 IN NS g.root-servers.net.
. 518352 IN NS c.root-servers.net.
. 518352 IN NS f.root-servers.net.
. 518352 IN NS b.root-servers.net.
. 518352 IN NS j.root-servers.net.
. 518352 IN NS a.root-servers.net.
. 518352 IN NS k.root-servers.net.
. 518352 IN NS i.root-servers.net.
. 518352 IN NS l.root-servers.net.
. 518352 IN NS d.root-servers.net.
. 518352 IN RRSIG NS 8 0 518400 20101025000000 (
20101017230000 40288 .
c1GnhfkgNadxcM42TBbWKj3kqu54UAyDQ1KJ+lPIzx25
AXlcqFk+A5Kw1ik8qAL2xKo8hSqruX07m3SZqMlyC7h5
iF+7K/F/oi4GTnEOOv/Bf0Qd1GgmDWTIw8TWKKBL4jJ5
0FYkOoeEUVm1FrrqMXjNAe9pzM6W1LJs7s6Iyig= )

;; Query time: 1 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Mon Oct 18 23:42:22 2010
;; MSG SIZE rcvd: 397

 DiG コマンドの sigchase オプションを使うと、DNSSEC の信頼の連鎖をたどって検証する際の問い合わせが可視化されます。

$ dig www.icann.org. +multiline +sigchase +trusted-key=./trusted-key.key
;; RRset to chase:
www.icann.org. 330 IN A 192.0.32.7


;; RRSIG of the RRset to chase:
www.icann.org. 330 IN RRSIG A 7 3 600 20101025205718 (
20101018132532 32873 icann.org.
NBCCesXXfcX3IFQiGcEEaLXQH+aINj0/Xmi07kVFPooV
Vq6jJfxhu0k5MibbqQEnTZEvSWnrD8RjOTfU71A/mvjA
ZpdAu4RkTwh8JTd55e7fIwAn08aDsqGoSvYOfG7ScWdI
ck7oV8b1c7Y2/UWUPxsLmL0YfOh7TE0fuj7zenY= )

Launch a query to find a RRset of type DNSKEY for zone: icann.org.

;; DNSKEYset that signs the RRset to chase:
icann.org. 2366 IN DNSKEY 256 3 7 (
AwEAAaP7xhH7Sp6HR9xxs2pExt4TImO1qG6BGC3s1q6u
ErTyPXAbz5ViDV3WmFwkWhcR6BirBQ+BdCoRy5TwnfNU
wmbO4dfkH4SPjN2ykGERKOxa5tghOIHe1DrysI1CDZXB
TZgHx7pn+Uzz1zWy0Kyg2HEYyM8weEPPkrxf08cdydfj
) ; key id = 7008
2366 IN DNSKEY 256 3 7 (
AwEAAbJ41qqdVirOiibZRb11GeSX6lS9IS6dmINHS4CI
a9kiIGlkrtfOyLTY/xWj5iPKKSM9fy/1Xni7MbbZ5HL5
IPC3HC5DWh9EdPT9O593nEn7osX5xGKwXsFcOPRtQEbZ
isvQr4Y5OL7gGPtj8z9F6myTz9GWONmNYroCIBUsOxJT
) ; key id = 32873
2366 IN DNSKEY 257 3 7 (
AwEAAZuSdr4KSy77Mm3uQ6++HZBP9yZuDXEb41z9PZV5
UdLuTjyOH13Ip7lXXia5ijme3shsmdm5JDQaKtO6DWdD
m73QPObEYaYjGjA75j6wMEM0Eb+Oy8Kp7TEjC7o5B8TY
JJiqOcNaCNmJedNfgepqss4mWaW15B+OJQxJqmmZVY16
M4WEZSmXvMEf93i0OzbHY3BHrXi3qZxPzrBs6RK3s0NS
dAUnCOSx/E+vBNnF/UMvk29YxUZbfL11LlfLbCtKTxiG
nFnX8dTeNfldBKPcNrq+iqxQpihfxiKUrJ7f8DyhjtLj
hp0CKRyCpd49BgZpR9pRNRL8ZqU4by5PjFnNXA0=
) ; key id = 7455
2366 IN DNSKEY 257 3 7 (
AwEAAcyguBHFC9GiUguPfH8zmaCNfhUBHWUQ1EluPttD
Wt12+9AfavAGTitXRno1BGcsUqkZHf/NA/oTL8kNr5Lr
IUvBF70c6vvXipSgsUlY48sLqWYUfXbv2WDJdBQeUEmb
Uz0S2e8hvTDMegqLTv9PHqjEfrdnNs8b+8DTu+Vmw9f4
RhGP2In7Gvo6rCbRQGVF/iASJ4skhHKnIRf2FiFjgrTk
fgN8jZLBW5nKwhivEj8aUie6eYNgJioUklx/E0z7y7h5
ZYQragNHVwpPvu66B4UDyYrTU66YiuvP3wS3SqPAl9JK
SlLcV0uVO+eZM9QMlWg1eQhJ35HOJnqXcoCzE/k=
) ; key id = 41643

;; RRSIG of the DNSKEYset that signs the RRset to chase:
icann.org. 2366 IN RRSIG DNSKEY 7 2 3600 20101025234318 (
20101018132532 41643 icann.org.
jF6hzh7d+XKmeHaYOwtM9ROTY1eemWPXC5knqn0Rk6lC
yIVmhNdXoNJaYYh/xoyNIpPWKxOID6royjL+a81Xcidu
BGF+J0Q+aX9K3xz8ytv0RW7jTQrS4Y1cYdC1phDeAruq
PdCOCVxkCItrM5bk2x3bxZE5IsZN2zWV0abZyhBSfAS2
gP2St5Im/+nOYalZKU2iVRfeNtJeJY7EntXFUaEWl3as
qgwNDZcP9YROVYrcG7qp5APB2gU1n/hdfcPQ4n4bhYOZ
ynSR1cLhbpYAOxc3eVgvqzNdx3cflMPRdxSpZqa60Mgy
H2pHCyeie2R6x7MHccFS6u8FXUlAtJ9Otw== )

Launch a query to find a RRset of type DS for zone: icann.org.

;; DSset of the DNSKEYset
icann.org. 85166 IN DS 41643 7 2 (
B8AB67D895E62087F0C5FC5A1A941C67A18E4B096F6C
622AEFAE30DD7B1EA199 )
85166 IN DS 41643 7 1 (
93358DB22E956A451EB5AE8D2EC39526CA6A87B9 )

;; RRSIG of the DSset of the DNSKEYset
icann.org. 85166 IN RRSIG DS 7 2 86400 20101031154652 (
20101017144652 245 org.
gce3F2zwVLxPkaqfCWCD94mVLqbK5JeuqGMoJPf+sSJj
KWfv7SwvDwgdJTkC8Lhi+R1heAaZn0CSzK+y7jG5JBVB
lp9K+GxkPA3kI1jbDdy4PE0VkNMPC90odEmQ82XeWa+b
4etWv447Eh9AEGQfpaKMnQB69MvMV+Vy4tprkTI= )

;; WE HAVE MATERIAL, WE NOW DO VALIDATION
;; VERIFYING A RRset for www.icann.org. with DNSKEY:32873: success
;; OK We found DNSKEY (or more) to validate the RRset
;; Now, we are going to validate this DNSKEY by the DS
;; OK a DS valids a DNSKEY in the RRset
;; Now verify that this DNSKEY validates the DNSKEY RRset
;; VERIFYING DNSKEY RRset for icann.org. with DNSKEY:41643: success
;; OK this DNSKEY (validated by the DS) validates
;; the RRset of the DNSKEYs, thus the DNSKEY validates the RRset
;; Now, we want to validate the DS : recursive call

Launch a query to find a RRset of type DNSKEY for zone: org.

<中略>

Launch a query to find a RRset of type DS for zone: .
;; NO ANSWERS: no more

;; WARNING There is no DS for the zone: .

;; WE HAVE MATERIAL, WE NOW DO VALIDATION
;; VERIFYING DS RRset for org. with DNSKEY:40288: success
;; OK We found DNSKEY (or more) to validate the RRset
;; Ok, find a Trusted Key in the DNSKEY RRset: 40288
;; Ok, find a Trusted Key in the DNSKEY RRset: 19036
;; VERIFYING DNSKEY RRset for . with DNSKEY:19036: success

;; Ok this DNSKEY is a Trusted Key,
;; DNSSEC validation is ok: SUCCESS


 DNSSEC の連鎖の確認は、Unbound に付属の unbound-host コマンドでも可能です。

$ unbound-host -v -f ./trusted-key.key www.icann.org.
www.icann.org. has address 192.0.32.7 (secure)
www.icann.org. has IPv6 address 2620:0:2d0:200::7 (secure)
www.icann.org. has no mail handler record (secure)

 以上の手順で、今年7月に root zone に登録された鍵情報から DNSSEC の確認ができることが分かりました。さて、はじめに触れた jp zone ですが、ルートサーバに DS RR が登録されていないので、上記の設定では署名の確認ができません。上位サーバへの DS RR 登録のスケジュールは公表されていませんが、しばらく様子を見て年内をめどに行うというような話が聞こえてきています。ちなみに「JPドメインサービス名への導入」は2011年1月16日であると発表されています(参照:JPドメイン名サービスへのDNSSECの導入予定について)。

 自サイトへの導入をどうするか、という点についても少し考えてみます。リゾルバの場合ソフトウェアのバージョンアップで自動的に対応することになるケースが多いので、そういった折に計算機資源やネットワーク帯域について確認をしていくのが肝心でしょう。コンテンツについては、鍵の交換手順などの多くがいまだ手作業に頼っているようなのでツールの整備を俟ってローカルネットワークのテストサイトなどでシミュレーションをしつつ時期をうかがうのがよいかと考えます。
 DNSSEC については、電子署名技術を用いて改竄の検知や RR の実在確認などができるというメリットが謳われています。その一方「amplification attack(大量パケットを対象サイトに送りつける攻撃)に使われるのではないか」、または「署名計算に計算機資源が膨大に消費されるのではないか」といった懸念も聞かれます。
 DNSSEC の問題点は、イリノイ大学シカゴ校の Bernstein 氏の1年ほど前のプレゼンテーション「Breaking DNSSEC」が的確に指摘しています。RR の不存在確認に使う NSEC3 RR の crack に 9台の PC を使えば1日に5兆8千億通りぐらいの計算が可能だという実績から、GPGPU を使えば同等量の計算を1台でできるのではないかという見積りなども示されています。ちなみに、資料中で *.com で DNSSEC 設定のあるドメインが2009年8月時点で274サイトだったと書かれていますが、同じ方法で先週数えてみた結果 *.com で2707サイトありました。.com に着目すると約1年でおよそ10倍になっているようです。

 DNSSEC はまだ普及段階であり、今後どのような発展を遂げるか分かりません。仕様上の問題、現行の実装上の問題等、実際にやってみなければ明確でないことなどもあり、伝聞情報だけを頼りに結論を出すことはできません。しかし、徐々に DNSSEC が普及し始めているのは事実であり、今後の動向も気になります。
 また何かありましたらこのブログで書きたいと思います。