ACMにおけるRSA証明書のキー長の設定について

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

今回は、AWS Certificate Manager (ACM) により管理されるRSA証明書のキー長が2048ビット未満になっている状態について、そのリスクと対策を解説します。

ポリシーの説明

Security Hub コントロール AWS Certificate Manager – AWS Security Hub

[ACM.2] ACM によって管理される RSA 証明書は、少なくとも 2,048 ビットのキーの長さを使用する必要があります

このコントロールは、 によって管理される RSA 証明書が少なくとも 2,048 ビットのキー長 AWS Certificate Manager を使用しているかどうかを確認します。キーの長さが 2,048 ビットより小さい場合、コントロールは失敗します。現実的には起きうるリスクは低いと思いますが、仮に設定されていた場合は対処しましょう。

リスク

AWS Certificate Manager (ACM) は、SSL/TLS証明書を簡単にプロビジョニング、管理、デプロイできるサービスです。ウェブサイトやアプリケーションのセキュリティを確保するために、証明書は暗号化された通信を確立します。この暗号化の強度は、使用されるキー長に直接相関します。ACMでRSA証明書をリクエストする際に、誤って選択される可能性があります。

RSA証明書のキー長が2048ビット未満である場合、以下のような重大なセキュリティリスクが発生します。

  • 暗号解読のリスク増大: RSA暗号の安全性は、大きな素因数分解の困難性に基づいています。キー長が短いほど、計算能力の向上に伴い、短時間で因数分解され、暗号が解読されるリスクが高まります。特に、1024ビット以下のキー長は、現代の計算能力を持つ攻撃者によって、もはや安全とは見なされていません。
  • 中間者攻撃 (Man-in-the-Middle, MitM) の脆弱性: キー長が短い証明書は、攻撃者によって偽造され、中間者攻撃に悪用される可能性が高まります。これにより、通信内容の盗聴や改ざんが行われ、機密情報の漏洩やデータの不正な書き換えにつながる可能性があります。
  • 信頼性の低下とブラウザ警告: 主要なブラウザやOSの多くは、短いキー長の証明書を信頼しないか、セキュリティ警告を表示するようになっています。これにより、ユーザーはウェブサイトへのアクセスを躊躇し、ブランドイメージの毀損やビジネス機会の損失につながります。
  • 将来的なセキュリティ要件への非対応: 暗号技術の進化と計算能力の向上は継続的に進んでおり、現在の基準が将来も安全であるとは限りません。2048ビット以上のキー長は、将来的なセキュリティ要件にも比較的長く対応できると考えられています。

対策

ACMにより管理されるRSA証明書のキー長を2048ビット以上にすることは、上記のすべてのリスクを軽減し、暗号の強度と長期的なセキュリティを確保するための重要なベストプラクティスです。

  • 2048ビット以上のキー長の使用: ACMでRSA証明書をリクエストする際には、キー長として2048ビット以上を明示的に指定します。ACMは2048ビットと4096ビットのRSAキー長をサポートしています。
    • 2048ビット: ほとんどのユースケースで十分なセキュリティを提供し、パフォーマンスへの影響も最小限です。
    • 4096ビット: より高いセキュリティが求められる場合(特に機密性の高いデータや長期的なセキュリティが必要な場合)に検討できますが、パフォーマンスオーバーヘッドが増加する可能性があります。
  • ECC (Elliptic Curve Cryptography) 証明書の検討: RSAの代替として、ECC証明書も検討できます。ECCはRSAよりも短いキー長で同等以上のセキュリティ強度を提供でき、パフォーマンス効率にも優れています。ACMはECC P-256、P-384、P-521のキータイプをサポートしています。
  • 既存証明書の置き換え: すでに2048ビット未満のキー長を持つ証明書を使用している場合は、新しい2048ビット以上のキー長またはECCの証明書をACMでリクエストし、既存の証明書と置き換える必要があります。証明書はデプロイ先のサービス(CloudFront、ELB、API Gatewayなど)で更新します。
  • デプロイ先のセキュリティポリシー確認: 証明書をデプロイするAWSサービス(CloudFront、ELBなど)のSSL/TLSセキュリティポリシーも、最新かつ安全なもの(例: TLS13-RPM-1o-2021-06, ELBSecurityPolicy-TLS13-Ext-2023-08など)に設定されていることを確認し、古いプロトコルバージョン(TLSv1.0, TLSv1.1)を無効化します。
  • 定期的なレビュー: セキュリティ基準は常に進化するため、定期的に証明書のキー長やプロトコルバージョンを確認し、最新のベストプラクティスに準拠しているかレビューすることが重要です。

修復方法

ACMにより管理されるRSA証明書のキー長を2048ビット以上にする方法は、AWSコンソールまたはTerraformで行えます。既存の証明書のキー長は変更できないため、新しいキー長で証明書を再発行し、関連するサービスに適用し直す必要があります。

AWSコンソールでの修復手順

AWSコンソールを使用して、ACMで新しいRSA証明書を2048ビット以上のキー長でリクエストし、既存のサービスに適用します。

