【DNS入門 第9回】DNSのセキュリティ ― キャッシュポイズニング、DNSSEC、暗号化DNS、運用の隙

DNS サーバー
スポンサーリンク
スポンサーリンク

「DNSSECって、有効にしないとまずいんですか?」
「ブラウザーのDoHって、社内で使わせて大丈夫なんでしょうか」

DNSは、ほぼすべての通信の入口にあるので、攻撃者にとっても魅力的な標的です。一方で、DNSの事故の多くは、実は高度な攻撃ではなく、消し忘れたレコードや更新忘れのドメインといった運用の隙から起きています。

第8回では、DNSを調べるコマンドを見ました。第9回では、DNSを狙う攻撃と、その守り方を整理します。第8回で見たSERVFAILの原因にもなるDNSSECも、ここで詳しく扱います。


脅威の全体像

まずは、DNSに関わる脅威を一覧にします。

端末・キャッシュDNS・権威DNS・レジストラ・攻撃者の間で、ポイズニング・盗聴改ざん・リフレクション・ランダムサブドメイン・トンネリング・テイクオーバー・失効・悪性ドメインの各脅威がどこで起きるかを示す図
脅威狙われる所起きること主な対策
キャッシュポイズニングキャッシュDNS偽の応答が記憶され、偽のサイトへ誘導されるポートのランダム化、DNSSECの検証
盗聴・改ざん端末〜キャッシュDNSの間閲覧先が漏れる、応答が書き換えられるDoT/DoH/DoQ
リフレクション攻撃オープンリゾルバー、権威DNS第三者へ大量の応答が送り付けられる再帰の制限、RRL
ランダムサブドメイン攻撃権威DNS、キャッシュDNS存在しない名前の大量の問い合わせで過負荷問い合わせ数の制限、監視
DNSトンネリング社内のキャッシュDNS問い合わせに載せたデータの持ち出しログ監視、DNSファイアウォール
サブドメインテイクオーバー自社ゾーンのCNAME等他人が自社の名前でサイトを公開する不要なレコードの削除、棚卸し
ドメインの失効・乗っ取りレジストラ、NSドメインごと他人の管理下に入る自動更新、レジストラロック、MFA
悪性ドメインへのアクセス利用者の端末マルウェア感染、フィッシング保護的DNS、RPZ

上の3つはDNSの仕組みそのものへの攻撃、下の5つは運用の隙やDNSの悪用です。後者は設定と棚卸しで防げるものが多く、日々の運用の範囲です。


キャッシュポイズニングとカミンスキー攻撃

キャッシュポイズニングは、キャッシュDNSサーバーに偽の応答を覚えさせる攻撃です。

攻撃者が権威DNSを装った偽の応答をIDとポートを推測して大量に送り、本物より先に受け入れられると偽の情報がTTLの間キャッシュされることと、カミンスキー攻撃が存在しない名前を次々に問い合わせさせてNSごと乗っ取る手法だったことを示す図

キャッシュDNSが権威DNSサーバーへ問い合わせてから本物の応答が届くまでの間に、攻撃者が権威DNSを装った偽の応答を送り付けます。それが先に受け入れられると、偽の情報がTTLの間キャッシュされ、利用者全員が偽のサイトへ誘導されます。受け入れられるには、問い合わせのID(16ビット)などが一致している必要があります。

以前は「すでにキャッシュされている名前は狙えない」ため、機会が限られていました。しかし2008年に公表されたカミンスキー攻撃は違いました。

  • 存在しない名前を次々に問い合わせさせる(a001.example.jp、a002.example.jp…)ことで、何度でも試行できるようにした
  • 偽の応答にNSレコードを含めて、ドメイン全体を乗っ取る

DNSの仕様上の弱点だったため、主要な製品が一斉に修正版を出す事態になりました。


キャッシュポイズニングへの対策

