DNSKEY(DNS Public Key)とは?DNSを改ざんから守る暗号鍵完全ガイド

Web

インターネットを使っていて、「偽のサイトに誘導されないか心配…」「DNSが改ざんされたら怖い」「DNSSECって何?」と不安に思ったことはありませんか?

「暗号化って難しそう」「公開鍵って何のこと?」「自分のサイトに必要なの?」と感じている方も多いはずです。

実は、DNSKEY(DNS Public Key)は、DNSの応答が本物であることを証明するための「電子署名の鍵」のようなもので、なりすましや改ざんからインターネットを守る重要な技術なんです。まるで、重要な書類に押す「実印」のように、DNSの応答が本物であることを証明してくれるんですよ。

この記事では、DNSKEYの基本から仕組み、設定方法、実践的な運用まで、初心者の方にも分かりやすく丁寧に解説していきます。

図解や具体例をたくさん使いながら、DNS秘密保護の最前線をマスターしていきましょう!


スポンサーリンク
  1. DNSKEYとは?その基本を知ろう
    1. 基本的な説明
    2. 身近な例で理解しよう
    3. DNSSECとの関係
  2. DNSKEYの種類
    1. ZSK(Zone Signing Key)
    2. KSK(Key Signing Key)
    3. なぜ2種類の鍵があるのか
  3. DNSKEYレコードの構造
    1. レコードフォーマット
    2. 実際のDNSKEYレコード例
    3. Key Tag(鍵タグ)
  4. DNSSECの仕組み:DNSKEYがどう使われるか
    1. 署名と検証の流れ
    2. 信頼の連鎖(Chain of Trust)
  5. DNSKEYの生成と設定方法
    1. 前提条件
    2. BIND9での設定例
    3. 自動署名の設定(BIND9)
  6. DNSKEYの検証方法
    1. digコマンドで確認
    2. DNSSEC検証ツール
    3. delv(Domain Entity Lookup & Validation)
    4. DNSViz
  7. DNSKEYのローテーション(鍵の交換)
    1. なぜローテーションが必要?
    2. ZSKローテーションの手順
    3. KSKローテーションの手順
  8. 実践例:主要なDNSSECサービス
    1. Cloudflare
    2. Google Cloud DNS
    3. Route 53(AWS)
  9. トラブルシューティング
    1. 問題1:DNSSEC検証が失敗する
    2. 問題2:DSレコードが親ゾーンにない
    3. 問題3:署名の有効期限切れ
    4. 問題4:鍵のローテーション中にエラー
    5. 問題5:パフォーマンスの低下
  10. DNSKEYのメリットとデメリット
    1. メリット
    2. デメリット
  11. セキュリティのベストプラクティス
    1. 推奨事項
  12. よくある質問
    1. Q1: すべてのドメインでDNSSECを有効にすべき?
    2. Q2: DNSSECを有効にすると、サイトが遅くなる?
    3. Q3: 共有ホスティングでDNSSECは使える?
    4. Q4: DNSKEYはどこで確認できる?
    5. Q5: DNSSECとHTTPS、どちらが重要?
  13. まとめ

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:ZSK
  • 3:プロトコル(固定)
  • 8:RSA/SHA-256
  • AwEAAb2H0...:公開鍵(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:

DNSSEC Debugger
The DNSSEC Debugger from VeriSign Labs is an on-line tool to assist with diagnosing problems with DNSSEC-signed names an...

使い方:

  1. ドメイン名を入力(例:example.com)
  2. 「Analyze」をクリック
  3. 結果を確認

正常な場合:

✓ 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検証ツール:

DNSViz | A DNS visualization tool

使い方:

  1. ドメイン名を入力
  2. 信頼の連鎖が図で表示される
  3. エラーがあれば赤で表示

非常に分かりやすいです!


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をマスターして、より安全なインターネットを実現していきましょう!

コメント

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