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: 現在の設定の確認

  1. Google Cloud コンソールにログインし、対象のプロジェクトを選択します。
  2. ナビゲーションメニューから「ネットワーク サービス」→「Cloud DNS」を選択します。
  3. 対象のDNSゾーンをクリックします。
  4. 「DNSSEC」タブで現在の設定を確認し、記録しておきます。

ステップ2: DNSSECの無効化

  1. 「DNSSEC」タブで「無効にする」ボタンをクリックします。
  2. 確認ダイアログで「無効にする」をクリックします。
  3. 親ゾーンのDSレコードを削除します:
    • ドメインレジストラの管理画面にログイン
    • DNS設定からDSレコードを削除
    • 削除が反映されるまで待機(通常24-48時間)

ステップ3: DSレコード削除の確認

  1. Cloud Shellを開きます。
  2. 以下のコマンドでDSレコードが削除されたことを確認:
    dig DS your-domain.com @8.8.8.8
    

     

  3. DSレコードが表示されないことを確認します。

ステップ4: 新しいアルゴリズムでDNSSECを再有効化

  1. Cloud DNSの「DNSSEC」タブに戻ります。
  2. 「有効にする」ボタンをクリックします。
  1. 「詳細設定」をクリックし、以下を設定:
    • KSKアルゴリズム: RSASHA256
    • KSKキー長: 2048
    • ZSKアルゴリズム: RSASHA256
    • ZSKキー長: 1024
  2. 「有効にする」をクリックして設定を保存します。

ステップ5: 新しいDSレコードの登録

  1. 新しいDSレコードの情報を取得:
    • 「DNSSEC」タブで「DSレコード」をクリック
    • 表示されたDSレコード情報をコピー
  2. ドメインレジストラで新しいDSレコードを登録:
    • レジストラの管理画面でDNS設定を開く
    • 新しいDSレコードを追加
    • 変更を保存

ステップ6: 移行の検証

  1. DNSSECの検証:
    # DNSSECチェーンの検証
    dig +dnssec your-domain.com @8.8.8.8
    
    # DNSKEY レコードの確認
    dig DNSKEY your-domain.com @8.8.8.8
    

     

  2. オンライン検証ツールの使用:

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へ移行する方法について、実践的な手順と注意点を解説しました。

移行の重要ポイント

  1. 計画的な実施: DSレコードの削除から新規登録まで24-48時間の移行期間を確保
  2. 段階的な検証: 各ステップでの確認を怠らず、問題を早期に発見
  3. 監視の継続: 移行後も定期的なDNSSEC検証を実施
  4. ロールバック準備: 問題発生時の対応手順を事前に準備

移行によるメリット

  • SHA-1の脆弱性から保護
  • 主要DNSリゾルバーでの継続的なサポート
  • セキュリティ標準への準拠
  • 将来的な互換性の確保

RSASHA1のサポート終了が迫る中、早期の移行が推奨されます。この記事の手順に従うことで、安全かつ確実にアルゴリズム移行を完了できます。

この問題の検出は弊社が提供するSecurifyのCSPM機能で簡単に検出及び管理する事が可能です。 運用が非常に楽に出来る製品になっていますので、ぜひ興味がある方はお問い合わせお待ちしております。 最後までお読みいただきありがとうございました。この記事が皆さんの役に立てば幸いです。

参考情報

Google Cloud 公式ドキュメント

検証・監視ツール

この記事をシェアする

クラウドセキュリティ対策実践集一覧へ戻る

貴社の利用状況に合わせた見積もりを作成します。

料金プランを詳しく見る