推測を難しくする対策としてIDの16ビット、送信元ポートの約16ビット、0x20の名前の文字数分のビットがあり、途中のNATがポートを書き換えるとその分が消えることと、中身を署名で確認するDNSSECは推測の問題ではないことを示す図
  • ソースポートのランダム化:送信元ポートを毎回ランダムにし、ID(16ビット)とあわせて推測を難しくする。2008年の修正の中心で、現在の製品は標準で行う。ただし、途中のNATやF/Wがポートを連番に書き換えると効果が消える
  • 0x20:問い合わせる名前の大文字・小文字をランダムに混ぜ(wWw.ExAmPle.jP)、応答が同じ並びかを確かめる。一部のリゾルバーが実装
  • 無関係なレコードを受け入れない:問い合わせと関係の無いドメインの情報はキャッシュしない
  • SAD DNS(2020年)への対処:OSのICMPの応答数の制限を手掛かりにポートを突き止める手法。OSとリゾルバーの修正で対処されており、OSも含めて更新を当てる
  • DNS Cookies(RFC 7873):なりすました応答を見分けやすくする(第4回)

ただし、以上はすべて推測を難しくする対策で、確率を下げるだけです。応答の中身が本物であることを確かめられるのは、DNSSECだけです。


DNSSECの仕組み

DNSSEC(DNSセキュリティ拡張)は、応答に電子署名を付け、改ざんされていないことを受け取った側が確かめる仕組みです。暗号化はしません。

レコード置かれる場所役割
DNSKEY署名したゾーンゾーンの公開鍵。KSK(鍵署名鍵、フラグ 257)と ZSK(ゾーン署名鍵、256)
RRSIG署名したゾーン同じ名前・型のレコードの組(RRset)ごとの署名。有効期間を持つ
DS親のゾーン子の KSK のハッシュ値。親から子へ信頼を受け渡す
NSEC署名したゾーン「この名前・型は存在しない」ことの証明。次の名前を示す
NSEC3署名したゾーンNSEC の名前をハッシュ化し、ゾーン内の名前を列挙しにくくする
CDS/CDNSKEY子のゾーン親に登録してほしい DS を子の側で公開する
親ゾーンjpのDSがexample.jpのKSKと一致し、KSKがDNSKEYの組を、ZSKがwww.example.jpのAの組を署名し、NSECがaの次はwwwと不在を証明することを示す図

署名は、データ → ZSK → KSK → 親のDSと上へつながっています。

www.example.jp. 300 IN RRSIG A 13 3 300 20261009000000 20260925000000 12345 example.jp. (署名)

RRSIGは左から、対象の型、アルゴリズム、ラベル数、元のTTL、有効期限、署名開始、鍵タグ、署名者です。期限が切れると検証に失敗するため、署名の自動更新が欠かせません。


信頼の連鎖と検証

検証するリゾルバー(バリデーター)は、ルートゾーンのKSKを信頼アンカーとして最初から持っています。

信頼アンカー(ルートのKSK)から、.のDNSKEY、jpのDS、jpのDNSKEY、example.jpのDS、example.jpのDNSKEY、www.example.jpのA+RRSIGと鎖がつながり、途中で切れるとSERVFAIL、最後までつながればADビットが付くことを示す図

ルートのDNSKEYをこのアンカーで確かめ、ルートが署名したjpのDS、それと一致するjpのDNSKEY……と親から子へたどり、最後にwww.example.jpのRRSIGを確かめます。これが信頼の連鎖です。

  • 途中で署名の期限切れやDSと鍵の不一致があると、応答は「偽物の可能性がある」と判定される。それを返せばDNSSECの意味が無くなるため、リゾルバーは答えを返さずSERVFAILを返す
  • 検証に成功すると応答にADビットが付き、クライアントがCDビットを付けると検証を止めた結果を受け取れる(第8回の+cd)
  • 親にDSの無いゾーンは「署名されていない」と扱われ、通常どおり解決される

アルゴリズムと鍵の運用

