#■ 概要
セキュアな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インストール
# 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/f57c94f9469b805ef28e
▼権威サーバ(スレーブサーバ)
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)
~ 省略 ~