GCP Cloud DNS DNSSECの署名アルゴリズムの設定について

このブログシリーズ 「クラウドセキュリティ 実践集」 では、一般的なセキュリティ課題を取り上げ、「なぜ危険なのか?」 というリスクの解説から、「どうやって直すのか?」 という具体的な修復手順(コンソール、gcloud CLI、Terraformなど)まで、分かりやすく解説します。
この記事では、Google Cloud DNSのDNSSECで使用される署名アルゴリズムを、脆弱性が指摘されているRSASHA1から安全なRSASHA256へ移行する方法について、ダウンタイムを最小限に抑える実践的な手順を解説します。

DNSSECと署名アルゴリズムの概要
DNSSEC(Domain Name System Security Extensions)は、DNSの応答に電子署名を追加することで、DNS応答の完全性と真正性を保証するセキュリティ拡張機能です。この署名には暗号化アルゴリズムが使用されますが、技術の進歩により、古いアルゴリズムの脆弱性が発見されることがあります。
ポリシーの説明
Cloud DNSゾーンでDNSSECの署名に非推奨のRSASHA1アルゴリズム(アルゴリズム番号5)が使用されている状態を検出します。RSASHA1は2017年に実証されたSHA-1の衝突攻撃により暗号学的に脆弱であることが証明されており、RFC 8624でNOT RECOMMENDEDに分類されています。Google Public DNSを含む主要なDNSリゾルバーは、2025年までにRSASHA1のサポートを終了する予定です。
修復方法
作業にあたってはレジストラ側での操作が必要となります。
重要な注意事項
⚠️ 警告: 署名アルゴリズムの変更には、DNSSECの一時的な無効化が必要です。この期間中(通常24-48時間)、DNSSECによる保護が無効になります。以下の手順を正確に実行し、各ステップでの確認を怠らないようにしてください。
ステップ1: 現在の設定の確認
- Google Cloud コンソールにログインし、対象のプロジェクトを選択します。
- ナビゲーションメニューから「ネットワーク サービス」→「Cloud DNS」を選択します。
- 対象のDNSゾーンをクリックします。
- 「DNSSEC」タブで現在の設定を確認し、記録しておきます。
ステップ2: DNSSECの無効化
- 「DNSSEC」タブで「無効にする」ボタンをクリックします。
- 確認ダイアログで「無効にする」をクリックします。
- 親ゾーンのDSレコードを削除します:
- ドメインレジストラの管理画面にログイン
- DNS設定からDSレコードを削除
- 削除が反映されるまで待機(通常24-48時間)
ステップ3: DSレコード削除の確認
- Cloud Shellを開きます。
- 以下のコマンドでDSレコードが削除されたことを確認:
dig DS your-domain.com @8.8.8.8
- DSレコードが表示されないことを確認します。
ステップ4: 新しいアルゴリズムでDNSSECを再有効化
- Cloud DNSの「DNSSEC」タブに戻ります。
- 「有効にする」ボタンをクリックします。