項目現在の推奨と動向
アルゴリズム 13(ECDSA P-256)署名と検証の両方で実装必須。署名が小さく、新規に署名するときの第一候補
アルゴリズム 15(Ed25519)推奨。署名は小さいが、検証側の対応状況を確かめてから使う
アルゴリズム 8(RSA/SHA-256)引き続き利用できる。ルートや多くのTLDが使用。応答は大きめ
アルゴリズム 5・7(RSA/SHA-1)RFC 9905(2025年)で署名への使用を非推奨。SHA-1の検証をやめたOSもある
KSK と ZSKKSKはDNSKEYの組を署名しDSで親とつながる。ZSKはゾーンのデータを署名する
鍵の更新ZSKは親の手続き不要。KSKは親のDSの差し替えが必要で、事故が起きやすい
CDS/CDNSKEY子が公開した値を親が確かめてDSを自動で更新する(RFC 7344・8078。対応はレジストリー次第)
KeyTrap(2024年)細工した鍵と署名で検証の計算量を膨らませるDoS。各製品が修正済みで、更新を当てる

いちばん事故が起きやすいのが、KSKの更新です。

新しいKSKをDNSKEYに追加し、CDSを公開して親が新しいDSを追加し、親のDSのTTLだけ待ってから古いKSKと古いDSを削除する4つの手順と、②を飛ばすと信頼の連鎖が切れてドメイン全体がSERVFAILになることを示す図
  1. 新しいKSKをDNSKEYに追加する
  2. CDSを公開 → 親がDSを追加する(手作業も)
  3. 親のDSのTTLだけ待つ
  4. 古いKSKと古いDSを削除する

②を飛ばして④を行うと、親には旧DSしか無いのに子には新KSKしか無い状態になり、信頼の連鎖が切れて、検証するリゾルバーからドメイン全体がSERVFAILになります(第8回のEDE 9)。新旧の鍵とDSが重なる期間を必ず作るのが鉄則です。なお、アルゴリズムの推奨は、RFC 9904(2025年)からIANAの一覧で管理されるようになりました。


ルートKSKの更新(KSK-2024)

DNSSECの起点であるルートのKSKも、更新が進んでいます。

2024年4月にKSK-2024(鍵タグ38696)を生成、2025年1月に公開、2026年10月11日にルートの署名をKSK-2024に切り替え、2027年1〜3月にKSK-2017(鍵タグ20326)を失効・削除するタイムライン
時期内容
2024年4月新しいKSK(KSK-2024、鍵タグ 38696)を生成
2025年1月KSK-2024をルートゾーンに公開。現行のKSK-2017(鍵タグ 20326)と並ぶ
2026年10月11日ルートの署名をKSK-2024に切り替える
2027年1〜3月(予定)KSK-2017を失効させ、ルートゾーンから取り除く

この記事を書いた2026年9月25日の時点では、ルートのDNSKEYに20326と38696の両方があり、署名は20326でした。切り替え後に38696を信頼していない検証リゾルバーは、すべての名前がSERVFAILになります。

自社の検証リゾルバーの信頼アンカーに38696があるかを確かめましょう。

  • BIND:rndc managed-keys status
  • Unbound:root.keyのファイル
  • Knot Resolver:root.keys
  • Windows ServerのDNS:Get-DnsServerTrustAnchor -Name .

多くのリゾルバーはRFC 5011の手順で新しい鍵を自動で取り込みます(新しい鍵を30日間観測してから信頼)。ただし、鍵の保存先に書き込めない、長く止めていた仮想マシンやイメージから起動したという場合は、取り込めていないことがあります。自動更新を使わない機器は、IANAが公開する信頼アンカー(root-anchors)で手作業で更新します。今の状態はdig . DNSKEY +multi(PowerShellはResolve-DnsName . -Type DNSKEY)で確かめられます。


リフレクション攻撃とオープンリゾルバー

