DNSSECってよく聞くのだが、結局じぶんで環境を作ってみないとわかんねぇ。
ということで作ってみました。
DNSSECとは
DNSSECはDNSサーバから送られてくる名前解決(IPアドレスやホスト名)の情報の信頼性をセキュアにする拡張機能です。
DNSサーバとクライアント間で証明書を使うことにより、正当な回答をし、DNS応答の偽造、改ざんを防ぐことができます。
権威(root)サーバの設定
まずは、ゾーンの署名に使う鍵を作ります。
鍵は2種類あります。
- KSK(Key SigningKey)
ゾーン署名鍵ZSKに署名する鍵 - ZSK(Zone Signing Key)
ゾーンに署名するゾーン署名鍵
署名鍵をつくりには「dnssec-keygen」コマンドを使います。
今回は以下でオプションを使って作成しました。
- -f
→keyflag KSKを指定 - -a
→アルゴリズム RSASHA256を指定 - -b
→keyサイズ(bit) 4096bit - -n
→nametype ZONEを指定
それでは実際にコマンドを叩きます。
1 2 | # dnssec-keygen -f KSK -a RSASHA256 -b 4096 -n zone v4.comGenerating key pair. |
このコマンドは時間がかなりかかります。
とりあえず速攻作成するには「-r /dev/urandom」オプションを使用する
※chroot配下の「/var/named」で作成!
以下はKSKとZSKの署名鍵を作成したコマンドです。
1 2 3 4 5 6 7 | # dnssec-keygen -f KSK -r /dev/urandom -a RSASHA256 -b 4096 -n zone v4.comGenerating key pair..........................++ .............++Kv4.com.+008+62014# dnssec-keygen -r /dev/urandom -a RSASHA256 -b 1024 -n zone v4.comGenerating key pair.........++++++ .......................................++++++Kv4.com.+008+53328 |
上記コマンドを実行すると以下ファイルが生成されます。
1 2 3 4 5 6 | # ll合計 36-rw-r--r-- 1 root root 421 9月 4 18:22 2014 Kv4.com.+008+53328.key-rw------- 1 root root 1012 9月 4 18:22 2014 Kv4.com.+008+53328.private-rw-r--r-- 1 root root 941 9月 4 18:21 2014 Kv4.com.+008+62014.key-rw------- 1 root root 3316 9月 4 18:21 2014 Kv4.com.+008+62014.private |
次に対象のゾーンファイルに作成した「key」を追記します。
※シリアル値の更新を忘れないこと!
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 | # vim db.v4.com;$TTL 1@ IN SOA dns.jp. dnsadm.v4.com. ( 2014090401 ; Serial [yyyymmddhh] 3h ; Refresh[3h] 1h ; Retry [1h] 7d ; Expire [7d] 1d ) ; Minimum[1d] IN NS dns.v4.com.www IN A 4.4.4.4dns IN A 10.50.0.1$INCLUDE "Kv4.com.+008+53328.key"$INCLUDE "Kv4.com.+008+62014.key"~ |
ゾーンファイルを更新後は該当のファイルにエラーがないかを確認します。
1 2 3 | # named-checkzone v4.com db.v4.comzone v4.com/IN: loaded serial 2014090402OK |
署名作成
「dnssec-signzone」コマンド実施し、署名を作成します。
以下は、「-o」コマンドでzonefileを指名します。
1 2 3 4 5 6 | # dnssec-signzone -o v4.com db.v4.comVerifying the zone using the following algorithms: RSASHA256.Zone signing complete:Algorithm: RSASHA256: KSKs: 1 active, 0 stand-by, 0 revoked ZSKs: 1 active, 0 stand-by, 0 revokeddb.v4.com.signed |
「db.v4.com.signed」と「dsset-v4.com.」が作成されます。
1 2 3 4 5 6 7 8 9 | # ll合計 96-rw-r--r-- 1 root root 421 9月 4 18:22 2014 Kv4.com.+008+53328.key-rw------- 1 root root 1012 9月 4 18:22 2014 Kv4.com.+008+53328.private-rw-r--r-- 1 root root 941 9月 4 18:21 2014 Kv4.com.+008+62014.key-rw------- 1 root root 3316 9月 4 18:21 2014 Kv4.com.+008+62014.private-rw-r--r-- 1 root root 4738 9月 4 18:42 2014 db.v4.com.signed-rw-r--r-- 1 root root 159 9月 4 18:42 2014 dsset-v4.com.上記2つのファイルが作成される |
署名済みのゾーンファイルは以下のようになってます。
DNSキーができていることがわかります。
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | # less db.v4.com.signed; File written on Thu Sep 4 18:42:55 2014; dnssec_signzone version 9.8.2rc1-RedHat-9.8.2-0.17.rc1.el6_4.6v4.com. 1 IN SOA dns.jp. dnsadm.v4.com. ( 2014090403 ; serial 10800 ; refresh (3 hours) 3600 ; retry (1 hour) 604800 ; expire (1 week) 86400 ; minimum (1 day) ) 1 RRSIG SOA 8 2 1 20141004084255 ( 20140904084255 53328 v4.com. p+QlnDeiFm/XPTIPB/JCcUluJy5rfoxQeVKy p41gF9+srfBGSmQoBMv8VGL10gUM8tvSyY83 ---省略--- 1 DNSKEY 256 3 8 ( AwEAAbXa55rLbNHss1q+XvCuufD0GMOy5q68 0BNbbZxq4AGXSwKPK0o6UI1ry6fxPFRR4m9C ZDaH4k6ZKhFrnqiqxxt4NIZQHCJEPjv9jFar ---省略--- ) ; key id = 53328 1 DNSKEY 257 3 8 ( AwEAAaVkgIsZLnAGBUECdl8KKDiSB4kan7PZ 85BsurxVhjk3em1deM5vVNRys3MtPTvvCqPd WnyKULbobLYVFH7PnANkZaUX6RXtxEJ2zxSe Y0KzRrOA+To13sW8RE9UrM7rUb1f+YIerZUn GzHHtO10JlcXsikVWERKKvn0S7SUgQb3yacZ ---省略--- |
「named.conf」のタイプに「db.v4.com.signed」を記載します。
1 2 3 4 5 | # vim /var/named/chroot/etc/named.confzone "v4.com" IN { type master; file "db.v4.com.signed"; |
namedを再起動します。
1 | # service named restart |
エラーが吐かれていないか確認しましょう。
1 2 | # named-checkconf || echo NG※NGが出なければOK |
dnssecが書かれているか確認します。
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | # dig +dnssec v4.com; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.17.rc1.el6_4.6 <<>> +dnssec v4.com;; global options: +cmd;; Got answer:;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 8539;; flags: qr aa rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 4, ADDITIONAL: 1;; OPT PSEUDOSECTION:; EDNS: version: 0, flags: do; udp: 4096;; QUESTION SECTION:;v4.com. IN A;; AUTHORITY SECTION:v4.com. 1 IN SOA dns.jp. dnsadm.v4.com. 2014090403 10800 3600 604800 86400v4.com. 1 IN RRSIG SOA 8 2 1 20141004084255 20140904084255 53328 v4.com. p+QlnDeiFm/XPTIPB/JCcUluJy5rfoxQeVKyp41gF9+srfBGSmQoBMv8 v4.com. 86400 IN NSEC dns.v4.com. NS SOA RRSIG NSEC DNSKEYv4.com. 86400 IN RRSIG NSEC 8 2 86400 20141004084255 20140904084255 53328 v4.com. IHsDJcD+iXxn5T4jgtH1x9UX82ZeiF683XVUyFVmFebZEgMJqgpuXcab ;; Query time: 0 msec;; SERVER: 127.0.0.1#53(127.0.0.1);; WHEN: Thu Sep 4 18:56:17 2014;; MSG SIZE rcvd: 449 |
キャッシュサーバの設定
今回とはあまり関係ないですが、最新のrootゾーンの公開鍵は以下のURLにあります。
https://data.iana.org/root-anchors/
キャッシュサーバのname.confでdnssecを有効にします。
1 2 3 4 5 6 | options { --省略-- dnssec-enable yes; dnssec-validation yes; --省略--}; |
権威サーバ(root)のKSK公開鍵の入手する
まずは、以下コマンドでrootゾーンのKSK公開鍵を入手します。
1 | # dig v4.com dnskey | grep -w 257 > root-ksk.key |
KSK公開鍵からDSを生成します。
1 2 | # dnssec-dsfromkey -2 root-ksk.keyv4.com. IN DS 62014 8 2 B881DEB2487A8CEC1C463D0C54D9D04C5D5B6610FE5E835E36E2C8C75F63F7E2 |
name.confに上記で生成root-ksk.keyに書かれているDNSKEYの文字列をコピーし、trusted-keysに張り付けます。
1 2 3 4 5 6 | trusted-keys { “.“ 257 3 8 "AwEAAbXa55rLbNHss1q+XvCuufD0GMOy5q68 ---省略--- s58bx7jnD0TzpmlCSzv2nIB7VL0KMcdV";}; |
※managed-keysを設定している場合はコメントアウトし反映させないようにしてください。
01 02 03 04 05 06 07 08 09 10 | options { //managed-keys-directory "/etc/managed-keys";//managed-keys {//. initial-key 257 3 8 "// oY68LsvPVjR0ZSwzz1apAzvN9dlzEheX7ICJBBtuA6G3// LQpzW5hOA2hzCTMjJPJ8LbqF6dsV6DoBQzgul0sGIcGO// Yl7OyQdXfZ57relSQageu+ipAdTTJ25AsRTAoub8ONGc// LmqrAmRLKBP1dfwhYB4N7knNnulqQxA+Uk1ihz0=// ";//}; |
設定が終わったら、必ずnamedを再起動します。
1 | # service named restart |
キャッシュDNSでDNSSECが正常に動いているか確認
ここまでくれば、後はDNSSECがうまく動いているか確認するだけです。
「dig」コマンドで名前解決され、「ad」フラグが表示されれば完了です。
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | # dig @localhost www.v4.com; <<>> DiG 9.9.3-P2 <<>> @localhost www.v4.com; (1 server found);; global options: +cmd;; Got answer:;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 64641;; flags: qr rd ra ad; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 1;; OPT PSEUDOSECTION:; EDNS: version: 0, flags:; udp: 4096;; QUESTION SECTION:;www.v4.com. IN A;; ANSWER SECTION:www.v4.com. 1 IN A 4.4.4.4;; AUTHORITY SECTION:v4.com. 1 IN NS dns.v4.com.;; Query time: 9 msec;; SERVER: 127.0.0.1#53(127.0.0.1);; WHEN: Fri Sep 05 17:35:54 JST 2014;; MSG SIZE rcvd: 73 |
adがフラグで立っているぜぃ!
+DNSSECで確認した結果です。
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | # dig @localhost www.v4.com +dnssec; <<>> DiG 9.9.3-P2 <<>> @localhost www.v4.com +dnssec; (1 server found);; global options: +cmd;; Got answer:;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 39633;; flags: qr rd ra ad; QUERY: 1, ANSWER: 2, AUTHORITY: 2, ADDITIONAL: 1;; OPT PSEUDOSECTION:; EDNS: version: 0, flags: do; udp: 4096;; QUESTION SECTION:;www.v4.com. IN A;; ANSWER SECTION:www.v4.com. 1 IN A 4.4.4.4www.v4.com. 1 IN RRSIG A 8 3 1 20141004084255 20140904084255 53328 v4.com. WcR0jMffQU/wxTONciN6/toVqMnsjQ8iPWWA1gU78W84bUU2Aat8jD6a ;; AUTHORITY SECTION:v4.com. 1 IN NS dns.v4.com.v4.com. 1 IN RRSIG NS 8 2 1 20141004084255 20140904084255 53328 v4.com. YAzU2UOHPx+jMMrSjNJPh+dfX8eAPfFv+9ao67f4m4aktnCNZDk2SOU/ ;; Query time: 6 msec;; SERVER: 127.0.0.1#53(127.0.0.1);; WHEN: Fri Sep 05 18:09:14 JST 2014;; MSG SIZE rcvd: 405 |
これで、DNSSECでの設定完了です!
以上です。

ITエンジニアの開発・検証・学習としてインターネット上で専用のサーバ(VPS)を利用しましょう!
実務経験はVPSで学べます。

コメント