AWS Private CA ルート認証機関を適切に無効化する設定手順

このブログシリーズ 「クラウドセキュリティ 実践集」 では、一般的なセキュリティ課題を取り上げ、「なぜ危険なのか?」 というリスクの解説から、「どうやって直すのか?」 という具体的な修復手順(コンソール、AWS CLI、Terraformなど)まで、分かりやすく解説します。

この記事では、AWS Private CA ルート認証機関を適切に無効化する方法について、リスクと対策を解説します。

ポリシーの説明

AWS Private Certificate Authority (Private CA) は、プライベートな公開鍵基盤(PKI)を構築するためのマネージドサービスです。PKI階層では、ルート認証機関(Root CA)は信頼の起点となる最上位の証明書です。

PKI階層の基本構成

  1. ルートCA: 自己署名証明書を持つ最上位のCA
  2. 中間CA/下位CA: ルートCAによって署名されたCA
  3. エンドエンティティ証明書: サーバー、クライアント、デバイスなどの証明書

ルートCAは通常、下位CA(Subordinate CA/Issuing CA)の証明書に署名するためだけに使用され、日常的な証明書発行には使用しません。セキュリティのベストプラクティスとして、ルートCAは必要な時のみ有効化し、それ以外の時は無効化しておくことが推奨されます。

リスク

ルート認証機関を常時有効にしている場合、以下のリスクがあります:

  • 不正な証明書発行のリスク: ルートCAが侵害された場合、攻撃者が任意の証明書を発行でき、PKI全体の信頼性が損なわれる可能性があります。これにより、中間者攻撃やフィッシング攻撃が可能になります
  • 誤操作による重大な影響: ルートCAで誤った操作(証明書の失効、鍵の削除など)を行うと、PKI階層全体に影響を与え、すべての証明書の信頼性が失われる可能性があります
  • コンプライアンス違反: 多くのセキュリティ基準(WebTrust、ETSI、Common Criteriaなど)やコンプライアンス要件では、ルートCAの厳格な管理と最小限の使用が求められています
  • 監査追跡の複雑化: ルートCAが常時有効な場合、正当な使用と不正な使用の区別が困難になり、セキュリティ監査が複雑化します
  • 暗号化キーの露出リスク: ルートCAの秘密鍵が長期間アクティブな状態にあると、サイドチャネル攻撃、メモリダンプ、ソーシャルエンジニアリングなどの様々な攻撃ベクトルにさらされる時間が増加します

修復方法

コンソールでの修復手順

AWSのコンソールを使用して、AWS Private CA ルート認証機関を適切に無効化します。

  1. AWSマネジメントコンソールにログインし、AWS Private Certificate Authorityサービスに移動します
  2. 左側のナビゲーションペインから「プライベート認証機関」を選択します
  1. 無効化したいルートCAを特定します:
    • タイプが「Root」となっているCAを探します
    • ステータスが「Active」のものが対象です
  2. ルートCAの使用状況を確認
    • CAの詳細ページで「発行済み証明書」タブを確認します
    • 最近の証明書発行履歴を確認し、下位CAが適切に設定されているか確認します
  3. ルートCAを選択し、「アクション」メニューから「無効化」を選択します
  4. 無効化の確認画面で以下を確認します:
    • 下位CAが存在し、有効になっていること
    • 今後の証明書発行が下位CAで可能であること
    • 無効化による影響を理解していること
  1. 確認メッセージを入力し、「無効化」をクリックします
    • 確認メッセージには「disable」と入力します
  2. 無効化後の確認
    • ステータスが「Disabled」に変更されたことを確認します
    • 下位CAが正常に動作していることを確認します
    • CloudTrailで無効化操作が記録されていることを確認します

Terraformでの修復手順

AWS Private CA ルート認証機関を適切に管理するTerraformコードと、主要な修正ポイントを説明します。

注意: Private CAのenabled属性はTerraformで直接管理できません。以下のコードは、ルートCAの作成時に適切な設定を行い、運用中の管理を容易にするアプローチを示しています。