リフレクション攻撃は、送信元のIPアドレスを攻撃対象に偽った小さな問い合わせをDNSサーバーへ大量に送り、その応答を攻撃対象へ送り付けるDDoS攻撃です。

攻撃者が送信元を被害者に偽った60バイトの問い合わせを複数のオープンリゾルバーに送り、約50倍の3,000バイトの応答が踏み台の数だけ被害者に届くことと、キャッシュDNSは再帰を社内に限り権威DNSはRRLを使う対策を示す図

応答は問い合わせよりずっと大きいため、攻撃の量が数十倍に増幅されます。攻撃者の回線は細くても、増幅率×踏み台の数で被害者があふれます。

  • 踏み台になりやすいのが、誰からの再帰問い合わせでも受け付けるオープンリゾルバー。キャッシュDNSは再帰に応じる相手を社内に限り、クラウドでもセキュリティグループで送信元を絞る
  • 権威DNSは誰からの問い合わせにも答える必要があるため、同じ応答を短時間に繰り返し返さないようにするRRL(応答レート制限)を使う
  • 何でも返すANYの問い合わせは増幅に悪用されたため、RFC 8482(2019年)で最小限の応答で済ませてよいことになった。dig ANYで全部のレコードは取れない

第7回で「権威とキャッシュを兼ねない」と書いた理由の1つが、ここにあります。


ランダムサブドメイン攻撃とDNSトンネリング

ボットネットがabc12.example.jpのような存在しない名前を大量に問い合わせてキャッシュを素通りさせ権威DNSを過負荷にするランダムサブドメイン攻撃と、感染端末が名前にデータを埋め込んで攻撃者の権威DNSへ送り応答のTXTで指示を受け取るDNSトンネリングを示す図
ランダムサブドメイン攻撃(水責め攻撃)DNSトンネリング
手口x7q2k.example.jp のような存在しない名前を大量に問い合わせる。キャッシュが効かず、すべて権威DNSまで届く送りたいデータを名前に埋め込んで問い合わせ、応答(TXT 等)で受け取る
目的権威DNSや途中のキャッシュDNSを過負荷にするF/Wを迂回したデータの持ち出し、マルウェアの遠隔操作
兆候特定ドメインへのNXDOMAINの急増、応答待ちの増加長くランダムな名前、1つのドメインへの大量の問い合わせ、TXTの多用
対策リゾルバーの問い合わせ数の制限、権威DNSの増強・エニーキャスト問い合わせログの監視、DNSファイアウォール、外部への53番の直接通信を禁止

どちらも1件ずつは普通の問い合わせに紛れるため、問い合わせログを残し、平常時の量を知っておくことが検知の前提です。DNSSECで署名されたゾーンでは、NSECを使って存在しない名前をキャッシュから答える仕組み(RFC 8198)が負荷の軽減に役立ちます。


サブドメインテイクオーバー

ここからは「運用の隙」です。サブドメインテイクオーバーは、使わなくなったDNSのレコードが残っていたために、他人に自社のサブドメインを使われてしまう問題です。

正常時はshop.example.jpがCNAMEで自社のリソースを指しているが、自社がリソースだけ削除してCNAMEがぶら下がり、攻撃者が同じ名前を取得すると偽ページが表示されることを示す図

典型例は次の流れです。

  1. shop.example.jpをCNAMEでクラウドのサービスの名前(例:shop-prod.service.example)に向けていた
  2. サービス側のリソースだけを削除し、CNAMEを残した
  3. 攻撃者がサービス上で同じ名前を取得すると、shop.example.jpで偽のページを公開できる

自社のドメインで表示されるため、フィッシングやCookieの盗用に悪用され、証明書まで取られることがあります。解放したIPアドレスを指すAや、削除したゾーンへのNSも同じです。

対策は、リソースを消す前にDNSのレコードを消すという順序を守ることと、定期的にレコードの向き先を棚卸しすることです。DNSのレコードは、リソースを消しても自動では消えません。


