インターネットを使っていて、「偽のサイトに誘導されないか心配…」「DNSが改ざんされたら怖い」「DNSSECって何?」と不安に思ったことはありませんか?
「暗号化って難しそう」「公開鍵って何のこと?」「自分のサイトに必要なの?」と感じている方も多いはずです。
実は、DNSKEY(DNS Public Key)は、DNSの応答が本物であることを証明するための「電子署名の鍵」のようなもので、なりすましや改ざんからインターネットを守る重要な技術なんです。まるで、重要な書類に押す「実印」のように、DNSの応答が本物であることを証明してくれるんですよ。
この記事では、DNSKEYの基本から仕組み、設定方法、実践的な運用まで、初心者の方にも分かりやすく丁寧に解説していきます。
図解や具体例をたくさん使いながら、DNS秘密保護の最前線をマスターしていきましょう!
DNSKEYとは?その基本を知ろう

基本的な説明
DNSKEY(ディーエヌエス・キー)は、DNSSEC(DNS Security Extensions)で使用される公開鍵を格納するDNSレコードタイプです。
正式名称:
DNS Public Key Resource Record
読み方:
- DNSKEY:ディーエヌエス・キー
- DNS Public Key:ディーエヌエス・パブリック・キー
役割:
DNSの応答が改ざんされていないことを検証するための公開鍵を配布します。
身近な例で理解しよう
実印と印鑑証明:
紙の契約書:
契約書
↓
実印を押す
↓
印鑑証明で本物か確認
↓
なりすましを防ぐ
DNS応答:
DNS応答(example.comのIPアドレス)
↓
秘密鍵で電子署名(RRSIG)
↓
公開鍵で検証(DNSKEY)
↓
改ざんされていないことを確認
DNSKEYは、「印鑑証明」のような役割を果たすんです。
宅配便の配達:
偽の配達員(DNSなりすまし):
- 本物の制服を着ている(見た目は本物)
- でも、身分証明書がない
DNSKEYがある場合:
- 配達員が身分証明書を見せる
- 会社に問い合わせて確認
- 本物だと分かる
DNSKEYは、「DNS応答の身分証明書」なんですね。
DNSSECとの関係
DNSSEC(DNS Security Extensions):
DNSに電子署名を追加して、セキュリティを強化する技術です。
DNSSECの主要コンポーネント:
DNSKEY:
公開鍵を格納(今回のテーマ)
RRSIG(Resource Record Signature):
DNSレコードの電子署名
DS(Delegation Signer):
子ゾーンの信頼の連鎖
NSEC/NSEC3:
存在しないドメインの証明
DNSKEYは、DNSSECの土台となる重要な要素です。
DNSKEYの種類
ZSK(Zone Signing Key)
ゾーン署名鍵:
実際のDNSレコードに署名するための鍵です。
役割:
- 各DNSレコード(A、AAAA、MXなど)に署名
- 頻繁にローテーション(定期的に交換)
- 比較的短い鍵長(1024〜2048ビット)
例:
example.com. A 192.0.2.1
↓
ZSKで署名
↓
RRSIG(電子署名)が生成される
KSK(Key Signing Key)
鍵署名鍵:
ZSKに署名するための上位の鍵です。
役割:
- ZSKに署名(鍵の鍵)
- 長期間使用(年単位)
- 長い鍵長(2048〜4096ビット)
- DSレコード生成に使用
例:
ZSK(ゾーン署名鍵)
↓
KSKで署名
↓
DSレコード(親ゾーンに登録)
なぜ2種類の鍵があるのか
セキュリティと運用性のバランス:
1つの鍵だけの場合:
問題点:
- 鍵を交換する時、親ゾーンも更新が必要
- 頻繁な更新は手間とリスクが大きい
2つの鍵を使う場合:
メリット:
- ZSKは頻繁にローテーション(月次など)
- KSKは長期間使用(年単位)
- 親ゾーンの更新は少なくて済む
階層構造:
┌──────────────────┐
│ KSK(上位) │ ← 長期間使用、親ゾーンと連携
└────────┬─────────┘
↓ 署名
┌──────────────────┐
│ ZSK(下位) │ ← 頻繁にローテーション
└────────┬─────────┘
↓ 署名
┌──────────────────┐
│ DNSレコード │
└──────────────────┘
DNSKEYレコードの構造
レコードフォーマット
DNSKEYレコードの形式:
example.com. 3600 IN DNSKEY <Flags> <Protocol> <Algorithm> <Public Key>
各フィールドの説明:
Flags(フラグ):
- 256:ZSK(Zone Signing Key)
- 257:KSK(Key Signing Key)
Protocol(プロトコル):
- 常に 3(固定値)
Algorithm(アルゴリズム):
暗号化アルゴリズムの識別番号
主なアルゴリズム:
- 5:RSA/SHA-1
- 7:RSASHA1-NSEC3-SHA1
- 8:RSA/SHA-256
- 10:RSA/SHA-512
- 13:ECDSA Curve P-256 with SHA-256
- 14:ECDSA Curve P-384 with SHA-384
- 15:Ed25519
- 16:Ed448
Public Key(公開鍵):
Base64エンコードされた公開鍵本体
実際のDNSKEYレコード例
ZSKの例:
example.com. 3600 IN DNSKEY 256 3 8 (
AwEAAb2H0...(省略)...9xQKnL
)
解説:
256:ZSK3:プロトコル(固定)8:RSA/SHA-256AwEAAb2H0...:公開鍵(Base64)
KSKの例:
example.com. 3600 IN DNSKEY 257 3 8 (
AwEAAcX7...(省略)...mQ9kRp
)
解説:
257:KSK- 他はZSKと同じ形式
Key Tag(鍵タグ)
鍵の識別子:
DNSKEYから計算される短い数値で、鍵を識別するために使います。
計算方法:
公開鍵データからCRC-16のような計算で算出されます。
例:
Key Tag: 12345
用途:
- RRSIGレコードで、どの鍵で署名したか識別
- DSレコードで参照
DNSSECの仕組み:DNSKEYがどう使われるか