# ルートCAの作成(初期設定時のみ有効)
resource "aws_acmpca_certificate_authority" "root_ca" {
  type = "ROOT"

  certificate_authority_configuration {
    key_algorithm     = "RSA_4096"
    signing_algorithm = "SHA512WITHRSA"

    subject {
      common_name         = "Example Corp Root CA"
      organization        = "Example Corporation"
      organizational_unit = "Security"
      country             = "US"
      state               = "Washington"
      locality            = "Seattle"
    }
  }

  # ルートCAの有効期間(長期間)
  permanent_deletion_time_in_days = 30

  # 注意: enabled属性はTerraformで直接管理できません
  # AWS CLIまたはコンソールで管理する必要があります

  tags = {
    Name        = "root-ca"
    Type        = "root"
    Environment = "production"
    Purpose     = "pki-hierarchy"
  }
}

# 下位CA(Subordinate CA)の作成
resource "aws_acmpca_certificate_authority" "subordinate_ca" {
  type = "SUBORDINATE"

  certificate_authority_configuration {
    key_algorithm     = "RSA_2048"
    signing_algorithm = "SHA384WITHRSA"

    subject {
      common_name         = "Example Corp Issuing CA"
      organization        = "Example Corporation"
      organizational_unit = "Security"
      country             = "US"
      state               = "Washington"
      locality            = "Seattle"
    }
  }

  # 下位CAは通常、常に有効化されています

  tags = {
    Name        = "subordinate-ca"
    Type        = "subordinate"
    Environment = "production"
    Purpose     = "certificate-issuance"
  }
}

# ルートCAのステータスを管理するためのNullリソース
# AWS CLIを使用してステータスを変更
resource "null_resource" "manage_root_ca_status" {
  triggers = {
    enable_root_ca = var.enable_root_ca
  }

  # ルートCAを有効化/無効化
  provisioner "local-exec" {
    command = var.enable_root_ca ? "aws acm-pca update-certificate-authority --certificate-authority-arn ${aws_acmpca_certificate_authority.root_ca.arn} --status ACTIVE" : "aws acm-pca update-certificate-authority --certificate-authority-arn ${aws_acmpca_certificate_authority.root_ca.arn} --status DISABLED"
  }
}

# 変数定義
variable "enable_root_ca" {
  description = "Flag to temporarily enable root CA"
  type        = bool
  default     = false  # デフォルトは無効
}

# ルートCA証明書の作成(初期設定時のみ)
resource "aws_acmpca_certificate" "root_certificate" {
  certificate_authority_arn   = aws_acmpca_certificate_authority.root_ca.arn
  certificate_signing_request = aws_acmpca_certificate_authority.root_ca.certificate_signing_request
  signing_algorithm           = "SHA512WITHRSA"

  template_arn = "arn:aws:acm-pca:::template/RootCACertificate/V1"

  validity {
    type  = "YEARS"
    value = 10  # ルートCAは長期間有効
  }
}

# 下位CA証明書の作成
resource "aws_acmpca_certificate" "subordinate_certificate" {
  certificate_authority_arn   = aws_acmpca_certificate_authority.root_ca.arn
  certificate_signing_request = aws_acmpca_certificate_authority.subordinate_ca.certificate_signing_request
  signing_algorithm           = "SHA384WITHRSA"

  template_arn = "arn:aws:acm-pca:::template/SubordinateCACertificate_PathLen0/V1"

  validity {
    type  = "YEARS"
    value = 5  # 下位CAは中期間有効
  }
}

# CloudWatch アラーム(ルートCAの使用を監視)
resource "aws_cloudwatch_metric_alarm" "root_ca_usage" {
  alarm_name          = "root-ca-unexpected-usage"
  comparison_operator = "GreaterThanThreshold"
  evaluation_periods  = "1"
  metric_name         = "CertificateIssued"
  namespace           = "AWS/ACM-PCA"
  period              = "300"
  statistic           = "Sum"
  threshold           = "0"
  alarm_description   = "Alert when root CA issues certificates"
  alarm_actions       = [aws_sns_topic.security_alerts.arn]

  dimensions = {
    CertificateAuthorityArn = aws_acmpca_certificate_authority.root_ca.arn
  }
}

# SNSトピック(セキュリティアラート用)
resource "aws_sns_topic" "security_alerts" {
  name = "pca-security-alerts"

  tags = {
    Purpose = "security-monitoring"
  }
}

