2012年09月02日

DNSコンテンツサーバとキャッシュサーバを分ける理由

はじめに言っておくと、だいたいBIND8のせいです。

(少なくとも昔の)BINDは、masterなゾーンが設定されているとき(recurseな)クエリを受けると、自分が権威サーバかチェックすることなく、単にそれを返す。したがってドメイン所有者が転出してしまったあと、ドメイン所有者とDNSサーバ提供事業者(webホスティングとか)の間で意思疎通がなくなって、Lameなmasterゾーンが残っていると、そのDNSをキャッシュとして使っている内側のユーザには古いlameなゾーンの情報が返され続けることなる。
またゾーン管理スクリプトの委任関係のチェックが甘いと、不正な(当然lameな)ゾーンを突っ込まれる可能性もある。これが直ぐDNSのポイズニングにつながるかどうかは、正しく設定されているかによる。

もちろん、DNSキャッシュとコンテンツが同一のマシン・プログラムで動いていても、セキュリティ・ポリシーとして、キャッシュする際には権威があるサーバー(つまり自分になるはず)までルートから必ず確認しに行くように設定できればいい。

ISCのBIND9 http://ftp.isc.org/isc/bind9/cur/9.9/doc/arm/Bv9ARM.html document view statements あたりを読むと、Bind9で導入された viewを内向きと外向きで切り替え、内向きはキャッシュ動作させ、外+内向きはコンテンツのみ動作、さらにキャッシュを独立させる(これは少なくとも9.9ではattach-cacheなしがデフォルト)やや面倒な設定をすることでできそうです。


acl local {
192.168.0.0/16;
// このサーバを信頼してくれてる人。お客様は神様です
};

options {/* 全略 */};

view "cache" {
match-recursive-only yes;
// 再帰はキャッシュを通す
// これ設定しないと無限ループするよ!!!


match-clients {127.0.0.1/8; local;};
// 内向きのみ


recursion yes;

include "local.conf";
// RFC規定のhintやローカル関連ゾーンのリスト

include "admin.conf";
// DNSサーバ管理者がメンテしているmaster/slaveゾーンのリスト
// これ信用出来ないならこの鯖意味ないよね

// ここに少しでも不安があるゾーンをincludeしちゃダメ

};

// BINDは+norecurseで探索するのでクエリはこっちに来ます
// forwardするなら同居する意味ないよね

view "userzones" {
match-clients {any;};
// 自分も含めること
recursion no;

include "local.conf";
include "admin.conf";

include "user.conf";
// ユーザーから要求されたmaster/slaveゾーンのリスト
// 管理者がいくらチェックしてても一時的にLAMEってる可能性はある

// ここでattach-cacheはダメ!絶対!
// 今のところattach-cacheはただの参照で階層化してるわけじゃないんです! BIND9.9doc
};
// typo直しました

つまり言いたいことは、
DNSキャッシュ(リゾルバ)と、DNS管理人がメンテしてるゾーン(絶対に信頼出来る)と、ユーザーのゾーン(いくらか嘘が混じっているかも)を区別してください。ってことです。

ただこの方法は、LAMEな設定が残っているのを見逃すことにもなるので、定期的にチェックしてlameな設定やバグで変なレコードがuser.confに入ってないかチェックはしましょう。
posted by ko-zu at 13:45| Comment(0) | TrackBack(0) | セキュリティ | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。

この記事へのトラックバック
×

この広告は90日以上新しい記事の投稿がないブログに表示されております。