署名と検証の流れ
1. ゾーン管理者が署名:
┌─────────────────────────────────┐
│ ゾーン管理者(example.com) │
│ │
│ 1. DNSレコードを作成 │
│ example.com A 192.0.2.1 │
│ │
│ 2. 秘密鍵(ZSK)で署名 │
│ ↓ │
│ 3. RRSIGレコード生成 │
│ │
│ 4. 公開鍵(DNSKEY)を公開 │
└─────────────────────────────────┘
2. DNSリゾルバが検証:
┌─────────────────────────────────┐
│ DNSリゾルバ(検証する側) │
│ │
│ 1. DNS応答を受信 │
│ example.com A 192.0.2.1 │
│ RRSIG(署名) │
│ │
│ 2. DNSKEYを取得 │
│ │
│ 3. 公開鍵で署名を検証 │
│ ↓ │
│ 4. 改ざんされていないか確認 │
│ │
│ 5. OKなら、クライアントに返答 │
└─────────────────────────────────┘
信頼の連鎖(Chain of Trust)
ルートから自分のドメインまでの信頼:
┌────────────────────┐
│ . (ルート) │ ← DNSSEC Trust Anchor
└─────────┬──────────┘
↓ DS + DNSKEY
┌────────────────────┐
│ .com (TLD) │
└─────────┬──────────┘
↓ DS + DNSKEY
┌────────────────────┐
│ example.com │
└────────────────────┘
各レベルでの検証:
ルート:
- ルートのDNSKEYを信頼(Trust Anchor)
- これが出発点
.com(TLD):
- ルートが.comのDSレコードに署名
- DSレコードと.comのDNSKEYを照合
- .comが信頼できることを確認
example.com:
- .comがexample.comのDSレコードに署名
- DSレコードとexample.comのDNSKEYを照合
- example.comが信頼できることを確認
すべてのレベルで検証が成功すれば、完全に信頼できます。
DNSKEYの生成と設定方法
前提条件
必要なもの:
- 自分のDNSサーバー(BIND、PowerDNS、Knotなど)
- DNSSECに対応したレジストラ(.com、.jpなど)
注意:
共有ホスティングでは、通常設定できません。専用サーバーまたはVPSが必要です。
BIND9での設定例
ステップ1:鍵の生成
ZSKの生成:
dnssec-keygen -a RSASHA256 -b 2048 -n ZONE example.com
出力:
Kexample.com.+008+12345
ファイルが2つ生成:
Kexample.com.+008+12345.key(公開鍵)Kexample.com.+008+12345.private(秘密鍵)
KSKの生成:
dnssec-keygen -a RSASHA256 -b 4096 -f KSK -n ZONE example.com
出力:
Kexample.com.+008+54321
ステップ2:ゾーンファイルへの鍵の追加
ゾーンファイル(example.com.zone):
$INCLUDE Kexample.com.+008+12345.key ; ZSK
$INCLUDE Kexample.com.+008+54321.key ; KSK
ステップ3:ゾーンへの署名
dnssec-signzone -o example.com -k Kexample.com.+008+54321 example.com.zone Kexample.com.+008+12345
出力:
example.com.zone.signed(署名済みゾーンファイル)dsset-example.com.(DSレコード)
ステップ4:named.confの設定
zone "example.com" {
type master;
file "/etc/bind/example.com.zone.signed";
allow-transfer { trusted-servers; };
};
ステップ5:BINDの再起動
sudo systemctl restart bind9
ステップ6:DSレコードを親ゾーンに登録
dsset-example.com. の内容:
example.com. IN DS 54321 8 2 A1B2C3...
このDSレコードを、レジストラ(.comの管理者)に登録します。
自動署名の設定(BIND9)
手動署名は大変なので、自動化します:
named.confに追加:
options {
dnssec-enable yes;
dnssec-validation auto;
};
zone "example.com" {
type master;
file "/etc/bind/example.com.zone";
auto-dnssec maintain;
inline-signing yes;
key-directory "/etc/bind/keys";
};
鍵を指定のディレクトリに配置:
sudo mkdir -p /etc/bind/keys
sudo mv Kexample.com.* /etc/bind/keys/
BINDが自動的に署名・再署名してくれます。
DNSKEYの検証方法
digコマンドで確認
DNSKEYレコードの取得:
dig @8.8.8.8 example.com DNSKEY +dnssec
出力例:
;; ANSWER SECTION:
example.com. 3600 IN DNSKEY 256 3 8 AwEAAb2H0...
example.com. 3600 IN DNSKEY 257 3 8 AwEAAcX7...
example.com. 3600 IN RRSIG DNSKEY 8 2 3600 20231215000000 20231115000000 54321 example.com. A1B2C3...
解説:
- 2つのDNSKEY(ZSKとKSK)
- RRSIGでDNSKEY自体が署名されている
DNSSEC検証ツール
Verisign DNSSEC Analyzer:
使い方:
- ドメイン名を入力(例:example.com)
- 「Analyze」をクリック
- 結果を確認
正常な場合:
✓ All checks passed
問題がある場合:
✗ DNSKEY not found
✗ RRSIG validation failed
具体的なエラーが表示されます。
delv(Domain Entity Lookup & Validation)
BIND付属のDNSSEC検証ツール:
delv @8.8.8.8 example.com A +rtrace
出力:
; fully validated
example.com. 300 IN A 192.0.2.1
fully validatedが表示されれば成功です。
DNSViz
視覚的なDNSSEC検証ツール:
使い方:
- ドメイン名を入力
- 信頼の連鎖が図で表示される
- エラーがあれば赤で表示
非常に分かりやすいです!
DNSKEYのローテーション(鍵の交換)
なぜローテーションが必要?
セキュリティのため:
鍵を長期間使い続けると、解読されるリスクが高まります。
推奨ローテーション期間:
- ZSK:1〜3ヶ月ごと
- KSK:1〜2年ごと
ZSKローテーションの手順
Pre-Publishメソッド(推奨):
ステップ1:新しいZSKを生成
dnssec-keygen -a RSASHA256 -b 2048 -n ZONE example.com
ステップ2:新しいDNSKEYを公開(署名はまだしない)
ゾーンファイルに新しいDNSKEYを追加します。
待機:TTLの2倍以上
全てのキャッシュが更新されるまで待ちます。
ステップ3:新しいZSKで署名開始
古いZSKと新しいZSKの両方で署名します。
ステップ4:古いZSKでの署名を停止
新しいZSKのみで署名します。
ステップ5:古いDNSKEYを削除
ゾーンファイルから古いDNSKEYを削除します。
KSKローテーションの手順
KSKは親ゾーンとの連携が必要:
ステップ1:新しいKSKを生成
ステップ2:新しいDNSKEYを公開
ステップ3:新しいDSレコードを親ゾーンに追加
レジストラに連絡して、新しいDSレコードを追加してもらいます。
ステップ4:待機(最低24時間)
親ゾーンのTTLを考慮します。
ステップ5:古いDSレコードを削除
ステップ6:古いKSKを削除
KSKローテーションは、慎重に行う必要があります。
実践例:主要なDNSSECサービス
Cloudflare
Cloudflareでは、DNSSECが簡単に有効化できます:
手順:
1. Cloudflareダッシュボードにログイン
2. ドメインを選択
3. 「DNS」タブを開く
4. 「DNSSEC」セクションで「Enable DNSSEC」をクリック
5. DSレコードが表示される
DS Record:
example.com. IN DS 12345 13 2 A1B2C3D4...
6. このDSレコードをレジストラに登録
Cloudflareが自動的にDNSKEYを管理してくれます。
Google Cloud DNS
Google Cloudでも簡単設定:
gcloudコマンド:
gcloud dns managed-zones update example-com-zone \
--dnssec-state on
DSレコード取得:
gcloud dns managed-zones describe example-com-zone
出力に含まれるDSレコードをレジストラに登録します。
Route 53(AWS)
AWSでのDNSSEC設定:
手順:
1. Route 53コンソールを開く
2. ホストゾーンを選択
3. 「DNSSEC signing」タブ
4. 「Enable DNSSEC signing」
5. KSKが自動生成される
6. DSレコードをレジストラに登録
注意:
Route 53では、親ゾーンもRoute 53で管理する必要があります。
トラブルシューティング
問題1:DNSSEC検証が失敗する
症状:SERVFAILエラーが返される。
原因:
- 署名が無効
- 鍵が見つからない
- 信頼の連鎖が切れている
解決策:
検証ツールで確認:
dig @8.8.8.8 example.com A +dnssec
delv @8.8.8.8 example.com A
エラーメッセージを確認して、原因を特定します。
問題2:DSレコードが親ゾーンにない
症状:
DNSVizで「Broken chain of trust」
原因:
レジストラにDSレコードを登録していない。
解決策:
DSレコードを取得:
dnssec-dsfromkey Kexample.com.+008+54321.key
レジストラの管理画面で登録します。
問題3:署名の有効期限切れ
症状:
DNSSECエラーが突然発生。
原因:
RRSIGの有効期限が切れた。
解決策:
再署名:
dnssec-signzone -o example.com -k Kexample.com.+008+54321 example.com.zone Kexample.com.+008+12345
または、自動署名を有効化:
auto-dnssec maintain;
問題4:鍵のローテーション中にエラー
症状:
ローテーション後、検証が失敗。
原因:
待機時間が不十分だった。
解決策:
ロールバック:
古い鍵を再度有効化します。
再度ローテーション:
今度は十分な待機時間を確保します(TTLの2倍以上)。
問題5:パフォーマンスの低下
症状:
DNSSEC有効化後、DNSの応答が遅い。
原因:
署名の検証に時間がかかる。
解決策:
DNSサーバーのスペックアップ:
CPU/メモリを増強します。
キャッシュDNSサーバーの活用:
検証済みの結果をキャッシュします。
アルゴリズムの見直し:
ECDSA(アルゴリズム13)など、軽量なアルゴリズムを使用します。
DNSKEYのメリットとデメリット
メリット
1. DNSキャッシュポイズニング攻撃の防止
偽のDNS応答を注入される攻撃を防ぎます。
2. なりすまし防止
正規のDNS応答であることを保証します。
3. 中間者攻撃の防止
通信経路での改ざんを検出できます。
4. ドメインハイジャックの防止
不正なDNS設定変更を検出できます。
5. 信頼性の向上
ユーザーに安心感を与えます。
6. フィッシング対策
偽サイトへの誘導を防ぎます。
デメリット
1. 設定の複雑さ
DNSSECの設定は、通常のDNSより複雑です。
2. 運用の手間
鍵のローテーションなど、定期的な作業が必要です。
3. パフォーマンスへの影響
署名と検証で、わずかに遅くなります(通常は数ミリ秒)。
4. レスポンスサイズの増加
DNSKEYやRRSIGで、パケットサイズが大きくなります。
5. 設定ミスのリスク
設定を間違えると、ドメイン全体が解決不能になることがあります。
6. 普及率の問題
すべてのリゾルバがDNSSEC検証に対応しているわけではありません。
セキュリティのベストプラクティス
推奨事項
1. 強力な暗号化アルゴリズムを使用
- 推奨:ECDSA(アルゴリズム13または14)、Ed25519(15)
- 避ける:RSA/SHA-1(アルゴリズム5)
2. 適切な鍵長
- ZSK:2048ビット(RSA)、256ビット(ECDSA)
- KSK:2048〜4096ビット(RSA)、256〜384ビット(ECDSA)
3. 定期的な鍵ローテーション
- ZSK:1〜3ヶ月
- KSK:1〜2年
4. 鍵の安全な保管
秘密鍵は、厳重に管理します。
5. 監視とアラート
DNSSEC検証エラーを監視します。
6. バックアップ
鍵のバックアップを取り、安全な場所に保管します。
7. テスト環境での検証
本番環境に適用する前に、テストします。
よくある質問
Q1: すべてのドメインでDNSSECを有効にすべき?
A: 推奨されますが、必須ではありません。
有効にすべきドメイン:
- 金融機関
- 電子商取引サイト
- 政府機関
- セキュリティ重視のサービス
優先度が低い場合:
- 個人ブログ
- 情報発信のみのサイト
ただし、今後はすべてのドメインで標準になる可能性があります。
Q2: DNSSECを有効にすると、サイトが遅くなる?
A: ほとんど影響ありません。
パフォーマンスへの影響:
- DNS応答時間:数ミリ秒増加
- Webページの読み込み:ほぼ変わらず
体感できるレベルではありません。
Q3: 共有ホスティングでDNSSECは使える?
A: 通常は使えません。
DNSSECは、DNSサーバーの設定が必要です。
必要な環境:
- 専用サーバー
- VPS
- クラウドDNSサービス(Cloudflare、Route 53など)
Q4: DNSKEYはどこで確認できる?
A: digコマンドまたはオンラインツールで確認できます。
digコマンド:
dig example.com DNSKEY
オンラインツール:
- https://dnssec-debugger.verisignlabs.com/
- https://dnsviz.net/
Q5: DNSSECとHTTPS、どちらが重要?
A: 両方とも重要ですが、役割が違います。
DNSSEC:
- DNSレベルのセキュリティ
- 正しいIPアドレスへの誘導を保証
HTTPS:
- 通信内容の暗号化
- サーバー認証
両方を使うことで、総合的なセキュリティが実現します。
まとめ
DNSKEY(DNS Public Key)は、DNSSECで使用される公開鍵で、DNS応答が改ざんされていないことを検証するための重要な要素です。
この記事のポイント:
- DNSKEYはDNSSECの公開鍵レコード
- ZSK(ゾーン署名鍵)とKSK(鍵署名鍵)の2種類がある
- RRSIGレコードの検証に使用される
- 信頼の連鎖でルートから自分のドメインまで検証
- 定期的な鍵ローテーションが推奨される
- CloudflareやRoute 53で簡単に設定可能
- DNSキャッシュポイズニングやなりすまし攻撃を防ぐ
- 設定は複雑だが、セキュリティ向上のメリット大
- digやオンラインツールで検証可能
- HTTPSと組み合わせることで総合的なセキュリティを実現
DNSSECとDNSKEYは、インターネットのセキュリティを根本から強化する重要な技術です。設定は少し複雑ですが、Cloudflareなどのサービスを使えば、比較的簡単に導入できます。
特に、金融機関や電子商取引サイト、セキュリティが重要なサービスを運営している方は、DNSSECの導入を強く推奨します。ユーザーを偽サイトから守り、信頼性を高めることができますよ。
個人サイトや小規模なブログであっても、将来的にはDNSSECが標準になる可能性が高いので、今のうちに理解しておくと役立ちます。
DNSKEYとDNSSECをマスターして、より安全なインターネットを実現していきましょう!


コメント