ドメインの失効・乗っ取り

登録者の更新忘れ、レジストラのアカウント乗っ取り、レジストリでの移管・NS変更、NSのドメインの失効という各段と、自動更新・MFA・レジストラロック・古い委任の整理といった対策を示す図
  • 更新忘れによる失効:失効したドメインは第三者が取得でき、Web・メールの受信・過去のリンクがすべて他人のものになる。自動更新、請求先と通知先の複数化、期限の台帳管理で防ぐ
  • NSに使っている他社ドメインの失効:ns1.old-provider.exampleのようなNSのドメインが失効すると、それを取得した者がゾーンの応答を自由に決められる。使っていない委任や古いNSを放置しない
  • 委任先のDNSサービスの解約:NSが契約の終わったDNSサービスを指したままだと、他人がそのサービスで同じゾーンを作れることがある。2024年にもこの手口の大規模な悪用が報告されている
  • レジストラのアカウントの乗っ取り:NSを書き換えられるとドメインごと奪われる。多要素認証(MFA)、担当者の限定、変更の通知を設定する
  • レジストラロック・レジストリロック:移管やNSの変更を止めるロック。重要なドメインは、変更に人手の確認を挟むレジストリロックも検討する

状態の確認は、WhoisやRDAPで有効期限とロックの状態(clientTransferProhibited等)を見ます(第2回)。どの段を奪われても、ドメインごと他人の管理下に入ります。


DNSの暗号化(DoT・DoH・DoQ)

方式規格通信特徴
DoT(DNS over TLS)RFC 7858(2016年)TLS、TCP 853専用のポートで区別しやすく、F/Wで制御しやすい
DoH(DNS over HTTPS)RFC 8484(2018年)HTTPS、TCP 443(HTTP/3 は UDP)Webの通信に紛れる。ブラウザーが実装を先導した
DoQ(DNS over QUIC)RFC 9250(2022年)QUIC、UDP 853接続が速く、再送の遅れの影響を受けにくい。対応は広がり中
DDR(指定リゾルバーの発見)RFC 9462(2023年)_dns.resolver.arpa の SVCB設定済みのDNSサーバーが暗号化に対応しているかを自動で見つける
端末とキャッシュDNSの間はDoT・DoH・DoQで暗号化して盗聴を防ぎ、キャッシュDNSと権威DNSの間は多くが平文のままで、DNSSECが権威DNSの出した中身の正しさを確かめることを対比した図

暗号化で守られるのは主に端末とキャッシュDNSの間で、キャッシュDNSと権威DNSの間は多くが平文のままです。また、暗号化は盗聴と途中での改ざんを防ぎますが、権威DNSが出した内容そのものの正しさは確かめません。それはDNSSECの役割です。

冒頭の「DNSSECは必要?」への答えがここにあります。暗号化は通り道を、DNSSECは中身を守る。片方では足りない、補い合う関係です。


OS・ブラウザーの対応と社内DNSの迂回

対象暗号化DNSへの対応企業での制御
Windows 11、Windows Server 2022 以降DNSクライアントがDoHに対応(既知のサーバー一覧に追加して使う)グループポリシー「Configure DNS over HTTPS (DoH) name resolution」
Windows Server 2025 の DNSサーバー2026年6月の更新(KB5094125)から、クライアントからのDoHを受け付けられる転送先への通信とゾーン転送は暗号化されない
macOS 11 以降構成プロファイルでDoH・DoT。macOS 13以降はDDRにも対応MDM(端末管理)でプロファイルを配布
Chrome・Edge「セキュアDNS」。OSのDNSサーバーがDoH対応なら自動で切り替えるポリシー DnsOverHttpsMode(off/automatic/secure)。管理下の端末では未設定だとDoHを使わない
Firefox米国・カナダ等では既定でDoHポリシー DNSOverHTTPS、canary domain
社内ネットワークのブラウザーが外部のDoHサーバーを443番で直接使うと、社内DNSのフィルターやログを素通りし、社内の名前が引けずスプリットホライズンも無効になることと、ポリシーとuse-application-dns.netで制御することを示す図

