そのDNSの応答、本当に正しいものですか?

「.jp」でも正式導入、DNSSECの仕組みと意義<前編>

株式会社日本レジストリサービスシステム運用部の坂口智哉氏
株式会社日本レジストリサービス技術研究部の民田雅人氏

 2008年7月、インターネット関係者を震撼させる発表が行われた。「カミンスキーメソッド(カミンスキー氏の発見した攻撃手法)」と呼ばれるその手法を用いると、無防備なキャッシュDNSサーバーに対して、高い成功率で偽の情報を書き込むことができてしまう。偽の情報が書き込まれると、そのキャッシュDNSサーバーの利用者は、本来とは違うサイトに誘導されてしまう危険性が出てくる。

 「キャッシュポイズニング(キャッシュ汚染)」と呼ばれる攻撃手法は実は古くから存在していたが、それまで大きな問題とはなっていなかった。なぜなら、従来の攻撃手法の成功率は極めて低かったからである。ところが、カミンスキーメソッドの発見によって、キャッシュポイズニング攻撃が現実のものとなってしまったのだ。

 危機感を感じたインターネット関係者がその対応策として選んだのが、DNSの安全性を高める技術の1つである「DNSSEC(DNS Security Extensions)」の導入である。日本のドメイン名である「.jp」でも2011年1月に導入することが決まっている。

 DNSSECを導入することで、キャッシュポイズニング攻撃により偽サイトに誘導されることを防ぐことができる。一方、ドメイン名登録者(サイト運営者)にとっても、自分のサイトの利用者が偽サイトに誘導されることを防げるというメリットがある。

 では、DNSSECはどういう仕組みでDNSの安全性を高めるのか? また、DNSSECを導入するためには、いったい誰が、何をすればいいのか? 「.jp」の登録・管理を行う株式会社日本レジストリサービス(JPRS)技術研究部の民田雅人氏とシステム運用部の坂口智哉氏に話を聞いた。

DNSの仕組みと、キャッシュDNSサーバーの役割

 DNSSECとは何かを説明するにあたり、まずはDNS(Domain Name System)の基本的な仕組みを確認しておこう。

 DNSでは大きく分けて、1)ユーザーのコンピューター側で動作する「リゾルバー」、2)リゾルバーからの要求を受け、指定されたドメイン名の情報を探し出す「キャッシュDNSサーバー」、3)それぞれ管理対象となるドメイン名の情報(対応するIPアドレスなど)を保有する「権威DNSサーバー」――という3種類の役割が存在しており、これらが連携することでDNSは動作する。なお、キャッシュDNSサーバーは、ISPや企業・大学など、ユーザーにネットワーク接続を提供している組織が設置・運用しているのが一般的だ。

 例えば、ユーザーが「www.example.jp」というドメイン名を持つサイトにアクセスするためには、そのドメイン名に割り当てられているIPアドレスを知らなくてはならない。そこで、アプリケーションがリゾルバーを呼び出し「www.example.jp」についての情報を教えるようにキャッシュDNSサーバーに問い合わせる(このような問い合わせを「名前解決要求」と呼ぶ)。キャッシュDNSサーバーは、DNSの階層に従ってドメイン名を順にたどり名前解決を行う。この時に使われるのが「反復検索」と呼ばれる検索方法で、それぞれの権威DNSサーバーから得た回答を頼りに最終的な回答が得られるまで問い合わせを繰り返す。

 「www.example.jp」の場合は、まずDNSの最上位階層であるルートサーバーに対して名前解決要求を出し、その応答として「『jp』を管理しているのは『JP DNS』という権威DNSサーバーだから、そちらに聞け」と教えられる。それに従い、JP DNSに対して名前解決要求を出し、その応答として「『example.jp』を管理しているのは『example.jp』という権威DNSサーバーだから、そちらに聞け」と教えられる。さらにそれに従い、example.jpに対して名前解決要求を出すと、次の権威DNSサーバーではなく「www.example.jp」のIPアドレスが教えられる。キャッシュDNSサーバーは目的が達成されたので反復検索を終了し、その回答を、問い合わせ元(リゾルバー)に教えるという流れになる(図1)。


図1 DNSの概念図

 ただし、リゾルバーから名前解決要求がある度に毎回このような検索を行っているわけではなく、一度、名前解決要求を終えた際に一定時間その情報をキャッシュDNSサーバーが保持(キャッシュ)するようになっている。頻繁にアクセスされるドメイン名は短時間の間に何度も問い合わせられることから、応答速度の向上や、全体としての(名前解決要求にかかる)負荷を軽減できるからである。

