DNSSECを設定しセキュアな環境を構築する

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を指定

それでは実際にコマンドを叩きます。

# dnssec-keygen -f KSK -a RSASHA256 -b 4096 -n zone v4.com
Generating key pair.

このコマンドは時間がかなりかかります。

とりあえず速攻作成するには「-r /dev/urandom」オプションを使用する
※chroot配下の「/var/named」で作成!

以下はKSKとZSKの署名鍵を作成したコマンドです。

# dnssec-keygen -f KSK -r /dev/urandom -a RSASHA256 -b 4096 -n zone v4.com
Generating key pair..........................++ .............++
Kv4.com.+008+62014

# dnssec-keygen -r /dev/urandom -a RSASHA256 -b 1024 -n zone v4.com
Generating key pair.........++++++ .......................................++++++
Kv4.com.+008+53328

上記コマンドを実行すると以下ファイルが生成されます。

# 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」を追記します。
※シリアル値の更新を忘れないこと!

# 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.4
dns             IN      A       10.50.0.1

$INCLUDE "Kv4.com.+008+53328.key"
$INCLUDE "Kv4.com.+008+62014.key"

~

ゾーンファイルを更新後は該当のファイルにエラーがないかを確認します。

# named-checkzone v4.com db.v4.com
zone v4.com/IN: loaded serial 2014090402
OK

署名作成

「dnssec-signzone」コマンド実施し、署名を作成します。
以下は、「-o」コマンドでzonefileを指名します。

# dnssec-signzone -o v4.com db.v4.com
Verifying 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 revoked
db.v4.com.signed

「db.v4.com.signed」と「dsset-v4.com.」が作成されます。

# 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キーができていることがわかります。

# 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.6
v4.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」を記載します。

# vim /var/named/chroot/etc/named.conf

zone "v4.com" IN {
        type master;
        file "db.v4.com.signed";

namedを再起動します。

# service named restart

エラーが吐かれていないか確認しましょう。

# named-checkconf || echo NG
※NGが出なければOK

dnssecが書かれているか確認します。

# 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 86400
v4.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 DNSKEY
v4.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を有効にします。

options {
	--省略--
        dnssec-enable yes;
        dnssec-validation yes;
	--省略--
};

権威サーバ(root)のKSK公開鍵の入手する

まずは、以下コマンドでrootゾーンのKSK公開鍵を入手します。

# dig v4.com dnskey | grep -w 257 > root-ksk.key

KSK公開鍵からDSを生成します。

# dnssec-dsfromkey -2  root-ksk.key
v4.com. IN DS 62014 8 2 B881DEB2487A8CEC1C463D0C54D9D04C5D5B6610FE5E835E36E2C8C75F63F7E2

name.confに上記で生成root-ksk.keyに書かれているDNSKEYの文字列をコピーし、trusted-keysに張り付けます。

trusted-keys {
        “.“ 257 3 8
                                        "AwEAAbXa55rLbNHss1q+XvCuufD0GMOy5q68
                      ---省略---
                                        s58bx7jnD0TzpmlCSzv2nIB7VL0KMcdV";
};

※managed-keysを設定している場合はコメントアウトし反映させないようにしてください。

options {
        //managed-keys-directory "/etc/managed-keys";
//managed-keys {
//.                       initial-key 257 3 8 "
//                                oY68LsvPVjR0ZSwzz1apAzvN9dlzEheX7ICJBBtuA6G3
//                                LQpzW5hOA2hzCTMjJPJ8LbqF6dsV6DoBQzgul0sGIcGO
//                                Yl7OyQdXfZ57relSQageu+ipAdTTJ25AsRTAoub8ONGc
//                                LmqrAmRLKBP1dfwhYB4N7knNnulqQxA+Uk1ihz0=
//                                ";
//};

設定が終わったら、必ずnamedを再起動します。

# service named restart

キャッシュDNSでDNSSECが正常に動いているか確認

ここまでくれば、後はDNSSECがうまく動いているか確認するだけです。
「dig」コマンドで名前解決され、「ad」フラグが表示されれば完了です。

# 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で確認した結果です。

# 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.4
www.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エンジニアにおすすめの教材、オンラインスクールです。
無料からエンジニアの学習ができる教材などまとめているので参考にしてください。

おすすめオンライン教材
自宅で学習ができるオンラインスクール

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



コメントを残す

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

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

ABOUT US
げんき☆ひろき
インターネット関連のSEをやっています。 ネットワーク、サーバー、ストレージ、仮想基盤まで幅広く手を出しており、MVNOの構築経験もあります。 現在は、Pythonを使ったプログラミングの開発をしネットワークの自動化ツールを作成しています! Pythonの入門書も作成しているので、ぜひ参考にしてください!