セキュアなDNS環境を構築してみました

#■ 概要
セキュアなDNS環境の構築手順をまとめてみました。

#■ システム構成

**◆キャッシュサーバ**
・192.168.56.101
・グローバルドメインの名前解決の場合、ルートサーバ（インターネット名前空間）に問合せを行う。
・ローカルドメインの名前解決の場合、内部の権威サーバ（下記の権威サーバ）に問合せを行う。


**◆権威サーバ（マスタサーバ）**
・192.168.56.111
・ローカルドメイン（example.jp）の権威サーバ

**◆権威サーバ（スレーブサーバ）**
・192.168.56.112

※いずれも、CentOS 7.3、BIND 9.9.4 を使用しています。
※BINDは機能が豊富な為、DNSのデファクトスタンダートとして利用されています。
　しかし、脆弱性が多いことでも知られており、セキュアな環境を構築する場合、他のソフトの利用する事も有用です。
　【BIND以外のDNSソフト】
　　・キャッシュサーバ：Unbound など
　　・権威サーバ：NSD など
※今回の環境構築では手順を簡略化する為、SELinuxを無効にしていますが、SELinuxを有効にしておくと、BINDの脆弱性を突いた攻撃を受けた場合、被害を最小限に抑えることが出来ます。

#■ セキュリティ対策

以下のサイバー攻撃に対する対策を実施しました。

**◆DNSキャッシュポイズニング（別名：DNSキャッシュ汚染攻撃）**
・接続元アドレスを制限し、オープンリゾルバにしない。
・DNSSECを導入し、通信元が正規の権威サーバであることを検証する。

＊DNSSECを導入できない場合、ソースポートランダマイゼーション（送信元UDPポートのランダム化）を行うことにより、攻撃の成功率を下げる事ができます。


**◆DNSアンプ攻撃（別名：DNSリフレクション攻撃、DNSリフレクター攻撃）**
・接続元アドレスを制限し、オープンリゾルバにしない。
・権威サーバはリゾルバ機能を利用しないので、再帰問合せを受け付けない。

**◆ゾーン転送要求による情報収集**
・TSIGを導入し、通信元が正規のマスタサーバであることを検証する。
・ゾーン転送はスレーブサーバに対してのみ許可する。

**◆DNSサーバの脆弱性を突いたクラッキング**
・chroot jail環境で運用する。
・BINDのバージョンを非表示にする。

**◆その他**
・キャッシュサーバと権威サーバを別サーバに構築する。

#■ BINDインストール

```shell-session
# yum install bind bind-libs bind-utils bind-chroot
```

#■ 利用するBINDのパッケージ

|パッケージ|説明|
|:--|:--|
|bind|DNSサーバ本体、設定ファイル、管理コマンド（rndc）など|
|bind-libs|DNSサーバが利用するライブラリ|
|bind-utils|DNSサーバへの問合せコマンド（nslookup、host、dig など）|
|bind-chroot|DNSサーバをchroot jail環境で運用する場合にインストールが必要|

#■ firewalldの設定変更

```
◆DNSの通信を許可する
# firewall-cmd --add-service=dns --zone=public
# firewall-cmd --add-service=dns --zone=public --permanent

```

#■ BINDの起動／停止

```
◆起動
# systemctl start named-chroot
※named-chrootを使用すると、chroot jail環境で起動します。（/usr/sbin/named -u named -t /var/named/chroot）

◆停止
# systemctl stop named-chroot

```

#■ 各DNSサーバの環境構築
以降の構築手順は各DNSサーバにより異なるので、こちらをどうぞ。