冒頭のもう1つの疑問です。ブラウザーが外部のDoHサーバーを直接使うと、社内DNSを迂回し、次のような問題が起きます。

  • 社内の名前が引けない
  • スプリットホライズンが効かない
  • フィルターやログが素通りになる

DoHはWebと同じ443番なので、ポートで止めにくく、端末の設定で制御します。ポリシーで明示的に設定し、Firefox向けにはuse-application-dns.netにNXDOMAINを返します(既定でDoHが有効な場合のみ効きます)。


保護的DNS・RPZ・DNSファイアウォール

最後に、DNSを「守りの道具」として使う方法です。DNSはほぼすべての通信の最初に使われるため、悪性ドメインへの接続をここで止めることができます。

端末がmalware.exampleを引くと、RPZを持つキャッシュDNSがNXDOMAINやブロックページのIPを返して接続を止め、問い合わせログが感染端末の発見に使えることと、DoHや外部への直接の53番・853番は素通りするため出口のF/Wで制限することを示す図
  • 保護的DNS:マルウェアの配布元、フィッシングサイト、遠隔操作の指令サーバーとして知られるドメインへの問い合わせに、NXDOMAINやブロックページのIPアドレスを返すキャッシュDNSのサービス
  • RPZ(応答ポリシーゾーン):自社のキャッシュDNSで同じことを行う仕組み。ブロックする名前と動作をゾーンとして書き、ゾーン転送で配る。BINDやUnbound等が対応
  • DNSファイアウォール:クラウドでの提供形態(Route 53 Resolver DNS Firewall、第10回)

名前を引く段階で止めるので、接続そのものが始まりません。問い合わせログは感染端末を見つける手掛かりにもなります。ただし、DoHや直接の通信は素通りするため、外部への53番・853番の通信の制限と組み合わせます。


考えてみよう

  1. 自社の検証するキャッシュDNSが、ルートKSKの更新に追従できているかを、どのコマンドで確かめますか。追従できていなかったら何が起きますか。
  2. 検証用のクラウド環境を削除することになりました。DNSの側で、削除の前後に何を確かめますか。
  3. 社内の端末で、ブラウザーのDoHが外部のサーバーを使っていることが分かりました。どんな問題が起き、どう制御しますか。

ヒント:この記事の「ルートKSKの更新」「サブドメインテイクオーバー」「社内DNSの迂回」が、それぞれの答えにつながります。


まとめ

  • 推測を難しくする対策は確率を下げるだけ。中身が本物かを確かめられるのはDNSSECだけ
  • DNSSECはルートのKSKから親→子へたどる。切れるとSERVFAIL
  • KSKの更新は新旧の鍵とDSを重ねる。ルートKSKは2026年10月11日にKSK-2024へ
  • キャッシュDNSは再帰を社内に限る。権威DNSはRRL
  • 消し忘れたCNAMEと更新忘れのドメインは、それだけで乗っ取りの入口になる
  • 暗号化は通り道、DNSSECは中身。ブラウザーのDoHはポリシーで制御

次回は、Route 53やAD統合DNS、Kubernetesなど、クラウドと社内環境でのDNSの使い方を扱います。


連載「DNS入門」全12回

  1. DNSとは?名前解決の全体像と3つの登場人物
  2. ドメイン名の階層と委任
  3. 名前解決の流れ
  4. DNSメッセージとトランスポート
  5. リソースレコード 前編
  6. リソースレコード 後編
  7. 権威DNSサーバーの運用
  8. コマンドで調べる
  9. DNSのセキュリティ(この記事)
  10. クラウド・社内環境のDNS
  11. DNSトラブルシュート
  12. DNS設計演習

コメント

タイトルとURLをコピーしました