ドメインの全レコードを取得するコマンド

権威DNSサーバに登録されている、ドメインのレコード全てを取得するコマンド。
もしくはそれに順ずる方法みたいなのってあるのかな、っていう疑問があり。
少し調べてみた。

結論から言うと存在する。

ただ、殆どの場合使えない。

コマンドは以下のようになっている。

Linuxの場合

dig @192.168.0.10 example.co.jp axfr

Windowsの場合

nslookup →対話モードに入る
>ls example.co.jp

何故殆ど使えないのか。

DNSサーバにはゾーン情報をセカンダリDNSサーバへ転送する機能 AXFRがあります。
これを使ってプライマリDNSサーバはセカンダリDNSサーバにゾーン情報を転送します。

本来、これらのコマンドはAXFRを使ってゾーン情報を転送できるかどうか、確認するための物です。

したがってプライマリがセカンダリDNSサーバのみ、転送先として許可していなかった場合。
このコマンドを使ってもAXFRのリクエストがDNSサーバに拒否されてしまいます。

DNSSECだったら・・・

DNSSECでは問い合わせを受けたホスト名が存在しないという回答が用意されており、
それを権威DNSサーバが返すことでキャッシュサーバに存在しないレコードとしてキャッシュし、
上位DNSサーバに問い合わせないようにする事が出来るようになっています。

その不在証明の方法が2種類あるのですが、
そのうちのNSECという手法で不在証明をしていた場合。

存在しないレコードの名前の次のレコードを答えてくれるという機能になっているので、
これを繰り返せば全てのレコード内容が容易に取得できるかも。

普通は想定できる単語やらなにやらで 総当りして、
存在するレコードと存在しないレコードを調べなくてはならないが、
これは存在するレコードを返してくれるわけなので。

で、これが問題になって今はNSEC3という手法もある。
これは次のレコードを答えない手法。

まとめ

ドメインの全レコードなんて自由に取得されていたら、
ホストの存在がバレバレになって攻撃対象になりまくってしまうと思うので、
named.conf のACLは気をつけて設定しないといけませんね。

追記(2012/11/05)

DNSSECの場合、DNSSEC Walkerというツールを使うと、
ゾーン全てのレコードを取得できる。