DNSSECで遊ぶ

■DNSSEC Bindについて
 ※以下のリンクrndcの設定後にDNSSECを設定する。

 bindのログ出力とrndcによるキャッシュコントロール
 http://d.hatena.ne.jp/labunix/20120502

 squeeze+bindでDNSSECに対応する
 http://d.hatena.ne.jp/labunix/20120503

 squeeze+bindでDNSSECに対応する(セカンダリDNS)
 http://d.hatena.ne.jp/labunix/20120504

 IP制限あれこれ for Squeeze
 http://d.hatena.ne.jp/labunix/20121001

■隔離環境で行う場合の注意点
 外部にTCP/53が通らず、UDP/53のみの環境で、
 自身への問い合わせのみDNSSEC対応するには、以下の3ファイルは取得出来ないので、予め準備しておく。

/var/cache/bind/managed-keys.bind
root-anchors.key
/var/cache/bind/trusted-keys

 ※「trusted-keys」は以下リンクやググるなどして下さいw。。。
   無くても良かったような、必要だったような。。。(指定する場合はinclude文で)

 Using the root DNSSEC key in BIND 9 resolvers
 http://www.isc.org/community/blog/201007/using-root-dnssec-key-bind-9-resolvers

■「1053/udp」について、
 bindの便利なオプションを見つけたので、
 以下も併せて「options」ステートメントに追加。

 BINDが送出するUDPの送信元ポートを固定する
 http://www.tatsuyababa.com/NW-DNS/NW-200309-DNSQA01.pdf

$ sudo grep 1053 /etc/bind/named.conf.options
        query-source address 192.168.188.188 port 1053;
        transfer-source 192.168.188.188 port 1053;
        notify-source 192.168.188.188 port 1053;

■「1053/udp」のIP制限を設定すると以下のようになります。

$ netstat -an | grep 53 | grep ^[tu][cd]
tcp        0      0 192.168.188.188:53      0.0.0.0:*               LISTEN
tcp        0      0 127.0.0.1:953           0.0.0.0:*               LISTEN
tcp6       0      0 :::53                   :::*                    LISTEN
udp        0      0 192.168.188.188:53      0.0.0.0:*
udp        0      0 192.168.188.188:1053    0.0.0.0:*
udp6       0      0 :::53                   :::*

■bindのバージョンを隠す

$ sudo grep "version " /etc/bind/named.conf.options
        version "Unknown";

$ nslookup -type=txt -class=chaos version.bind 192.168.188.188
Server:         192.168.188.188
Address:        192.168.188.188#53

version.bind    text = "Unknown"

$ dig @192.168.188.188 chaos txt version.bind | grep "TXT"
;version.bind.                  CH      TXT
version.bind.           0       CH      TXT     "Unknown"

■「options」ステートメントで以下のように記載すると
 一切の問い合わせ要求を無視出来るのを利用して、
 他NICからの問い合わせを無視します。
 ※「allow-query」等は設定されているものとして。。。

$ sudo grep -A 3 blackhole /etc/bind/named.conf.options
        blackhole {
            192.168.72.0/24;
            192.168.188.255;
        };

■確認方法はsnortやtcpdump、tsharkで。
 snortは統計が見れるのでお勧め。

$ sudo snort -dev host 192.168.188.255
$ sudo snort -dev net 192.168.72.0/24

$ sudo tcpdump -nv host 192.16.188.255
$ sudo tcpdump -nv net 192.168.72.0/24

(Windows+WireShark付属のtsharkの場合)
> tshark.exe -i 1 -n host 192.168.188.255
> tshark.exe -i 1 -n net 192.168.72.0/24

■セキュリティ、クライアントやクエリのログを出す。
 ※以下のように設定し、必要に応じてコメントアウトを外す。

$ grep ^logging -A 16 /etc/bind/named.conf.options
logging {
        channel "default-log" {
        file "/var/log/bind/bind.log" versions 10 size 100k;
        severity info;
        print-time yes;
        print-severity yes;
        print-category yes;
        };

        category default { "default-log"; };
        category security { "default-log"; };
        category queries { "default-log"; };
        //category client { "default-log"; };
        category lame-servers { null; };
};

■問い合わせがあると「queries」のログが出る。
 ※「dnssec」の問い合わせも「queries」ログを有効にすると出力される。

$ dig +dnssec dnssec.jp

$ sudo tail -f /var/log/bind/bind.log
02-Oct-2012 21:30:00.172 queries: info: client 192.168.188.188#50475: query: dnssec.jp IN A +ED (192.168.188.188)
02-Oct-2012 21:30:00.176 dnssec: info: validating @0x7f230f51fc90: . DNSKEY: got insecure response; parent indicates it should be secure
02-Oct-2012 21:30:00.367 dnssec: info: validating @0x7f230f520000: jp DNSKEY: got insecure response; parent indicates it should be secure
02-Oct-2012 21:30:00.525 dnssec: info: validating @0x7f23000018c0: dnssec.jp DNSKEY: got insecure response; parent indicates it should be secure

■rndcでチェックすると、以下のように出る。
 バージョン情報を隠さなければ、「(Unknown)」は無くなるし、
 「queries」のログをオフにしてあれば、「query logging is OFF」となる。

$ sudo rndc status
version: 9.7.3 (Unknown)
CPUs found: 2
worker threads: 2
number of zones: 24
debug level: 0
xfers running: 0
xfers deferred: 0
soa queries in progress: 0
query logging is ON
recursive clients: 0/0/400
tcp clients: 0/100
server is up and running

 ※私のブログの手順ではrndcからの管理操作は連携していない。「rndc.conf」の設定が必要。
  統計の確認(squidに対するsquidclientのような用途)に使用する。

■上記で「0/0/400」となっている箇所は、
 「queries」ログを正しく取得する為に以下のように制限を行っている。
 ※但し、超過した場合はDNSクエリの問い合わせができなくなる。

$ sudo grep recursive-clients /etc/bind/named.conf.options
        recursive-clients 400;

■統計を見る。

$ sudo rndc stats
$ sudo cat /var/cache/bind/named.stats
+++ Statistics Dump +++ (1349182671)
++ Incoming Requests ++
++ Incoming Queries ++
++ Outgoing Queries ++
[View: default]
[View: _bind]
++ Name Server Statistics ++
++ Zone Maintenance Statistics ++
++ Resolver Statistics ++
[Common]
[View: default]
[View: _bind]
++ Cache DB RRsets ++
[View: default]
[View: _bind (Cache: _bind)]
++ Socket I/O Statistics ++
                   2 UDP/IPv4 sockets opened
                   1 UDP/IPv6 sockets opened
                   2 TCP/IPv4 sockets opened
                   1 TCP/IPv6 sockets opened
                   3 TCP/IPv4 sockets closed
                   4 TCP/IPv4 connections accepted
++ Per Zone Query Statistics ++
--- Statistics Dump --- (1349182671)

■例えば、DNSSECを含む問い合わせがあると以下のようになる。

+++ Statistics Dump +++ (1349179291)
++ Incoming Requests ++
               13417 QUERY
++ Incoming Queries ++
               11888 A
                 138 NS
                 142 MX
                 154 TXT
                1008 AAAA
                  50 DS
                  23 DNSKEY
                  14 DLV
++ Outgoing Queries ++
[View: default]
               15202 A
                 114 NS
                  74 TXT
                 539 AAAA
               21099 DS
                 693 DNSKEY
                5257 DLV
[View: _bind]
++ Name Server Statistics ++