ステップ 1: 新しい証明書をリクエストする

  1. AWS Certificate Manager (ACM) サービスへ移動: AWSコンソールにログインし、AWS Certificate Manager サービスを開きます。
  2. 証明書のリクエスト: 左側のナビゲーションペインで「証明書を一覧表示」を選択し、「リクエスト」をクリックします。
  3. 証明書タイプの選択:パブリック証明書をリクエスト」を選択し、「次へ」をクリックします。
  4. ドメイン名の追加:
    • ドメイン名」に、対象となるドメイン名(例: example.com および .example.com)を入力します。
  5. 検証方法の選択:
    • DNS検証」(推奨)または「Eメール検証」を選択します。DNS検証が推奨されます。
  6. キー設定:
    • キータイプ」で「RSA」を選択します。
    • キーサイズ」のドロップダウンメニューで、「RSA 2048」または「RSA 4096」を選択します。
      • 最低でも「RSA 2048」を選択してください。
  1. タグの追加 (オプション): 必要に応じてタグを追加します。
  2. 確認とリクエスト: 設定内容を確認し、「リクエスト」をクリックします。
  3. 証明書の検証:
    • DNS検証を選択した場合、表示されるCNAIMEレコードをDNSプロバイダーに設定し、証明書が発行されるのを待ちます。ACMコンソールでステータスが「発行済み」になるまで待ちます。

ステップ 2: 新しい証明書をサービスに適用する

新しい証明書が発行されたら、その証明書を使用するAWSサービス(CloudFront, ELB, API Gatewayなど)を更新します。

  • 例: CloudFrontディストリビューションの場合
    1. CloudFrontサービスへ移動: CloudFrontコンソールを開きます。
    2. ディストリビューションを選択: 更新したいディストリビューションを選択し、「編集」をクリックします。
    3. カスタムSSL証明書の設定:
      • カスタム SSL 証明書」のドロップダウンメニューから、ステップ1で発行された新しいACM証明書(2048ビット以上)を選択します。
      • 重要: CloudFrontで利用する証明書は、us-east-1 (バージニア北部) リージョンで発行されている必要があります。
    4. 変更を保存:変更を保存」をクリックします。ディストリビューションがデプロイされるまで待ちます。
    5. DNSレコードの確認: 必要に応じて、カスタムドメイン名がCloudFrontに正しくCNAIME解決されていることを確認します。
  • 例: Application Load Balancer (ALB) の場合
    1. EC2サービスへ移動: EC2コンソールを開き、左側のナビゲーションペインで「ロードバランサー」を選択します。
    2. ALBを選択し、リスナーを編集: 更新したいALBを選択し、「リスナー」タブをクリックします。HTTPSリスナー(通常はポート443)を選択し、「編集」をクリックします。
    3. 証明書の設定:
      • デフォルト SSL 証明書」で、「AWS Certificate Manager から」を選択し、ステップ1で発行された新しいACM証明書(2048ビット以上)を選択します。
      • セキュリティポリシー」を最新かつ安全なもの(例: ELBSecurityPolicy-TLS13-Ext-2023-08)に設定します。
    4. 変更を保存:変更を保存」をクリックします。

Terraformでの修復手順

TerraformでACMにより管理されるRSA証明書のキー長を2048ビット以上にするには、aws_acm_certificate リソースの key_algorithm パラメータを設定します。

# AWS Certificate Manager (ACM) でRSA 2048ビットの証明書をリクエスト
# 注: CloudFrontで利用する証明書は us-east-1 リージョンで作成する必要があります。
# そのため、このリソースはプロバイダーブロックでus-east-1を指定した上で定義します。
provider "aws" {
  alias  = "us_east_1"
  region = "us-east-1"
}

resource "aws_acm_certificate" "example_cert_rsa_2048" {
  provider          = aws.us_east_1 # us-east-1 リージョンを指定
  domain_name       = "www.example.com" # あなたのカスタムドメイン名に置き換え
  validation_method = "DNS"
  
  # **重要: RSAキー長を2048ビット以上 (RSA_2048 または RSA_4096) に設定**
  key_algorithm     = "RSA_2048" 

  tags = {
    Environment = "Production"
    KeyLength   = "RSA2048"
  }
  lifecycle {
    create_before_destroy = true # 証明書更新時のダウンタイムを最小限にする
  }
}

# DNS検証レコードの作成 (例: Route 53を使用する場合)
resource "aws_route53_record" "example_cert_validation" {
  for_each = {
    for dvo in aws_acm_certificate.example_cert_rsa_2048.domain_validation_options : dvo.domain_name => dvo
  }
  allow_overwrite = true
  name            = each.value.resource_record_name
  records         = [each.value.resource_record_value]
  type            = each.value.resource_record_type
  zone_id         = "YOUR_ROUTE53_HOSTED_ZONE_ID" # あなたのRoute 53 ホストゾーンIDに置き換え
  ttl             = 60
}