- 「詳細設定」をクリックし、以下を設定:
- KSKアルゴリズム: RSASHA256
- KSKキー長: 2048
- ZSKアルゴリズム: RSASHA256
- ZSKキー長: 1024
- 「有効にする」をクリックして設定を保存します。
ステップ5: 新しいDSレコードの登録
- 新しいDSレコードの情報を取得:
- 「DNSSEC」タブで「DSレコード」をクリック
- 表示されたDSレコード情報をコピー
- ドメインレジストラで新しいDSレコードを登録:
- レジストラの管理画面でDNS設定を開く
- 新しいDSレコードを追加
- 変更を保存
ステップ6: 移行の検証
- DNSSECの検証:
# DNSSECチェーンの検証 dig +dnssec your-domain.com @8.8.8.8 # DNSKEY レコードの確認 dig DNSKEY your-domain.com @8.8.8.8
- オンライン検証ツールの使用:
Terraformでの修復手順
Cloud DNSゾーンの署名アルゴリズムを安全なものに更新するTerraformコードと、主要な修正ポイントを説明します。
# 既存のDNSゾーン(DNSSEC無効状態)
resource "google_dns_managed_zone" "secure_zone" {
name = "secure-zone"
dns_name = "${var.domain_name}."
description = "Secure DNS zone with updated DNSSEC"
project = var.project_id
# 一時的にDNSSECを無効化
dnssec_config {
state = "off"
}
# ゾーン転送の無効化(セキュリティ強化)
private_visibility_config {
networks {
network_url = google_compute_network.vpc.id
}
}
}
# DNSSECを新しいアルゴリズムで有効化(別リソースとして管理)
resource "google_dns_managed_zone" "secure_zone_dnssec" {
name = google_dns_managed_zone.secure_zone.name
dns_name = google_dns_managed_zone.secure_zone.dns_name
description = google_dns_managed_zone.secure_zone.description
project = google_dns_managed_zone.secure_zone.project
dnssec_config {
state = "on"
# 推奨される安全なアルゴリズム設定
default_key_specs {
algorithm = "rsasha256" # 安全なアルゴリズム
key_length = 2048 # KSK用
key_type = "keySigning"
kind = "dnsKeySpec"
}
default_key_specs {
algorithm = "rsasha256" # 安全なアルゴリズム
key_length = 1024 # ZSK用
key_type = "zoneSigning"
kind = "dnsKeySpec"
}
}
# 既存のゾーンを更新する際に使用
lifecycle {
create_before_destroy = true
}
# DSレコード削除待機のための依存関係
depends_on = [
null_resource.wait_for_ds_removal
]
}
# DSレコード削除待機用のリソース
resource "null_resource" "wait_for_ds_removal" {
provisioner "local-exec" {
command = <<-EOT
echo "Waiting for DS record removal from parent zone..."
echo "Please ensure DS records are removed from your domain registrar"
echo "This typically takes 24-48 hours to propagate"
# 実際の環境では、ここで適切な待機処理を実装
EOT
}
}
# DNSレコードの例(A レコード)
resource "google_dns_record_set" "example" {
name = google_dns_managed_zone.secure_zone_dnssec.dns_name
managed_zone = google_dns_managed_zone.secure_zone_dnssec.name
type = "A"
ttl = 300
rrdatas = [var.web_server_ip]
project = var.project_id
}
# 監視アラート:DNSSECの状態監視
resource "google_monitoring_alert_policy" "dnssec_status" {
display_name = "DNSSEC Status Alert"
combiner = "OR"
conditions {
display_name = "DNSSEC is disabled or using weak algorithm"
condition_monitoring_query_language {
query = <<-EOT
fetch dns.googleapis.com/ManagedZone
| metric 'dns.googleapis.com/zone/dnssec/key_signing_algorithm'
| filter resource.zone_name == '${google_dns_managed_zone.secure_zone_dnssec.name}'
| group_by 1m
| every 1m
| condition val() == 'RSASHA1'
EOT
duration = "60s"
}
}
notification_channels = [var.notification_channel_id]
documentation {
content = <<-EOT
DNSSECが無効化されているか、弱いアルゴリズム(RSASHA1)が使用されています。
対応手順:
1. Cloud DNSコンソールでゾーンの設定を確認
2. DNSSECのアルゴリズムをRSASHA256に更新
3. DSレコードを親ゾーンで更新
EOT
mime_type = "text/markdown"
}
}
# 自動化スクリプト用の出力
output "ds_records" {
value = google_dns_managed_zone.secure_zone_dnssec.dnssec_config[0].default_key_specs
description = "DS records to be added to the parent zone"
}
output "migration_instructions" {
value = <<-EOT
DNSSECアルゴリズム移行手順:
1. 現在のDSレコードをレジストラから削除
2. 24-48時間待機(DNS伝播のため)
3. Terraformを適用して新しいアルゴリズムでDNSSECを有効化
4. 新しいDSレコードをレジストラに登録
重要: この作業中、一時的にDNSSECによる保護が無効になります。
EOT
}
まとめ
この記事では、Google Cloud DNSのDNSSEC署名アルゴリズムをRSASHA1からRSASHA256へ移行する方法について、実践的な手順と注意点を解説しました。
移行の重要ポイント
- 計画的な実施: DSレコードの削除から新規登録まで24-48時間の移行期間を確保
- 段階的な検証: 各ステップでの確認を怠らず、問題を早期に発見
- 監視の継続: 移行後も定期的なDNSSEC検証を実施
- ロールバック準備: 問題発生時の対応手順を事前に準備
移行によるメリット
- SHA-1の脆弱性から保護
- 主要DNSリゾルバーでの継続的なサポート
- セキュリティ標準への準拠
- 将来的な互換性の確保
RSASHA1のサポート終了が迫る中、早期の移行が推奨されます。この記事の手順に従うことで、安全かつ確実にアルゴリズム移行を完了できます。
この問題の検出は弊社が提供するSecurifyのCSPM機能で簡単に検出及び管理する事が可能です。 運用が非常に楽に出来る製品になっていますので、ぜひ興味がある方はお問い合わせお待ちしております。 最後までお読みいただきありがとうございました。この記事が皆さんの役に立てば幸いです。