用語辞典・DNS・ドメイン

DNSSEC

DNSSECとは

DNSSECは、DNSのレコード集合へデジタル署名を付け、応答の出所と改ざんされていないことを検証できるようにするDNSの拡張機能です。正式名称はDomain Name System Security Extensions(ドメイン・ネーム・システム・セキュリティー・エクステンションズ)です。

権威DNS側が秘密鍵でRRsetへ署名し、検証する再帰DNSサーバーなどが公開鍵と親からの委任情報を使って確かめます。署名は一件の応答パケットではなく、同じ名前・種類・クラスのRRsetを覆います。

DNSSECが提供するのはDNSデータの真正性と完全性です。問い合わせや応答を暗号化して、名前を秘密にする仕組みではありません。

信頼済みの起点からDSとDNSKEYをたどり、RRsetの署名を検証する署名済み有効、意図的な未署名、検証失敗を別の状態として扱う
ルートの信頼起点から親のDS、子のDNSKEY、RRsetのRRSIGをたどって検証し、有効、未署名、署名不正の結果を分ける図解
図1署名のないゾーンを必ず攻撃とみなすわけではありません。親の委任が「子は未署名」と正しく示すinsecureと、署名すべきデータを検証できないbogusを区別します。

四種類のレコードが、署名と信頼の連鎖を作る

鍵、親との接続、署名、不存在証明を分担する一種類の「DNSSECレコード」が全部を行うわけではない
DNSKEYゾーンの公開鍵

RRSIGを検証する公開鍵をゾーン頂点で公開する

DS子の鍵への要約

親ゾーンに置き、子DNSKEYへ信頼をつなぐ

RRSIGRRsetの署名

署名対象種類、期限、署名値などを持つ

NSEC / NSEC3不存在の証明

名前または種類がないことを署名付きで示す

図2検証側には、あらかじめ信頼する公開鍵または鍵の要約であるtrust anchor(トラスト・アンカー)が必要です。一般的な検証リゾルバーはルートの信頼起点から下へたどります。

署名する側と、検証する側は別の作業をする

ゾーン運用者は鍵を生成・保護し、RRsetへ署名し、有効期限前に署名を更新します。親ゾーンへDSを登録して初めて、通常のルートから子ゾーンまで信頼の連鎖がつながります。子で署名しても親DSがなければ、一般の検証リゾルバーはその鍵を信頼済みの起点へ結べません。

検証リゾルバーは応答と必要なDNSSECレコードを集め、署名時刻、アルゴリズム、鍵、DSとの一致を確認します。端末側は検証済み再帰DNSを信頼する構成が多く、ADビットが検証成功の手掛かりになりますが、端末とリゾルバー間の信頼も別に必要です。

不存在にも、改ざんされていない証明が必要

存在するRRsetにはRRSIGを付けられますが、「その名前は存在しない」という空白そのものへ直接署名はできません。NSECは、並べた名前の間に他の名前がないことと、既存名にどの種類があるかを示して署名します。

NSEC3は名前をハッシュした順序を使い、ゾーン内の名前を容易に列挙されにくくします。ただし完全な機密化ではなく、パラメーターや名前の推測可能性に応じた情報露出は残ります。

secure・insecure・bogusを混同しない

secure(セキュア)は信頼の連鎖と署名を検証できた状態、insecure(インセキュア)は親から正しく未署名として委任された状態です。bogus(ボーガス)は署名期限切れ、DSと鍵の不一致、応答改変などで検証に失敗した状態です。

bogusを通常の答えとして使うと保護の意味がなくなるため、検証リゾルバーは多くの場合SERVFAILを返します。DNS設定変更で鍵やDSの切り替え順を誤ると、データ自体は存在していても利用者から名前解決できなくなります。

暗号化、アクセス制御、DoS防御は提供しない

DNSSEC応答は公開され、第三者も内容を読めます。通信経路上から問い合わせ名を隠すにはDoTやDoHなど、DNS通信を暗号化する別の仕組みが必要です。DNSSECと暗号化DNSは併用できますが、目的が違います。

DNSSECは誰が問い合わせられるかを制限せず、サービス妨害攻撃を防ぐ機能でもありません。また、署名済みの誤ったレコードは「ゾーン管理者が提供したデータ」として検証に成功するため、設定内容そのものの正しさは運用側で確認します。

仕様の確認資料:RFC 4033「DNS Security Introduction and Requirements」RFC 4034「Resource Records for DNSSEC」RFC 4035「Protocol Modifications for DNSSEC」

関連用語