1.DNSキャッシュポイズニング
(1)概要
DNSキャッシュポイズニングとは、言葉のとおり、「DNSのキャッシュ」に「ポイズニング(毒を盛る)」ことだ。嘘のDNS情報を入れ込み、正規のサイトにアクセスしているつもりが、違うサイトにアクセスさせる。これで、ウイルスに感染させたり、個人情報を盗んだりする。DNS情報を偽装するDNSスプーフィングの代表的なものだ。
過去問(H27AP春午前問37)では、「DNSキャツシュポイズニングに分類される攻撃内容」として、「PCが参照するDNSサーバに偽のドメイン情報を注入して,偽装されたサーバにPCの利用者を誘導する」と述べられている。
以下の図を見てください。example.comの正規サーバのIPアドレスは192.51.100.1です。しかし、DNSキャッシュポイズニングによって、DNSサーバに偽りのドメイン情報が注入されたとします。利用者はexample.comのIPアドレスをDNSサーバに問い合わせ(下図①)ると、DNSサーバは203.0.113.1を返します(下図②)。PCは偽りのサーバに接続させられてしまいます。
具体的に見てみよう。以下のように、PCでは自社のDNSサーバにDNSの問い合わせをする。本来のDNSサーバから結果が返ってくる前に毒(偽装した回答)を入れ込むのだ。
偽りのDNS情報をキャッシュさせることなんて,本当にできるのですか?
DNSの回答までは1秒もかからないと思います。
そんな絶妙のタイミングで巧妙に偽装した回答を返せるわけがないと思います。
その疑問は自然だね。良く分かる。
では、以下のように、悪意のある攻撃者が自分で問い合わせをしたらどうだろう。本来のDNSからの回答を偽装したパケットまで準備しておけば、本来の解答より早く返すことは可能だ。これにより、DNSサーバに偽の情報をキャッシュさせる。
たしかにDNSの問い合わせはUDPなので、3wayハンドシェークなどの処理がありません。でも、なんらかのID情報を持っていれば、このような攻撃は防げるのではないですか?
実はID情報を持っている。DNSで問い合わせするときに、問合せのID情報を付けて送っている。回答のIDが違ったら、偽の情報と分かる仕組みだ。
しかし、IDは16ビットであり、65536通りしなない。なので、攻撃者は65536通のIDを付けた回答を全て送り付けるのだ。これであれば、DNSサーバはIDが一致したものを信じてしまうのである。
以下がとても詳しく解説されている。
https://www.nic.ad.jp/ja/newsletter/No40/0800.html
過去問を解いてみよう。
過去問(H21NW午前Ⅱ問19)(H25SC春午前Ⅱ問12) |
---|
問19 企業のDMZ上で1台のDNSサーバをインターネット公開用と社内用で共用している。このDNSサーバが,DNSキャッシュポイズニングの被害を受けた結果,引き起こされ得る現象はどれか。 ア DNSサーバで設定された自社の公開WebサーバのFQDN情報が書き換えられ,外部からの参照者が,本体とは異なるWebサーバに誘導される。 イ DNSサーバのメモリ上にワームが常駐し,DNS参照元に対して不正プログラムを送り込む。 ウ 社内の利用者が,インターネット上の特定のWebサーバを参照する場合に,本来とは異なるWebサーバに誘導される。 エ 電子メールの不正中継対策をした自社のメールサーバが,不正中継の踏み台にされる。 |
↓
↓
↓
↓
↓
もうお分かりだと思うが、正解はウ
(2)カミンスキー攻撃
カミンスキー攻撃(Kaminsky's attack)は、DNSキャッシュポイズニング攻撃の効率的な攻撃方法です。ダン・カミンスキー氏が発見したことからこのように呼ばれます。
従来のDNSキャッシュポイズニング攻撃では、キャッシュの時間(TTL)が切れるのを待ってからの攻撃で、効率は良くありません。
カミンスキー攻撃では、標的DNSサーバに対して、存在しないであろうドメインを問い合わせします(例:hoge.example.com)。存在しなければ、example.comの権威DNSサーバに問い合わせをしますが、そのときに、hoge.example.com以外に、ns.example.jpなどの、聞かれていない情報まで汚染して送り込むのです。これが、一部のDNSサーバにおいて、上書きできるのです。
※参考URL:https://jprs.jp/related-info/guide/009.pdf
(3)DNSキャッシュポイズニングの対策
カミンスキー攻撃を含む、DNSキャッシュポイズニングの対策は、サーバの要塞化を図るとともに、以下の設定を行います。
①送信元ポート番号のランダム化
DNS応答を受け取ったサーバでは、ポート番号に矛盾があると、不正なパケットとして判断します。仮に送信元ポート番号が固定(つまり1つ)だとすると、偽装するパケットのあて先ポート番号は1つで済みます。ですので,偽装パケットはIDの数である65536個を作成すれば攻撃が成立します。ところがポート番号をランダム(例えば10,000個)にすると,偽装パケットはポート番号を変えながら,合計10,000×65,536個送らないといけません。処理が大変ですし、正規の応答より早く送信ができない可能性もあります。
②DNSサーバの構成変更
DNSサーバを、コンテンツサーバとフルリゾルバサーバに分離します。この対策により、キャッシュポイズニング攻撃は防げます。
1)コンテンツサーバ
キャッシュを無効にする。つまり、再帰検索を無効にする。設定は、recursion no
結果的に、自分が持っている(権威ある)ゾーン情報のみを回答する。
2)キャッシュサーバ兼コンテンツサーバ
コンテンツサーバとキャッシュサーバの分離を図り、それぞれの対策を実施する。
3)キャッシュサーバ
再帰問い合わせは許可されたセグメント(一般的には内部セグメント)のみから許可する。
その設定で、運用上は問題ないのです?
キャッシュサーバは、企業の内部セグメントからの問い合わせだけに答えればよい。なので、問い合わせのIPアドレスは内部に制限できる。
プロバイダのDNSサーバであっても同じだ。自分のプロバイダにて払い出しているIPアドレスからの応答のみを答える。
③DNSSEC
DNSSEC(DNS Security Extensions)では,ディジタル署名を用いることで,DNSキャッシュサーバからの応答が正しいもの,つまり,改ざんされていない情報であることが確認できる。詳しくは後述。
(4)過去問で詳しく学習
R1NW午後Ⅱ問2に非常に詳しい問題があるので確認しよう。
過去問(R1NW午後Ⅱ問2) |
---|
〔DNSサーバヘの攻撃と対策〕 Jさんは, DNSサーバヘの攻撃の中でリスクの大きい,DNSキャッシュポイズニング攻撃の手法について調査した。Jさんが理解した内容を次に示す。 DNSキャッシュポイズニング攻撃は,次の手順で行われる。 (i)攻撃者は,偽の情報を送り込みたいドメイン名について,標的の【 f 】サーバに問い合わせる。 (ii)フルリゾルバサーバは,指定されたドメインのゾーン情報を管理するコンテンツサーバに問い合わせる。 (iii)⑥攻撃者は,コンテンツサーバから正しい応答が返ってくる前に,大量の偽の応答パケットを標的のフルリゾルバサーバ宛てに送信する。 (iv)フルリゾルバサーバは,受信した偽の応答パケットをチェックし,偽の応答パケットが正当なものであると判断してしまった場合,キャッシュの内容を偽の応答パケットを基に書き換える。 この様子を以下に図に示す。 ※IDとは、このあとの識別子のことである。 (ii)の問合せパケットと,(iii)の応答パケットの情報を表3に示す。 表3に示すように,(ii)の問合せパケットの送信元ポート番号には特定の範囲の値が使用されるケースが多いので,攻撃者は,(iii)の偽の応答パケットを正当なパケットに偽装しやすくなるという問題がある。調査の結果,この問題の対応策には,送信元ポート番号の【 g 】化があることが分かった。 表3 (ii)の問合せパケットと,(iii)の応答パケットの情報(抜粋) Jさんは,DMZにある外部DNSサーバを、コンテンツサーバとして機能するDNSサーバ1と、フルリゾルバサーバとして機能するDNSサーバ2に分離すると考えた。Jさんは、⑦外部DNSサーバの構成変更によって,インターネットからのDNSサーバ2へのキャッシュポイズニング攻撃は防げると判断した。さらに,万が一の場合に備え,DNSサーバ2には,送信元ポート番号のランダム化に対応した製品の導入を提案することにした。 Jさんは,調査結果と対応策をN主任に説明し,DNSサーバ2には送信元ポート番号のランダム化対応の製品の導入が了承された。 設問1【オリジナル問題】 【 f 】~【 g 】に入れる適切な字句を答えよ。 設問5 〔DNSサーバヘの攻撃と対策〕について(1)~(3)に答えよ。 (1)表3中の問合せパケットに対して,フルリゾルバサーバが正当な応答パケットと判断するパケットの内容について,表3中の【 キ 】~【 サ 】に入れる適切な字句又は数値を答えよ。 (2)本文中の下線⑥では,大量の偽の応答パケットが送信される。当該パケット中で,パケットごとに異なる内容が設定される表3中の項目名を,全て答えよ。 (3)本文中の下線⑦について,防げると判断した根拠を,60字以内で述べよ。 (4)【オリジナル問題】本文中の下線⑦について,DNSサーバ1へのキャッシュポイズニング攻撃も防げる。その理由を,20字以内で述べよ。 |
↓
↓
↓
↓
↓
難しかったと思います。正解は以下です。
設問1
f:フルリゾルバ(またはキャッシュDNS)
g:ランダム
設問5 (1)
(ⅱ)のパケットを、表3と比べて正解を考えます。
【空欄サに関して、DNSサーバは,受信した問合せのパケット中の識別子を,応答パケット中に入れて返信します。設問文には「フルリゾルバサーバが正当な応答パケットと判断する」とあります。なので、識別子は同じ値,つまりmであるべきです。
空欄キ:コンテンツサーバのIPアドレス
空欄ク:フルリゾルバサーバのIPアドレス
空欄ケ:53 空欄コ:n 空欄サ:m
(2)
解答例:宛先ポート番号,識別子
[解説]
攻撃者が知りえない「宛先ポート番号」と「識別子」の2つは、総当たりでパケットを作ります。よって、パケットごとに異なる内容が設定されます。ちなみに、送信元IPアドレスは、nslookupコマンドなどで、example.comのNSレコードを調べればわかります。
(3)攻撃者が送信する,キャッシュポイズニングのための名前解決要求パケットは,FWで破棄されるから
(4)DNSサーバ1は再帰問合せをしないから
[解説補足]DNSサーバ1へキャッシュポイズニングを仕掛けた場合、パケットそのものは届きます。FWで許可されているからです。ですが、DNSサーバ1は再帰問合せをしないので、キャッシュポイズニング攻撃は成功しません。
2.なぜDNSはコンテンツサーバとキャッシュサーバに分けるのか
まず、どうやってキャッシュポイズニングを実現するのか。そこから理解が必要である。
キャシュサーバがコンテンツサーバに再帰問い合わせを実施したとき、正規のコンテンツサーバが回答するより先に回答をすることで、キャッシュポイズニングを実現する。
❶コンテンツサーバ
再帰問い合わせをしなければ、キャッシュしない。よって、キャッシュポイズニングが発生しない。
❷キャッシュサーバ
DNSキャッシュポイズニングに攻撃は、キャッシュサーバに問い合わせを実施し、正規のサーバから回答が来る前に偽りの回答を送りこんでいる。よって、このような攻撃をさせなければよい。そこで、問い合わせを受けつけるのを、安全な内部セグメントに限定する。
内部セグメントであれば、(ボットなどによる攻撃を受ける可能性はあるが、)攻撃を受けにくいことは間違いない。
詳しくは以下も参照いただきたい。
nw.seeeko.com
3.DNSSEC
(1)DNSSECとは
DNSSEC(DNS Security Extensions)では,ディジタル署名を用いることで,DNSキャッシュサーバからの応答が正しいもの,つまり,改ざんされていない情報であることが確認できます。また、DNS通信を暗号化する目的ではありません。
以下の資料が、(内容はとても深いのであるが、)詳しいです。
https://www.nic.ad.jp/ja/materials/iw/2012/proceedings/t9/t9-Funato.pdf
また、DNSSECを実装するには、キャッシュDNSサーバ、コンテンツDNSサーバの両方に、DNSSECの設定を有効にする必要があります。
完全なる余談ですが(もちろん試験で問われません)、キャッシュサーバ側では、named.confのoptionsにて以下を記載します。
dnssec-enable yes; dnssec-validation yes;
(2)DNSSECによる検証の流れ
以下の図で簡単に解説します。
では、DNS問い合わせと検証の流れを確認しましょう。
①PCがキャッシュDNSサーバにDNSの問い合わせをします。たとえば、「www.seeeko.comのIPアドレスを教えてください」という問い合わせです。
②キャッシュDNSサーバは、コンテンツDNSサーバにDNSSECを有効にしてDNSの問い合わせをします。
③コンテンツDNSサーバは、DNSの応答をする際に、ディジタル署名を付与します。
④応答を受け取ったキャッシュDNSサーバは、ディジタル署名を検証します。
キャッシュDNSサーバがディジタル署名の正当性を検証するには、コンテンツDNSサーバの公開鍵を入手する必要があります。試験には出ませんが、公開鍵は、コンテンツDNSサーバのDNSKEYリソースレコードに保存されます。
(3)DNSSECの有効範囲
PCとキャッシュDNSサーバ間はどうやってDNSSECをするのですか?
先の図でも記載しましたが、PCとキャッシュDNSサーバ間のDNS問合せは、DNSSECを使いません。というか、PC側が対応していないので、使えないと思ってください。従来通りの問合せです。
Q.なぜPCとキャッシュDNSサーバの間はDNSSECの必要性が高くないのか? |
↓
↓
↓
↓
↓
A.DNSキャッシュポイズニングなどの攻撃は、キャッシュDNSサーバに対して行われます。よって、キャッシュDNSサーバにて対策が行われれば一定の効果が期待できるのです。また、キャッシュDNSサーバとDNSSECを実施したとしても、すでに汚染されたレコードを受け取っていれば、その汚染されたレコードに対して署名をしてしまい、意味がありません。
DNSSECの詳細な動作に関しては、過去の試験ではあまり問われませんでした。なので、言葉と概要だけ覚えておけばいいでしょう。
(4)情報処理安全確保支援士の試験の過去問
❶過去問(H22SC春午後Ⅱ問1) |
---|
過去問の以下の空欄にあてはまる言葉を考えよう。 |
M主任とNさんは、DNSキャッシュポイズニング対策について検討した。根本的な対策として、[ a ]というDNSのセキュリティ拡張方式の導入が考えられた。[ a ]は、DNSのレコードに公開鍵暗号方式による[ b ]を付加し、応答を受け取った側ではその[ b ]を検証する方式である。しかし、[ a ]には、鍵の管理をどのように行うかなど、今までのDNSサーバにはない運用手順が必要であること、Y社だけでなく大多数の組織が対応していなければならないことから、すぐには採用できない。 |
DNSSECであるが、以前は対応していないDNSサーバが多かったため、あまり普及していなかったと思う。
最近は少しずつ普及しだしたと思うが、それでも、対応していないDNSサーバに対して、きちんと問い合わせができるかがあやしいと思っているSEは多いのではないだろうか。
普及にはもう少し時間がかかるのではないかと思う。
この問題の解答は以下だ。
↓
↓
↓
↓
↓
a DNSSEC
b ディジタル署名
DNSSECについて、違う過去問では、「ディジタル署名によってDNS応答の正当性を確認できる(H22秋SC午前2問19)」ものと述べられている。
❷過去問(H27SC春午前Ⅱ問14) |
---|
問14 DNSSECで実現できることはどれか。 ア DNSキャッシュサーバからの応答中のリソースレコードが,権威DNSサーバで管理されているものであり,改ざんされていないことの検証 イ 権威DNSサーバとDNSキャッシュサーバとの通信を暗号化することによる,ソーン情報の漏えいの防止 ウ 長音“-”と漢数字“一”などの似た文字をドメイン名に用いて,正規サイトのように見せかける攻撃の防止 エ 利用者のURLの打ち間違いを悪用して,偽サイトに誘導する攻撃の検知 |
↓
↓
↓
↓
↓
正解はア
(5)DNSKEYリソースレコード
DNSSECで利用されるコンテンツサーバの公開鍵は、DNSKEYリソースレコードにセットされる。情報処理安全確保支援士の試験ではここまでは問われないので、完全なる余談です。
RFCを見ると、以下の記載がある。
https://jprs.jp/tech/material/rfc/RFC4034-ja.txt
RFC 記載内容 |
---|
2. DNSKEYリソースレコード DNSSECは、公開鍵暗号を使用してDNSリソースレコードセット(RRset)への 署名と、RRsetの認証を行う。公開鍵はDNSKEYリソースレコードに保存され、 [RFC4035]が規定するDNSSEC認証で使用される。 具体的に、ゾーンは権威を持つRRsetに秘密鍵で署名し、その秘密鍵と対の 公開鍵をDNSKEY RRに保存する。すると、リゾルバはDNSKEY RRに保存された 公開鍵を使用してゾーンのRRsetに付けられた署名を検証し、それらを 認証することができるようになる。 |
試しに、digコマンドでDNSKEYを調べてみよう。
※nslookup ではできない。また、ipaやGoogleではDNSKEYリソースレコードが出てこないので(理由は要調査。もう少し複雑な仕組みを使っているかもしれない)、jprs.jpで実験した。覚える必要は全くないが、256と書いてある方がZSK (Zone Signing Key)で、署名に使われる公開鍵。257は、KSK (Key Signing Key)。
digコマンド |
---|
\# dig -t DNSKEY jprs.jp (中略) ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 4096 ;; QUESTION SECTION: ;jprs.jp. IN DNSKEY ;; ANSWER SECTION: jprs.jp. 300 IN DNSKEY 256 3 8 AwEAAbAWk7ayFdYLAQXMPCcMFGi+F9uTkDYDAPhiWtRbOpm054K7TC3q UntT0wFyIc/4ujDNB/eUhCxZKjzGOVDjDVjlwXQqMoSPf6eBgMr2ybpV efxXCYQWVSWTE3XBbkZypemuUt6PL9NXbMu9LJZbpAYUSgXeg1QJQkbN +5rlhJGv jprs.jp. 300 IN DNSKEY 257 3 8 AwEAAbra/T97DN5jJRbB5GGs3xtONaJ3gcMHjkdYemjo6AxefvcSSr0q GrqnT9cd4XbnIEzxX6SyLo8dJRPpOPwz1LOJRNGiX0VdVDmMwAjVbbPd VSpcxnQ4XEmdWaWRYFIuPlVUgM/Sh+mSE4QOhae3Eaq4DY4PEY4uaVOL 8850pqEVATUQy6frhyr2q8x5efTOh+2S3QgjxllfN8/DPcAyL07XvCja nVAm1LuT5nzlhEpP3kHhcwkUrb/eEGVqfLUSUpmiWD3Hv+sHVbj4RTVz hReUt343AsqwG1O+BkQhVBT00PTGCqcx8MfzGta6pqsP64SkfU71XcYT /xF9gqvjw5M= |
4.DNS over TLS とDNS over HTTPS
DNS over TLS (DoT)とDNS over HTTPS (DoH)の2つの技術について解説する。従来は非暗号で認証が無いDNSを、TLSの技術を使うことえ、通信の暗号が行える。
※認証をするかは別途(たぶんしないと思う)
両者の大きな違いはポート番号である。DoTは853、DoHでは443を使う。
この技術は、クライアントPC(スタブリゾルバ)とキャッシュDNSサーバ(フルサービスリゾルバ)の間の通信を暗号化するために開発された。(フルリゾルバからDNS権威サーバへの通信は対象外)。
これにより、第三者による通信の盗聴や改ざんを防ぐことができる。たとえば、公衆無線LANなどを利用している状態で、どこに通信したかなどを盗聴されることが防げる可能性が高まる。
この技術を利用するには、クライアントとDNSサーバの両方でDNS over TLS (DoT)に対応している必要がある(当たり前だが)。WindowsのOSでの普及より、スマホでの普及が先行しているような気がする。
DNSSECもありましたよね?
DNSSECとは目的が違う。
違い❶:DNSSECはディジタル署名による「認証」を目的としている。通信の暗号化はされない。⇔DoTやDoHは暗号
違い❷:DNSSECは、キャッシュDNSサーバ(フルサービスリゾルバ)と、コンテンツDNSサーバの間での認証強化。⇔DoTやDoHはクライアントPC(スタブリゾルバ)とキャッシュDNSサーバ(フルサービスリゾルバ)の間
5.その他
(1)DNSのゾーン転送に関して
過去問(H22春SC午前2問8) |
---|
問8 DNSサーバに格納されるネットワーク情報のうち、第三者に公開する必要のない情報が攻撃に利用されることを防止するための、プライマリDNSサーバの設定はどれか。 ア SOAレコードのシリアル番号を更新する。 イ 外部のDNSサーバにリソースレコードがキャッシュされている時間を短く設定する。 ウ ゾーン転送を許可するDNSサーバを登録する。 エ ラウンドロビン設定を行う。 |
↓
↓
↓
↓
↓
アは、DNS情報を変更した場合に必要な作業。シリアル番号の数字が増えていると、情報が書き変わったとみなされ、セカンダリDNSサーバへゾーン転送される。
イは、移転などにより、IPアドレスを変更する場合に行う作業。例えば、xxx.comのIPアドレスが1.1.1.1から3.3.3.3に変更した場合、多くのDNSサーバのキャッシュに古い1.1.1.1が保持されている場合、古いIPアドレスにアクセスし続けるため、利用者がアクセスできない。
ウは、正解。DNSの設定において、allow-transferでゾーン転送を許可するサーバを指定する。
ということは、DNSのゾーン転送はデフォルトでは誰でも受けられるということですか?
そう。セカンダリDNSサーバは、typeをslaveにして、mastersにプライマリDNSサーバのIPアドレスを入れるだけ。もっというと、セカンダリDNSサーバを立てる必要もなく、コマンドでゾーン情報を取得することもできる。
あ、でも。
そもそも、DNS情報は公開する情報ですよね。
だから、第三者に見られてもいいのでは
まあ、そうだ。しかし、全部の情報のリストを見られると、その組織のネットワーク情報が分かってしまう。なので、セキュリティ上あまり好ましくないだろう(あくまでもだろう)というものである。
公開することが、セキュリティ上大きなリスクにつながるというものでもない。
(2)DNSサーバの送信ポート番号も53番?
宛先ポート番号は53ですよね。
送信元のポート番号も53なんですか?
古いバージョンの場合はそうだった。宛先ポート番号だけでなく、送信元ポート番号も53という時代があった。
しかし、これには問題があった。
情報処理安全確保支援士試験の過去問を見てみよう。
過去問(H22春SC午後2問1) |
---|
DNSソフトの製品サポート窓口からは,現時点でとり得る対策として, DNSサーバで,②名前解決の問合せにおいてDNSキャッシュポイズニング攻撃を受けやすい不適切な設定を行わないという解決策が提示され,それに従い設計書を修正した。念のため,現在のDNSサーバの設定を確認したところ,設定は適切であった。 設問2(3)本文中の下線②について, DNSキャッシュポイズニング攻撃を受けやすいDNSサーバの不適切な設定とはどのような設定であるか。 25字以内で述べよ。 |
↓
↓
↓
↓
↓
正解は「送信元ポート番号を固定する設定」である。
これは、送信元ポート番号が、古いDNSサーバの場合は53に固定されていることが問題ということだ。DNSキャッシュポイズニングでは、一瞬のスキで偽装パケットを送る必要がある。ポート番号が固定されていれば、応答パケットを作りやすいので、攻撃を受けやすい。
最近というか、かなり前のDNSサーバから、送信元ポート番号は固定ではなくなった。まだ、変えていないことろがあるとすると、変えた方がいい。その際、FWの設定変更が必要なこともあり、注意が必要だ。送信元ポートを53固定で許可している可能性があるからだ。