CloudFront ディストリビューションにおいてカスタム SSL/TLS 証明書の設定について

このブログシリーズ 「クラウドセキュリティ 実践集」 では、一般的なセキュリティ課題を取り上げ、「なぜ危険なのか?」 というリスクの解説から、「どうやって直すのか?」 という具体的な修復手順(コンソール、AWS CLI、Terraformなど)まで、分かりやすく解説します。
今回は、Amazon CloudFrontディストリビューションにカスタムSSL/TLS証明書が設定されていない状態について、そのリスクと対策を解説します。

ポリシーの説明

Amazon CloudFrontは、AWSのグローバルなCDN (コンテンツデリバリーネットワーク) サービスです。ウェブサイト、API、動画コンテンツなどを高速かつ安全にユーザーに配信します。CloudFrontディストリビューションは、HTTPSをサポートし、デフォルトではCloudFrontが提供するドメイン名(例: d1234.cloudfront.net)に対してAWS管理のSSL/TLS証明書を使用します。現実的にそのような運用は本番環境ではまずないと思いますが、カスタムドメインでカスタムSSL/TLS証明書を利用するようにしましょう。

修復方法

Amazon CloudFrontディストリビューションにカスタムSSL/TLS証明書を設定する方法は、AWSコンソールまたはTerraformで行えます。ここではACMで証明書を作成し、それをCloudFrontに設定する手順を説明します。

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

AWSコンソールを使用して、CloudFrontディストリビューションにカスタムSSL/TLS証明書を設定します。

前提:

  • カスタムドメイン名(例: www.example.com)が所有していること。
  • ACM (AWS Certificate Manager) で、そのカスタムドメイン名に対応するSSL/TLS証明書が発行済みであること。
    • 証明書が発行済みでない場合は、ACMでリクエスト・検証を行ってください。ワイルドカード証明書(例: .example.com)も利用可能です。
    • 重要: CloudFrontで利用する証明書は、us-east-1 (バージニア北部) リージョンで発行されている必要があります。
  1. CloudFrontサービスへ移動: AWSコンソールにログインし、Amazon CloudFront サービスを開きます。
  2. ディストリビューションを選択: 設定を変更したいCloudFrontディストリビューションを選択します。
  3. 編集モードへ:編集」ボタンをクリックします。
  4. 代替ドメイン名 (CNAMEs) の設定:
    • 設定」セクションまでスクロールします。
    • 代替ドメイン名 (CNAMEs)」の項目で、カスタムドメイン名(例: www.example.com)を入力します。複数のドメイン名をカンマ区切りで入力できます。
  5. カスタムSSL証明書の設定:
    • カスタム SSL 証明書」のドロップダウンメニューで、「カスタム SSL 証明書」を選択します。表示されるリストから、ACMで作成済みの目的の証明書を選択します。(us-east-1 リージョンで作成された証明書のみが表示されます。)
  1. ビューワープロトコルポリシーの確認:ビューワープロトコルポリシー」の項目で、セキュリティを最大化するために「Redirect HTTP to HTTPS」または「HTTPS Only」が選択されていることを確認します。
  2. 変更を保存: 設定内容を確認し、「変更を保存」をクリックします。
    • 変更が反映されるまでには、ディストリビューションのステータスが「Deploying」となり、数分から数十分かかる場合があります。
  3. DNSレコードの更新: CloudFrontディストリビューションのステータスが「Deployed」になったら、お使いのDNSサービス(例: Amazon Route 53)で、カスタムドメイン名(例: www.example.com)からCloudFrontディストリビューションのドメイン名(例: d1234.cloudfront.net)へのCNAMEレコードを設定します。Route 53を使用している場合は、エイリアスレコードとして設定することで、ルートドメイン(例: example.com)もCNAMEと同様に扱えます。

Terraformでの修復手順

TerraformでAmazon CloudFrontディストリビューションにカスタムSSL/TLS証明書を設定するには、aws_cloudfront_distribution リソースの viewer_certificate ブロックを設定します。

前提:

  • カスタムドメイン名(例: www.example.com)が所有していること。
  • ACM (AWS Certificate Manager) で、そのカスタムドメイン名に対応するSSL/TLS証明書が**us-east-1 リージョン**で発行済みであること。
