オープンリゾルバとか滅べばいいのにと思いつつオープンリゾルバについて書く

DNSの話題と言えば、最近では「浸透言うな」問題について話題になったりもしました*1が、DNSの問題点は「浸透言うな」だけではありません。
Kaminsky Attackの時にも少し話題に上がりましたが、『オープンリゾルバ』と呼ばれるDNSサーバが存在していることも問題になっています。
そこで、このオープンリゾルバについて少しまとめてみたいと思います。
私自身の理解がまだ足りていないところもあるかもしれないので、ツッコミ歓迎です。

DNSの動き

DNSは、すごくざっくり端的に言えばドメイン名(google.comとか)からIPアドレスに変換してくれるシステムのこと。
コンピュータはこのIPアドレスを使わないと通信することができないため、このようなシステムが使われています。
DNSで利用されるサーバは2種類あり、ドメイン名に対するIPアドレスなどの情報を持ち、それを提供するDNSサーバを「コンテンツサーバ」、複数のコンテンツサーバをはしごして再帰的に問い合わせをおこない、情報(ドメイン名に対するIPアドレスなど)を取得してくるサーバを「キャッシュサーバ」と呼びます。
プロバイダさんが提供してくれるDNSサーバや、Google Public DNSは「キャッシュサーバ」にあたります。


で、このキャッシュサーバ、プロバイダさんが提供してくれるDNSGoogle Public DNSを除けば、普通外部には公開せず内部向けのみで使います。
が、このキャッシュサーバが外部から利用できてしまうことがあります。

オープンリゾルバとはなんぞや

オープンリゾルバとは、組織の内部だけでなく外部からも利用できるキャッシュサーバのことです。
組織や企業などでBINDを利用し、コンテンツサーバとキャッシュサーバを一緒に扱ってしまうことで、このような状態になってしまうことがあります。
ということは…このキャッシュサーバを違う組織の人間でもGoogle Public DNSのごとく利用できてしまうわけです。
なので、外部からオープンリゾルバなサーバに、例えば「GoogleIPアドレス教えてよ!」と問い合わせると、キャッシュサーバであるオープンリゾルバはわざわざGoogleIPアドレスを探してきてくれて「GoogleIPアドレスはXXXだよ!」と回答してくれるわけです。
すごいね!!! …すごくねーよ。

で、このままだとなにが問題?

本来外部に公開したくないサーバを公開してしまっているので、このサーバに攻撃されると通常通り使っている内部の人達にも影響が及びます。
オープンリゾルバのサーバをほったらかしにしておくことは、いわば「戦場に丸裸で立っている」状態に等しく、いつ攻撃されてもおかしくありません。気づいたら早く対策してください。
オープンリゾルバに対する攻撃方法として有名なものに、「DNSキャッシュポイズニング」と「DNS Amp」と呼ばれるものがあります。
DNSキャッシュポイズニングは一時期Kaminsky Attackがニュースサイト等で報道されたので知っている人は多いと思うためここでは割愛。
参考URLは以下。
インターネット10分講座:DNSキャッシュポイズニング - JPNIC
DNSキャッシュポイズニングの脆弱性に関する注意喚起:IPA 独立行政法人 情報処理推進機構
今更だけどDNSキャッシュポイズニングについて簡単に説明するよ! - そして、DNSポイズニングがなかなか対応されない理由。 - FreeBSDいちゃらぶ日記


DNS Ampは、予め複数のオープンリゾルバにサイズの大きなゴミ情報を仕込んだ上で、攻撃先にゴミ情報が届くよう送信元を偽装した問い合わせを、ゴミ情報を仕込んだオープンリゾルバに対して何度も送ると、踏み台にされたオープンリゾルバは攻撃先にゴミ情報を大量に送りつけ、最終的にサービスをダウンさせることができてしまうという攻撃です。
こちらは直接的に被害が及ぶことはないですが、迷惑千万極まりないです。
参考URLは以下。
DNSの再帰的な問合せを使ったDDoS攻撃の対策について
DNSの再帰的な問い合わせを悪用したDDoS攻撃手法の検証について(PDF)

問題があるか確認する方法はないの?

鈴木先生(Welcome to the E-ONTAP)および前野先生(qmail.jp top)のWebサイトへアクセスした際、危険なキャッシュサーバ*2を使用している場合には、警告ページに誘導されるようになっているようです。
また、徳丸先生の旧ブログ(徳丸浩の日記)の上に表示されているバナーでも、危険なキャッシュサーバからのアクセスの際に警告を表示するようになっています。
ただし、これは危険なDNSサーバのリストと合致したもののみ表示される仕組みになっている*3ため、もし仮にこのリストに載っていなかった場合にはわかりません。
一番確実な方法は、調べたいDNSサーバについて、そのサーバがある組織のからdigコマンド等によって問い合わせればすぐわかります。
外部から問い合わせをしてくれるサービスやiPhoneアプリもありますが、その辺の利用は自己責任で。

digコマンドで問い合わせを行う場合、再帰問い合わせをしないオプション(+norec)をつけた上で、回答を得た(ANSWER SECTIONがある)際にraフラグが立っていれば外部から再帰問い合わせを受け付けている、ということになります。

じゃあどうすればいいの?

組織の中など、届く範囲にオープンリゾルバがあればキャッシュサーバを外部に公開しないようきちんと設定してください。
設定する上で一番手っ取り早いのはコンテンツサーバとキャッシュサーバを分離して運用すること。
IPv4に限りますがdjbdnsではコンテンツサーバとキャッシュサーバのプログラムが最初から完全に分かれています*4
またはコンテンツサーバとキャッシュサーバで別々のソフトを使ってください*5
ただ、コンテンツサーバとキャッシュサーバを分離するということは必然的にIPアドレスが2つ必要、ということになります。
BINDの場合はIPアドレス1つでも運用できるので管理上は楽ですが、先にも書いたとおりオープンリゾルバとなっている主原因はこのBINDにあったりします。
BINDの場合はVIEW機能を使うなどしてサーバの有効範囲を制限してください。
詳しい設定は以下のURLより。
次世代のセキュリティ拡張DNSSECをBIND 9で実現 (3/3):実用 BIND 9で作るDNSサーバ(13) - @IT
ISC BINDのView定義方法 | ユーロテック情報システム販売株式会社

とにかく

最近ではIPv4のアドレスがなくなっただとか、DNSSECが普及していく、とか言われてますが、それなのに未だにおかしな設定や古いシステムを使い続けている*6所の多いこと多いこと。
こんな状態でDNSSECが広まるか。私には到底そうは思えません。
そんなわけで、DNSSECがどうだとか言う前に、まずはベースとなっているDNSについて知って欲しいな、と思う次第。ドキュメントはJPRSにもIPAにもJPNICにもたくさん転がってるし。
というかDNSについてもっと勉強してくださいお願いします(特に管理者の方)。
動けばいいってもんじゃないの!

実践DNS DNSSEC時代のDNSの設定と運用

実践DNS DNSSEC時代のDNSの設定と運用

*1:なぜ「DNSの浸透」は問題視されるのか:Geekなぺーじ

*2:オープンリゾルバなだけでなく、Kaminsky Attackで問題となったポートランダマイザの有無によっても判断しているらしい

*3:インターノット崩壊論者の独り言 - 毒入れしてみた - 危険なDNSサーバの利用者へ警告

*4:tinydnsとdnscache

*5:コンテンツサーバならNSD、キャッシュサーバならUnboundとか

*6:"dig chaos txt version.bind"でBINDのバージョン設定問い合わせればよく分かります