DNSSEC BIND97 CENTOS5.9

一応前の bind93は削除しておく、

yum -y install bind97 bind97-utils bind97-chroot bind97-lib

bind97-9.7.0-17.P2.el5_9.2.i386.rpm bind97-chroot-9.7.0-17.P2.el5_9.2.i386.rpm bind97-libs-9.7.0-17.P2.el5_9.2.i386.rpm

bind97-utils-9.7.0-17.P2.el5_9.2.i386.rpm

chroot環境で動かすので、var/named/chroot ディレクトリにファイルを移動します。

etc]# cp -ip /etc/named.* /var/named/chroot/etc

named]# cp -ip /var/named/named.* /var/named/chroot/var/named/

named]# mkdir /var/named/chroot/var/named/{dynamic,slaves,data}

named]# chown named.named /var/named/chroot/var/named/{dynamic,slaves,data}

chroot環境で起動するために、/etc/sysconfig/named の設定。

これでROOTDIRにchrootした状態でbindが起動します。

ROOTDIR=/var/named/chroot

# /etc/init.d/named start

Starting named: [ OK ]

起動はOKそうなので STOPして 設定fileを作りましょう、
?内部用DNS
?キャッシュサーバとしては動かない
?DNSSECを使う

以上を加味して

#]vi /var/named/chroot/etc/named.conf

options {

#listen-on port 53 { 127.0.0.1; };

#listen-on-v6 port 53 { ::1; };

version “unknown”;

directory ”/var/named”;

dump-file ”/var/named/data/cache_dump.db”;

statistics-file “/var/named/data/named_stats.txt”;

memstatistics-file “/var/named/data/named_mem_stats.txt”;

allow-query { localhost; localnets; };

recursion yes;

allow-recursion {localnets;};

dnssec-enable yes;

dnssec-validation yes;

dnssec-lookaside auto;

empty-zones-enable no;

/* Path to ISC DLV key */

bindkeys-file “/etc/named.iscdlv.key”;

forwarders{ xxx.xxxx.xxxx.xxxx;xxxxx.xxxx.xxxx.xxxx;}

; };

logging {

channel default_debug {

file “data/named.run”;

severity dynamic; };

category lame-servers { null; }; };

view “internal” { match-clients { localnets; }; match-destinations { localnets; };

zone “.” IN { type hint; file “named.ca”; };

include “/etc/named.rfc1912.zones”;

include “/etc/named.root.key”;

include “/etc/named.ex.com.zone”;

};

controls { inet 127.0.0.1 allow { localhost; } keys { rndc-key; }; };

include “/etc/rndc.key”;

};

rndckeyを使うので、keyを作成

chroot]# rndc-confgen -a -b 512 -c /var/named/chroot/etc/rndc.key -u named -r /dev/urandom

wrote key file “/var/named/chroot/etc/rndc.key”

rndckeyの動作確認

]# rndc -k /var/named/chroot/etc/rndc.key reload

server reload successful

動作は一応OKです

zone の設定、DBの設定はいつもと同じなので、ここには書きません。

・DNSSECの設定(BIND97は手動でないとだめみたい)

ルートゾーンのトラストアンカーの入手と確認方法

トラストアンカーは、KSK(Key Signing Key:鍵署名鍵)の公開鍵、またはそれを元に生成されたハッシュの形で提供される。公開鍵の場合はDNSKEYレコードの形で、ハッシュの場合はDSレコードの形で提供される。

まず、digコマンドを用いてルートゾーンのDNSKEYレコードを取得する。「.」(ルートゾーン)のDNSKEYレコードを問い合わせ、結果からKSKが含まれた行のみを抽出する。

$ dig . DNSKEY | grep -w DNSKEY | grep -w 257 > root-anchors.key $ cat root-anchors.key . 172800 IN DNSKEY 257 3 8 AwEAAag【中略】Uk1ihz0=
ルートゾーンののDNSKEYレコードの取得

次に、入手したトラストアンカー(root-anchors.key)を検証する。ここでは例として、PGPの実装の1つであるGnuPG(The GNU Privacy Guard)を用いた方法を示す。トラストアンカーの検証は、次のステップで行う。

1.IANAのPGP公開鍵の入手
2.IANAのPGP公開鍵の検証
3.トラストアンカー(DSレコード形式)と署名の入手
4.IANAのPGP公開鍵によるトラストアンカー(DSレコード形式)の検証
5.トラストアンカーのDNSKEYレコード形式からDSレコード形式への変換と比較

