DNSキャッシュサーバを選ぶ

(2014.12.13)

LAN内の各ホストに対して、DNSサービスを提供する。

やりたいこと::

毒入れ (DNS cache poisoning)

キャッシュサーバに毒を盛り、クライアントからの問合わせに対して偽のIPアドレスを返させる攻撃。この攻撃が成功すると、phishingサイトに誘導したり、偽メールサーバに誘導してメールを詐取したりできる。

この辺りが解説の出発点。

権威サーバとキャッシュサーバ

図を見ればよく分かる;

DNSサーバと一口に言っても, 権威サーバとキャッシュサーバがある。

権威サーバとキャッシュサーバの分離は, 非常に古くから指摘されている。

権威サーバとキャッシュサーバでは、求められるアクセス管理がまったく異なるため、分離しなければ管理ができない。

権威サーバ (Authoritative Name Server)

権威サーバは、自身の管理するドメイン名空間のドメイン名について完全な情報を持ち、外部からの問合わせに対して回答する。

管轄外のドメイン名のキャッシュ機能は持たない (持たせてはいけない).

したがって, リゾルバ機能は持たない.

公開サーバの名前については, 全世界に公開する。

キャッシュサーバ (Recursive and caching name server)

キャッシュサーバは, LAN内などからの問合わせを受けて, root servers から順に再帰的に検索し, 名前を解決して回答する。

権威サーバへの問合わせが発生する.

上の毒入れのページにあるように, 実装に脆弱性があると, キャッシュサーバに偽データを注入されるリスクがある。

キャッシュサーバを権威サーバから分離して、キャッシュサーバのほうにはアクセス制限を掛けなければならない。

加えて, どこからでも問合わせを受け付けるようになっていると, 権威サーバへのDDos攻撃に使われかねない。(オープンリゾルバ)

キャッシュサーバ実装

で、どの実装がいいのか。

dnscache

D. J. Bernstein による djbdns の一部。

権威サーバとキャッシュサーバの分離や、キャッシュサーバは root servers を設定ファイルで持ち、信頼の出発点を確実にする、など優れた考え方で作られている。

開発がはるか昔に終了しており, IPv6にも対応しておらず, セキュリティ上の問題があるかないかも分からず, もはや使えない。

Unbound

キャッシュサーバに特化しており、必要であれば, NSD などの権威サーバと組み合わせる。

権威サーバなしでも, いくつかのホストを設定ファイルに登録して、そのホストは名前が引けるようにできる。

設定も簡単で, 扱いやすい。GOOD.

デフォルト設定では, localhost (127.0.0.1) からの問い合わせだけを受け付ける. LAN内のほかの機械からの問い合わせも受け付けたいときは, /etc/unbound/unbound.conf ファイルで, interface:, access-control: を調整する。

例えば,

server:
    interface: 192.168.241.21
    access-control: 192.168.241.0/24 allow

Dnsmasq

DNS forwarder. 上に書いたキャッシュサーバとは異なる。

キャッシュと /etc/hosts ファイルなどで名前解決できない場合は, DNS問合せを別のDNSサーバに転送する。自分でroot servers から出発して解決するわけではない。

なので, 別途, ISPなどが提供するキャッシュサーバが必要。ごく小規模な環境向け?

/etc/hostsあるいは設定ファイルで, いくつかのホストの名前が引けるようにできる。

DHCPサーバも兼ねる。便利は便利。

結論

ということで、私はUnbound をキャッシュサーバとして利用している。