# ACM 証明書の検証
resource "aws_acm_certificate_validation" "example_cert_validation" {
  provider        = aws.us_east_1 # us-east-1 リージョンを指定
  certificate_arn = aws_acm_certificate.example_cert_rsa_2048.arn
  validation_record_fqdns = [for record in aws_route53_record.example_cert_validation : record.fqdn]
}

# CloudFront ディストリビューションに新しい証明書を適用
resource "aws_cloudfront_distribution" "s3_distribution" {
  origin {
    domain_name = "your-s3-bucket.s3.amazonaws.com" # あなたのS3バケットのドメイン名に置き換え
    origin_id   = "S3-my-bucket"
    s3_origin_config {
      origin_access_identity = "origin-access-identity/cloudfront/E1234567890ABC" # あなたのOAI/OACに置き換え
    }
  }

  enabled             = true
  is_ipv6_enabled     = true
  comment             = "My secure CloudFront distribution"
  default_root_object = "index.html"

  aliases = ["www.example.com"] # あなたのカスタムドメイン名に置き換え

  default_cache_behavior {
    allowed_methods  = ["GET", "HEAD", "OPTIONS"]
    cached_methods   = ["GET", "HEAD", "OPTIONS"]
    target_origin_id = "S3-my-bucket"

    forwarded_values {
      query_string = false
      headers      = ["Origin"]
      cookies {
        forward = "none"
      }
    }

    viewer_protocol_policy = "redirect-to-https"
    min_ttl                = 0
    default_ttl            = 3600
    max_ttl                = 86400
  }

  # カスタムSSL証明書の設定: 新しいRSA 2048証明書を適用
  viewer_certificate {
    acm_certificate_arn      = aws_acm_certificate.example_cert_rsa_2048.arn # 新しいACM証明書のARNを指定
    ssl_support_method       = "sni-only"
    minimum_protocol_version = "TLSv1.2_2021" # 推奨される最小TLSバージョン
  }

  restrictions {
    geo_restriction {
      restriction_type = "none"
    }
  }

  price_class = "PriceClass_100"

  tags = {
    Environment = "Production"
  }
}

# (オプション) Application Load Balancer (ALB) に新しい証明書を適用
# ALB用のACM証明書はALBと同じリージョンで作成する必要があります。
/*
resource "aws_acm_certificate" "alb_cert_rsa_2048" {
  domain_name       = "app.example.com"
  validation_method = "DNS"
  key_algorithm     = "RSA_2048" # RSA 2048ビットを指定
  tags = {
    Environment = "Production"
    KeyLength   = "RSA2048"
  }
  lifecycle {
    create_before_destroy = true
  }
}

resource "aws_lb_listener" "https_listener_alb" {
  load_balancer_arn = aws_lb.example_lb.arn # あなたのALB ARNに置き換え
  port              = 443
  protocol          = "HTTPS"
  certificate_arn   = aws_acm_certificate.alb_cert_rsa_2048.arn # 新しいACM証明書のARNを指定
  ssl_policy        = "ELBSecurityPolicy-TLS13-Ext-2023-08" # 推奨される最新のポリシー

  default_action {
    type             = "forward"
    target_group_arn = aws_lb_target_group.example_tg.arn # あなたのターゲットグループARNに置き換え
  }
}
*/

# 現在のAWSアカウント情報とリージョンを取得
data "aws_caller_identity" "current" {}
data "aws_region" "current" {}

上記のTerraformコードでは、aws_acm_certificate リソースで key_algorithm = "RSA_2048" を設定することで、2048ビットのRSAキー長を持つ証明書をリクエストしています。

  • aws_acm_certificate.example_crsa2048ert__: key_algorithm パラメータで "RSA_2048" または "RSA_4096" を指定します。
  • aws_acm_certificate_validation: 証明書が発行されるためには、DNS検証レコードの作成と検証が成功する必要があります。
  • aws_cloudfront_distribution.s3_distribution.viewer_certificate.acm_certificate_arn: ここで、新しく作成した2048ビット以上の証明書のARNを指定し、CloudFrontディストリビューションに適用します。ALBなど他のサービスに適用する場合も同様に、関連するリソースで証明書のARNを更新します。

www.example.com, YOUR_ROUTE53_HOSTED_ZONE_ID などのプレースホルダーは、実際の環境に合わせて修正してください。

最後に

この記事では、ACMにより管理されるRSA証明書のキー長を2048ビット以上にする重要性について解説しました。この設定は、暗号の強度を確保し、データ傍受や改ざんのリスクを防ぎ、コンプライアンス要件を満たす上で不可欠です。 貴社のACM証明書は、2048ビット以上のキー長で保護されていますか?この機会にぜひ設定を確認・強化してみてください。 こちらの内容の検出は弊社が提供するSecurifyのCSPM機能で簡単に検出及び管理する事が可能です。運用が非常にラクに出来る製品になっていますのでぜひ興味がある方はお問い合わせお待ちしております。

最後までお読みいただきありがとうございました。この記事が皆さんの役に立てば幸いです。

この記事をシェアする

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

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

料金プランを詳しく見る