2008-07-26

DNS cache poisoning rhapsody

うちでは未だにDJBのtinydnsを使ってて、リゾルバは各マシンのloopbackで動かしてるdnscacheなので、今回の騒ぎは他人事だと思ってた。

が、よくよく考えると、プライベートなLANにいる連中のことを失念してた。

  • Mac miniでは、Mac OS Xに付随のBIND 9.4.1-P1をフルリゾルバとして使ってる。
  • ThinkPad群は、プロバイダのフルリゾルバをrtx1000経由で使ってる。

相変わらずAppleは、この手の対応はまったくもって遅い。まぁ、ユーザーランドがFreeBSDベースだからって、付随のBINDを使ってるヤツがいるなんて思ってもいなさそうだ。

YAMAHAも問題か。説明文書も一週遅かったし、なんにせよ未だにsource portをランダム化するファームすら出てきていない。

さてどうするか。

個々のマシンに最新のBINDを入れる?

リゾルバは共有したりせず、各ホスト専用のを各ホストのloopbackで個別に動かすのがスジだと思ってるんで、この方法が一番適切に思える。が、運用が面倒になるのが難点。WindowsUpdateやソフトウェアアップデートといった方法で更新できないのって、クライアントマシン用施策としては失格なんじゃないかと。

話は逸れるが、ISCって、BINDのWindowsバイナリ配ってるのね。知らなかった。これ入れるとdigとかも使えるのかしら。Windowsってnslookupしかないんで不便なんだよな。

dhcpでリゾルバのアドレスを通知できないのは不便

プライベートなLANにいる連中はdhcpのクライアントだ。各マシンにBIND入れてそこを見に行かせるようにすると、ノートPCを持ち出した時にあれこれ困りそうだ。さらによくよく考えると、うちにはPlayStation 3があるんだった。こいつが名前引きできなくなると、まいにちいっしょが見れなくなるじゃないか。

DMZにいるマシンのdnscacheをプライベートLANから使う

DJBのtinydnsは、外部インターフェイスで権威サーバーtinydnsを動かし、内部インターフェイス(lo0)でリゾルバdnscacheを動かすという実にシンプルな構成になっている。BINDみたく、両方一緒になっててクエリの種類でVIEWを分けて挙動を変えるなんてことはしていない。だからこそ安全なんだが、だからこそ、今回の場合は頭を抱えることになった。

外部インターフェイスにalias付け、そのalias上で、もひとつdnscacheを動かすって方法もあるんだが、それはそれで面倒だ。ということで、pfにおいで願った。要は、プライベートLANからのクエリであれば、loopbackへリダイレクトしてしまえ、という方法である。

DMZにあるマシンのdnscache

プライベートLANからのクエリも受け付けるように変更する。server/ipに、プライベートLANのネットワークを付けたファイルを追加。

# touch ${DNSCACHE}/server/ip/[プライベートLANネットアドレス]
rtx1000

リゾルバサービスを止め、プロバイダからの通知にあるリゾルバの取り入れを止め、DMZにあるマシンのアドレスをリゾルバとして直接指定。dhcpでも、自身のアドレスを通知させないように。

dns service off
no dns server pp
dns server [DMZ にあるマシンのアドレス]
dns notice order dhcp server
dns notice order msext server

さらに今回、プライベートLAN に居ながら、手動でアドレスを割り当てていたMac miniも、dhcpを利用するように変更してるんだけど、ここには書かない。

pf.conf

これが今回のキモ。キモなのに 2行しかない。

table <nats> { プライベートLANネットアドレス }
rdr on $ext_if inet proto { udp, tcp } from <nats> to any port domain -> 127.0.0.1 port domain

dhcp配下の各マシンをあれこれ操作したり、tinydnsとdnscacheのログをしばらく眺めてて、想定していた結果になっていることを確認。rtx1000 のファームが更新されるまではこれでいきませう。

今後

DMZにあるマシンのリゾルバのキャッシュが、WindowsやMac(or PS3)が呼び込んだ「なにか」によって汚染される可能性があるのが今イチ。やはり、BINDを各マシンに入れ込むかなぁ。ISCの配布しているBINDは試してみたいし。んで、PS3だけはプロバイダの再帰サーバー使えばいいやな。rtx1000経由で使うなら、フィルタをも少し検討しないとな。プロバイダのリゾルバ以外からのレスポンスは受付けないようにするとか。

0 件のコメント:

コメントを投稿