LoginSignup
9
9

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-09-05

■ 概要

セキュアな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)
~ 省略 ~

 
 

9
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
9