【1】IANAのPGP公開鍵の入手

https://data.iana.org/root-anchors/icann.pgpより、IANAのPGP公開鍵を入手する。そして、入手したicann.pgpを次のコマンドでインポートする。

$ gpg –import icann.pgp gpg: key 0F6C91D2: public key “DNSSEC Manager <dnssec@iana.org>” imported gpg: Total number processed: 1 gpg: imported: 1
PGP公開鍵のインポート </dnssec@iana.org>

【2】IANAのPGP公開鍵の検証

入手したIANAのPGP公開鍵について、鍵IDとフィンガープリントを確認する。

$ gpg –fingerprint dnssec@iana.org pub 1024D/0F6C91D2 2007-12-01 DNSSEC Manager <dnssec@iana.org><dnssec@iana.org>Key fingerprint = 2FBB 91BC AAEE 0ABE 1F80 31C7 D1AF BCE0 0F6C 91D2 sub 2048g/1975679E 2007-12-01
PGP公開鍵の鍵IDとフィンガープリントの確認 </dnssec@iana.org></dnssec@iana.org>

「0F6C91D2」がPGP公開鍵の鍵ID、「Key fingerprint = 」に続く16進数が鍵のフィンガープリントである。

次に、鍵IDを基に複数のPGP公開鍵サーバで検索し、一致していることを確認する。ここでは、確認をより確実なものとするため、pgp.nic.ad.jpとpgp.mit.eduの2つの公開鍵サーバで公開されている鍵と照合している。

$ gpg –search-keys –interactive –keyserver pgp.nic.ad.jp 0x0F6C91D2 gpg: searching for “0x0F6C91D2” from HKP server pgp.nic.ad.jp Keys 1-1 of 1 for “0x0F6C91D2” (1) DNSSEC Manager <dnssec@iana.org><dnssec@iana.org><dnssec@iana.org>1024 bit DSA key 0F6C91D2, created 2007-11-30 Enter number(s), N)ext, or Q)uit > 1 pub 1024D/0F6C91D2 created: 2007-12-01 expires: never Key fingerprint = 2FBB 91BC AAEE 0ABE 1F80 31C7 D1AF BCE0 0F6C 91D2 DNSSEC Manager <dnssec@iana.org>Do you want to import this key? (y/N) N gpg: Total number processed: 1
PGP公開鍵のフィンガープリントの照合(1) </dnssec@iana.org></dnssec@iana.org></dnssec@iana.org></dnssec@iana.org>

$ gpg –search-keys –interactive –keyserver pgp.mit.edu 0x0F6C91D2 gpg: searching for “0x0F6C91D2” from HKP server pgp.mit.edu Keys 1-1 of 1 for “0x0F6C91D2” (1) DNSSEC Manager <dnssec@iana.org><dnssec@iana.org><dnssec@iana.org><dnssec@iana.org><dnssec@iana.org>1024 bit DSA key 0F6C91D2, created 2007-11-30 Enter number(s), N)ext, or Q)uit > 1 pub 1024D/0F6C91D2 created: 2007-12-01 expires: never Key fingerprint = 2FBB 91BC AAEE 0ABE 1F80 31C7 D1AF BCE0 0F6C 91D2 DNSSEC Manager <dnssec@iana.org>Do you want to import this key? (y/N) N gpg: Total number processed: 1
PGP公開鍵のフィンガープリントの照合(2) </dnssec@iana.org></dnssec@iana.org></dnssec@iana.org></dnssec@iana.org></dnssec@iana.org></dnssec@iana.org>

フィンガープリントが一致すれば、「PGP公開鍵が同一のものである」と検証できたことになる。

【4】IANAのPGP公開鍵によるトラストアンカー(DSレコード形式)の検証

次のコマンドを実行し、署名の検証を行う。

$ gpg –verify root-anchors.asc root-anchors.xml gpg: Signature made Wed Jul 7 07:49:10 2010 JST using DSA key ID 0F6C91D2 gpg: Good signature from “DNSSEC Manager <dnssec@iana.org><dnssec@iana.org><dnssec@iana.org><dnssec@iana.org><dnssec@iana.org><dnssec@iana.org><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
root-anchors.xmlに対する署名の検証 </dnssec@iana.org></dnssec@iana.org></dnssec@iana.org></dnssec@iana.org></dnssec@iana.org></dnssec@iana.org></dnssec@iana.org>

