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
(バージニア北部) リージョンで発行されている必要があります。
- 証明書が発行済みでない場合は、ACMでリクエスト・検証を行ってください。ワイルドカード証明書(例:
- CloudFrontサービスへ移動: AWSコンソールにログインし、Amazon CloudFront サービスを開きます。
- ディストリビューションを選択: 設定を変更したいCloudFrontディストリビューションを選択します。
- 編集モードへ: 「編集」ボタンをクリックします。
- 代替ドメイン名 (CNAMEs) の設定:
- 「設定」セクションまでスクロールします。
- 「代替ドメイン名 (CNAMEs)」の項目で、カスタムドメイン名(例:
www.example.com
)を入力します。複数のドメイン名をカンマ区切りで入力できます。
- カスタムSSL証明書の設定:
- 「カスタム SSL 証明書」のドロップダウンメニューで、「カスタム SSL 証明書」を選択します。表示されるリストから、ACMで作成済みの目的の証明書を選択します。(
us-east-1
リージョンで作成された証明書のみが表示されます。)
- 「カスタム SSL 証明書」のドロップダウンメニューで、「カスタム SSL 証明書」を選択します。表示されるリストから、ACMで作成済みの目的の証明書を選択します。(

- ビューワープロトコルポリシーの確認: 「ビューワープロトコルポリシー」の項目で、セキュリティを最大化するために「Redirect HTTP to HTTPS」または「HTTPS Only」が選択されていることを確認します。
- 変更を保存: 設定内容を確認し、「変更を保存」をクリックします。
- 変更が反映されるまでには、ディストリビューションのステータスが「Deploying」となり、数分から数十分かかる場合があります。
- 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_record
とaws_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_ID
や www.example.com
、your-s3-bucket.s3.amazonaws.com
などのプレースホルダーは、実際の環境に合わせて修正してください。
最後に
この記事では、Amazon CloudFrontディストリビューションにカスタムSSL/TLS証明書を設定することの重要性について解説しました。この設定は、ウェブサイトの信頼性を高め、SEOを改善し、ユーザーエクスペリエンスを向上させるだけでなく、セキュリティを強化する上でも不可欠です。 貴社のCloudFrontディストリビューションは、カスタムSSL/TLS証明書で適切に保護されていますか?この機会にぜひ設定を確認・強化してみてください。 こちらの内容の検出は弊社が提供するSecurifyのCSPM機能で簡単に検出及び管理する事が可能です。運用が非常にラクに出来る製品になっていますのでぜひ興味がある方はお問い合わせお待ちしております。
最後までお読みいただきありがとうございました。この記事が皆さんの役に立てば幸いです。