# Lambda関数(ルートCAの自動無効化)
resource "aws_lambda_function" "disable_root_ca" {
  filename         = "disable_root_ca.zip"
  function_name    = "auto-disable-root-ca"
  role            = aws_iam_role.lambda_role.arn
  handler         = "index.handler"
  runtime         = "python3.9"
  timeout         = 60

  environment {
    variables = {
      ROOT_CA_ARN = aws_acmpca_certificate_authority.root_ca.arn
    }
  }

  tags = {
    Purpose = "security-automation"
  }
}

# EventBridge ルール(定期的なチェック)
resource "aws_cloudwatch_event_rule" "check_root_ca_status" {
  name                = "check-root-ca-status"
  description         = "Periodically check if root CA should be disabled"
  schedule_expression = "rate(1 hour)"
}

resource "aws_cloudwatch_event_target" "lambda_target" {
  rule      = aws_cloudwatch_event_rule.check_root_ca_status.name
  target_id = "DisableRootCAFunction"
  arn       = aws_lambda_function.disable_root_ca.arn
}

# IAMロール(Lambda用)
resource "aws_iam_role" "lambda_role" {
  name = "root-ca-management-role"

  assume_role_policy = jsonencode({
    Version = "2012-10-17"
    Statement = [{
      Action = "sts:AssumeRole"
      Effect = "Allow"
      Principal = {
        Service = "lambda.amazonaws.com"
      }
    }]
  })
}

# IAMポリシー(PCA管理権限)
resource "aws_iam_role_policy" "lambda_pca_policy" {
  name = "manage-root-ca-policy"
  role = aws_iam_role.lambda_role.id

  policy = jsonencode({
    Version = "2012-10-17"
    Statement = [
      {
        Effect = "Allow"
        Action = [
          "acm-pca:DescribeCertificateAuthority",
          "acm-pca:UpdateCertificateAuthority",
          "acm-pca:ListCertificateAuthorities"
        ]
        Resource = "*"
      },
      {
        Effect = "Allow"
        Action = [
          "logs:CreateLogGroup",
          "logs:CreateLogStream",
          "logs:PutLogEvents"
        ]
        Resource = "arn:aws:logs:*:*:*"
      }
    ]
  })
}

# Output
output "root_ca_arn" {
  value       = aws_acmpca_certificate_authority.root_ca.arn
  description = "Root CA ARN - Check status manually"
}

output "root_ca_management_reminder" {
  value = "IMPORTANT: Root CA should be disabled when not in use. Check status with: aws acm-pca describe-certificate-authority --certificate-authority-arn ${aws_acmpca_certificate_authority.root_ca.arn}"
}

output "subordinate_ca_arn" {
  value = aws_acmpca_certificate_authority.subordinate_ca.arn
}

ベストプラクティス

  1. ルートCAのオフライン管理: 可能であれば、ルートCAの秘密鍵をオフラインで生成し、ハードウェアセキュリティモジュール(HSM)に保管します。
  2. 定期的なステータス確認: AWS ConfigルールやLambda関数を使用して、ルートCAのステータスを定期的に確認します。
  3. アクセス制御の強化: ルートCAの管理には、MFA(多要素認証)を必須とし、最小限のユーザーにのみアクセスを許可します。
  4. 監査ログの分析: CloudTrailログを分析し、ルートCAに対するすべての操作を追跡します。
  5. セレモニーキーの使用: ルートCAのキーセレモニーを実施し、複数のセキュリティ担当者が立ち会う必要があるようにします。

最後に

この記事では、AWS Private CA ルート認証機関を適切に無効化する方法について、リスクと対策を解説しました。

ルートCAの適切な管理は、PKI全体のセキュリティを確保する上で極めて重要です。ルートCAを必要最小限の時間のみ有効化し、通常は無効化しておくことで、不正使用や誤操作のリスクを大幅に軽減できます。下位CAを適切に設定し、日常的な証明書発行業務はそちらで行うことで、セキュリティと運用効率の両立が可能になります。

なお、AWS Private CAでは、ルートCAを無効化しても、既に発行された証明書は有効期限まで有効であり続けることに注意してください。

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

参考資料

この記事をシェアする

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

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

料金プランを詳しく見る