上記の「gpg: Good signature from “DNSSEC Manager <dnssec@iana.org><dnssec@iana.org><dnssec@iana.org><dnssec@iana.org><dnssec@iana.org><dnssec@iana.org><dnssec@iana.org><dnssec@iana.org>”」というメッセージは、正しい署名であると確認できたことを表している。</dnssec@iana.org></dnssec@iana.org></dnssec@iana.org></dnssec@iana.org></dnssec@iana.org></dnssec@iana.org></dnssec@iana.org></dnssec@iana.org>

【5】トラストアンカーのDNSKEYレコード形式からDSレコード形式への変換と比較

root-anchors.xmlには、DSレコード形式のトラストアンカーが記載されている。しかし、BIND 9ではトラストアンカーをDNSKEYレコード形式で登録する必要がある。このため、入手したトラストアンカーをDNSKEYレコード形式からDSレコード形式に変換し、root-anchors.xmlに記載されているものと一致しているか確認する必要がある。

DNSKEYレコード形式からDSレコード形式への変換は、BIND 9に付属するdnssec-dsfromkeyコマンドを利用する。

$ dnssec-dsfromkey -a SHA-256 -f root-anchors.key . . IN DS 19036 8 2 49AAC11D【略】
トラストアンカー(DSレコード形式)への変換

4列目の鍵タグ(この例では、19036)と、7列目のDSレコード形式のトラストアンカー(この例では、49AAで始まる文字列)が、root-anchors.xmlに記載されている「KeyTag」「Digest」と一致することを確認する。なお、DSレコード形式の文字列に含まれる空白は、あらかじめ取り除いておく。

root-anchors.xmlの内容とコマンドの出力が一致すれば、入手したトラストアンカーは正しいものであると判断できる。

BIND 9.7系では、DNSSECの検証を行う設定はデフォルトで有効になっているが、手動でトラストアンカー(DNSKEYレコード形式)を設定する必要がある。トラストアンカーを設定するには、managed-keysステートメントを用いる。下記のとおり、「. initial-key」の後ろに、入手したroot-anchors.keyの「257 3 8」以降を続けて記述する。公開鍵の部分は「”」で囲み、行末に「;」を付け加える。

managed-keys { . initial-key 257 3 8 “AwEAAag【中略】Uk1ihz0=”; }
BIND 9.7系のトラストアンカーの設定

digコマンドを用いて確認を行う。

$ dig +dnssec jprs.jp @192.0.2.1【キャッシュDNSサーバのIPアドレス】
digコマンドによる確認

このコマンドは、キャッシュDNSサーバに対して、DNSSEC要求を有効にしてjprs.jpを問い合わせるものである。jprs.jpはDNSSECに対応しているため、実行結果として、名前解決の結果に加えて検証結果が表示される。

; <<>> DiG 9.7.3 <<>> +dnssec jprs.jp ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 19744 ;; flags: qr rd ra ad; QUERY: 1, ANSWER: 2, AUTHORITY: 4, ADDITIONAL: 11 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags: do; udp: 4096 ;; QUESTION SECTION: ;jprs.jp. IN A ;; ANSWER SECTION: 【略】 DNSSECの検証が成功した場合の実行結果 上記で作成したものを named.conf に追加する 最後の行に trusted-keys { “.” 257 3 8 “AwEAAagAIKlVZrpC6Ia7gEzahOR+9W29euxhJhVVLOyQbSEW0O8gcCjF (中略)QxA+Uk1ihz0=”; }; と記入すればいい。 ]# dig @127.0.0.1 +dnssec jp ; <<>> DiG 9.7.0-P2-RedHat-9.7.0-17.P2.el5_9.2 <<>> @127.0.0.1 +dnssec jp ; (1 server found) ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 42628 ;; flags: qr rd ra ad; QUERY: 1, ANSWER: 0, AUTHORITY: 4, ADDITIONAL: 1 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags: do; udp: 4096 ;; QUESTION SECTION: ;jp. IN A ;; AUTHORITY SECTION: jp. 900 IN SOA z.dns.jp. root.dns.jp. 1394265606 3600 900 1814400 900 jp. 900 IN RRSIG SOA 8 1 86400 20140331174501 20140301174501 4905 jp. (中略)NS SOA RRSIG DNSKEY NSEC3PARAM ;; Query time: 9 msec ;; SERVER: 127.0.0.1#53(127.0.0.1) ;; WHEN: Sat Mar 8 17:03:50 2014 ;; MSG SIZE rcvd: 487 とadが確認される。以上です