狙われるキャッシュDNSサーバー、その応答は本当に正しいもの?

 このように、DNSの役割はドメイン名に対応するIPアドレスなどの情報を探し出すことにあるが、応答を受け取った側が、その情報が本当に正しいものかを検証できるようにし、DNS情報の信頼性を上げる仕組みを提供するのがDNSSECである。

 「従来は、やりとりされる情報は正しいものという前提がありましたし、それで大きな問題が起きたこともありませんでした。しかし、キャッシュポイズニング攻撃の懸念が大きくなったために、DNSでやりとりされる情報が本当に正しいものかを検証できるようにする必要があるということになったのです。」(坂口氏)

 キャッシュポイズニング攻撃とは、その名の通り、キャッシュDNSサーバーに対して偽の情報を送り込み、その内部にあるキャッシュ情報を攻撃者の都合のよいものにしてしまうことだ(これを「汚染」と呼ぶ)。通常は、図1の(8)の応答を偽造して、権威DNSサーバーからの本来の応答よりも先にキャッシュDNSサーバーに受け取らせてしまうという方法が用いられる。

 この攻撃が成功すると、そのドメイン名に対応する偽の情報がキャッシュされてしまうため、ユーザーからの問い合わせに偽の情報を返してしまうことになる。結果、そのキャッシュDNSサーバーのユーザーは知らず知らずのうちにフィッシングサイトなどに誘導される。しかし、DNSの応答形式としては正しいため、例えばフィッシングサイトが非常に巧妙にできていた場合など、ユーザーは異変に気付きにくいだろう。

 キャッシュポイズニング攻撃の成功率は、DNSサーバーソフトウェアがキャッシュポイズニング攻撃に対して全く対策されておらず、キャッシュDNSサーバーへのアクセス状況も監視されていないような状況下では、ほぼ100パーセントとも言われる。もちろん、対策済みのDNSサーバーソフトウェアを使ったり、監視していれば実用十分な程度には防げるが、それでも執拗な攻撃に耐えるのは大変だという。

DNSSECの仕組みと、キャッシュDNSサーバーの重要性

 キャッシュポイズニング攻撃を防ぐには、キャッシュDNSサーバーにおいて、権威DNSサーバーから返ってきた応答が正しいものかを検証できればよい。

 DNSSECの重要な点は、キャッシュDNSサーバーに検証(バリデーション)機能を持たせることができるという部分にある。キャッシュDNSサーバーが受け取った情報の出自(正当な発信者か)、完全性(改ざんのないこと)を検証できるため、偽造された応答を排除でき、DNSの安全性が高まる。

 図2は、これまでのDNSとDNSSECの応答の違いを示している。つまり、DNS応答に電子署名を付加し、その電子署名を使ってキャッシュDNSサーバーが検証を行えるようにする――これが、DNSSECの基本的な考え方だ。


図2 これまでのDNSとDNSSECの応答の違い

 図3では、キャッシュDNSサーバーが行う検証を具体的に説明している。最終的には、権威DNSサーバー側で作り出したハッシュ値(与えられた原文から生成された固定長の値)と、キャッシュDNSサーバー側で求めたハッシュ値を照合し、同じであれば正しい応答だと判定することになる。違っていれば、どこかで改ざんされたか、応答の出所が正しくないと判定される。


図3 DNSSECにおける署名と検証

 「DNSSECでは、ドメイン名登録者が自分の管理対象であるドメイン名の信頼を守るために(権威DNSサーバー側で)DNSSECの署名を行うことになりますが、権威DNSサーバー側だけ対応しても、肝心のキャッシュDNSサーバー側で検証をしてくれないと効果がありません。DNSSECでは、キャッシュDNSサーバー側の対応が重要な位置を占めると言えます。」(民田氏)

 「キャッシュポイズニング攻撃の問題がある以上、そのリスクを考えないわけにはいきません。キャッシュDNSサーバーの管理者には、ユーザーを守るという観点からもDNSSECの導入を進めていただければと思います。」(坂口氏)

 明日の後編では、DNSSECに関係する人々と、その役割がどのようになっているのか、また、DNSSECを導入するには誰が何をすればいいのか解説する。


関連情報


(遠山 孝)

2010/10/6 06:00