**▼キャッシュサーバ**
[http://qiita.com/nk9bb8/items/15f4cb9756a2043e4bba](http://qiita.com/nk9bb8/items/15f4cb9756a2043e4bba)

**▼権威サーバ（マスタサーバ）**
[http://qiita.com/nk9bb8/items/f57c94f9469b805ef28e](http://qiita.com/nk9bb8/items/f57c94f9469b805ef28e)

**▼権威サーバ（スレーブサーバ）**
[http://qiita.com/nk9bb8/items/9a0b678b1abdfcb958ea](http://qiita.com/nk9bb8/items/9a0b678b1abdfcb958ea)


#■ DNSSECの動作確認

####◆ローカルドメインの動作確認

```
★正引き
# dig @192.168.56.101 pc1.example.jp. +dnssec +multi

; <<>> DiG 9.9.4-RedHat-9.9.4-50.el7_3.1 <<>> @192.168.56.101 pc1.example.jp. +dnssec +multi
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 3924
;; flags: qr rd ra ad; QUERY: 1, ANSWER: 2, AUTHORITY: 3, ADDITIONAL: 1

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

;; ANSWER SECTION:
pc1.example.jp.		86400 IN A 192.168.56.151
pc1.example.jp.		86400 IN RRSIG A 8 3 86400 (
				20171003103738 20170903103738 723 example.jp.
				dKW8IR2crShJXEzqYbA7fmXKg8W1w2iABgE5PHc0FwPy
				W+d4GTHDt1EsaNKzUnjaaO+TDsrSOOySdLM6L3HVbw7B
				3mBS1nOYO1KwJOLsgZ87z83mpGs8PdKsVkfSBM8RLd9P
				JCZfw5DmM0MlP15mFT6+QDTdJb3/o2qPC3UKPpw= )

;; AUTHORITY SECTION:
example.jp.		86400 IN NS master-ns.example.jp.
example.jp.		86400 IN NS slave-ns.example.jp.
example.jp.		86400 IN RRSIG NS 8 2 86400 (
				20171003103738 20170903103738 723 example.jp.
				MVIypM19EfYZWwNWomR8HjqjRpWoIzWRhfAlq3F7q99S
				TUHVyhfCufe6gGpNJE/LmJ9dVJ8iOf3zBmv/Sihuvhp0
				xj/NDGP8CKRrikDo3o5S/35/DhowRIBCULdSaO39y93h
				FmSkOcIv3x/jC1qdISJ6WM/xtGKQa7MjWaAUFAU= )

;; Query time: 1 msec
;; SERVER: 192.168.56.101#53(192.168.56.101)
;; WHEN: 水  9月 06 00:17:24 JST 2017
;; MSG SIZE  rcvd: 446

★逆引き
# dig @192.168.56.101 -x 192.168.56.151 +dnssec +multi

; <<>> DiG 9.9.4-RedHat-9.9.4-50.el7_3.1 <<>> @192.168.56.101 -x 192.168.56.151 +dnssec +multi
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 38534
;; flags: qr rd ra ad; QUERY: 1, ANSWER: 2, AUTHORITY: 3, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags: do; udp: 4096
;; QUESTION SECTION:
;151.56.168.192.in-addr.arpa. IN	PTR

;; ANSWER SECTION:
151.56.168.192.in-addr.arpa. 86400 IN PTR pc1.example.jp.
151.56.168.192.in-addr.arpa. 86400 IN RRSIG PTR 8 6 86400 (
				20171003104910 20170903104910 23340 56.168.192.in-addr.arpa.
				vYpMDiFthWG4mJnKe8Jo97ETS9ecgiXIRat5AXxTIHkk
				7WH7hgX6F6f64YfhbDal13C+HGxZiIpUCRHp900Yx5Ry
				mwoDclefpO4me+yZx7BdQL4sZiRYPHtLJSlibiuEnOS4
				C79OzFQZh9GehhJ+uOt06U4aPyCmNK8IU5KQQfc= )

;; AUTHORITY SECTION:
56.168.192.in-addr.arpa. 86400 IN NS slave-ns.example.jp.
56.168.192.in-addr.arpa. 86400 IN NS master-ns.example.jp.
56.168.192.in-addr.arpa. 86400 IN RRSIG	NS 8 5 86400 (
				20171003104910 20170903104910 23340 56.168.192.in-addr.arpa.
				uA18M7MfrjFWt+ZUq34R4kRQ2k/cCINwb9bfacK19vIR
				RBJ3sfAQBcqNFuMgS2MRK3AryGeFoVkTON3tiyQR9poI
				D0UlBkMNMOz7lfcdszWTwtD5WWm3xGvi1vkO4QOldpOP
				psVTosOOhUoSxeZFNJlwc9bqo3nP74Bc0rquFX4= )

;; Query time: 1 msec
;; SERVER: 192.168.56.101#53(192.168.56.101)
;; WHEN: 水  9月 06 00:16:04 JST 2017
;; MSG SIZE  rcvd: 497

```

####◆グローバルドメインの動作確認
※管理外のサーバの為、具体的な内容は省略しています。

```

★正引き
# dig @192.168.56.101 <<aaa.bbb.ccc.>> +dnssec +multi
～　省略　～
;; flags: qr rd ra ad; QUERY: 1, ANSWER: 2, AUTHORITY: 8, ADDITIONAL: 24
～　省略　～

★逆引き
# dig @192.168.56.101 -x <<999.999.999.999>> +dnssec +multi
～　省略　～
;; flags: qr rd ra ad; QUERY: 1, ANSWER: 2, AUTHORITY: 6, ADDITIONAL: 3
～　省略　～
　
```

※flagsに**ad**（Authentic Data）と表示されている場合、DNSSEC検証できた事を表しています。
　
#■ TSIGの動作確認

####◆権威サーバ（マスタサーバ）側

```
# cat /var/named/data/named.run
★正引き
～ 省略 ～
client 192.168.56.112#50752/key tsig-key (example.jp): transfer of 'example.jp/IN': AXFR started: TSIG tsig-key
client 192.168.56.112#50752/key tsig-key (example.jp): transfer of 'example.jp/IN': AXFR ended
～ 省略 ～

★逆引き
～ 省略 ～
client 192.168.56.112#40714/key tsig-key (56.168.192.in-addr.arpa): transfer of '56.168.192.in-addr.arpa/IN': AXFR started: TSIG tsig-key
client 192.168.56.112#40714/key tsig-key (56.168.192.in-addr.arpa): transfer of '56.168.192.in-addr.arpa/IN': AXFR ended
～ 省略 ～

```

####◆権威サーバ（スレーブサーバ）側

```
# cat /var/named/data/named.run
★正引き
～ 省略 ～
zone example.jp/IN: Transfer started.
transfer of 'example.jp/IN' from 192.168.56.111#53: connected using 192.168.56.112#50752
zone example.jp/IN: transferred serial 2017090301: TSIG 'tsig-key'
transfer of 'example.jp/IN' from 192.168.56.111#53: Transfer completed: 1 messages, 36 records, 4033 bytes, 0.001 secs (4033000 bytes/sec)
zone example.jp/IN: sending notifies (serial 2017090301)
～ 省略 ～

★逆引き
～ 省略 ～
zone 56.168.192.in-addr.arpa/IN: Transfer started.
transfer of '56.168.192.in-addr.arpa/IN' from 192.168.56.111#53: connected using 192.168.56.112#40714
zone 56.168.192.in-addr.arpa/IN: transferred serial 2017090301: TSIG 'tsig-key'
transfer of '56.168.192.in-addr.arpa/IN' from 192.168.56.111#53: Transfer completed: 1 messages, 40 records, 4757 bytes, 0.001 secs (4757000 bytes/sec)
zone 56.168.192.in-addr.arpa/IN: sending notifies (serial 2017090301)
～ 省略 ～

```