# AWS Certificate Manager (ACM) で証明書をリクエスト/取得
# 注: CloudFrontで利用する証明書は us-east-1 リージョンで作成する必要があります。
# そのため、このリソースはプロバイダーブロックでus-east-1を指定した上で定義します。
provider "aws" {
  alias  = "us_east_1"
  region = "us-east-1"
}

resource "aws_acm_certificate" "example_cert" {
  provider          = aws.us_east_1 # us-east-1 リージョンを指定
  domain_name       = "www.example.com" # あなたのカスタムドメイン名に置き換え
  validation_method = "DNS"
  tags = {
    Environment = "Production"
  }
  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.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.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" # デフォルトルートオブジェクト (オプション)

  # 代替ドメイン名 (CNAMEs)
  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" # または "https-only"
    min_ttl                = 0
    default_ttl            = 3600
    max_ttl                = 86400
  }

  # カスタムSSL証明書の設定
  viewer_certificate {
    acm_certificate_arn = aws_acm_certificate.example_cert.arn # ACM証明書のARNを指定
    ssl_support_method  = "sni-only" # "sni-only" または "vip"
    minimum_protocol_version = "TLSv1.2_2021" # 推奨される最小TLSバージョン
  }

  restrictions {
    geo_restriction {
      restriction_type = "none" # "blacklist", "whitelist" など
    }
  }

  price_class = "PriceClass_100" # "PriceClass_All", "PriceClass_200" など

  tags = {
    Environment = "Production"
  }
}

# Route 53 で CloudFront ディストリビューションへのエイリアスレコードを作成
resource "aws_route53_record" "www_example_com" {
  zone_id = "YOUR_ROUTE53_HOSTED_ZONE_ID" # あなたのRoute 53 ホストゾーンIDに置き換え
  name    = "www.example.com" # あなたのカスタムドメイン名に置き換え
  type    = "A"

  alias {
    name                   = aws_cloudfront_distribution.s3_distribution.domain_name
    zone_id                = aws_cloudfront_distribution.s3_distribution.hosted_zone_id
    evaluate_target_health = false
  }
}

# 現在のAWSアカウント情報を取得
data "aws_caller_identity" "current" {}

上記のTerraformコードでは、aws_cloudfront_distribution リソース内で viewer_certificate ブロックを設定することで、カスタムSSL/TLS証明書をCloudFrontディストリビューションに関連付けています。

  • aws_acm_certificate.example_cert: us-east-1 リージョンでACM証明書をリクエストします。DNS検証を使用しているため、aws_route53_recordaws_acm_certificate_validation も必要です。
  • aliases = ["www.example.com"]: CloudFrontディストリビューションに関連付けるカスタムドメイン名を指定します。
  • viewer_certificate:
    • acm_certificate_arn: ACMで発行された証明書のARNを指定します。
    • ssl_support_method: sni-only が一般的です。古いクライアントをサポートする必要がある場合は vip を検討しますが、追加費用が発生します。
    • minimum_protocol_version: セキュリティを強化するために、推奨される最小TLSバージョンを指定します(例: TLSv1.2_2021)。
  • aws_route53_record.www_example_com: カスタムドメイン名からCloudFrontディストリビューションへのAレコード(エイリアスレコード)をRoute 53で設定します。

YOUR_ROUTE53_HOSTED_ZONE_IDwww.example.comyour-s3-bucket.s3.amazonaws.com などのプレースホルダーは、実際の環境に合わせて修正してください。

最後に

この記事では、Amazon CloudFrontディストリビューションにカスタムSSL/TLS証明書を設定することの重要性について解説しました。この設定は、ウェブサイトの信頼性を高め、SEOを改善し、ユーザーエクスペリエンスを向上させるだけでなく、セキュリティを強化する上でも不可欠です。 貴社のCloudFrontディストリビューションは、カスタムSSL/TLS証明書で適切に保護されていますか?この機会にぜひ設定を確認・強化してみてください。 こちらの内容の検出は弊社が提供するSecurifyのCSPM機能で簡単に検出及び管理する事が可能です。運用が非常にラクに出来る製品になっていますのでぜひ興味がある方はお問い合わせお待ちしております。

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

この記事をシェアする

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

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

料金プランを詳しく見る