Amazon CloudFront でのディストリビューションへの転送中の暗号化設定手順

このブログシリーズ 「クラウドセキュリティ 実践集」 では、一般的なセキュリティ課題を取り上げ、「なぜ危険なのか?」 というリスクの解説から、「どうやって直すのか?」 という具体的な修復手順(コンソール、AWS CLI、Terraformなど)まで、分かりやすく解説します。
この記事では、CloudFront ディストリビューションで転送中の暗号化がされていない内容について解説します。

ポリシーの説明
[CloudFront.3] CloudFront ディストリビューションでは、転送中に暗号化が必要となります
https://docs.aws.amazon.com/ja_jp/securityhub/latest/userguide/cloudfront-controls.html
このコントロールは、Amazon CloudFront ディストリビューションでビューワーがHTTPS直接 を使用する必要があるかどうか、またはリダイレクトを使用するかどうかをチェックします。ViewerProtocolPolicy が defaultCacheBehavior または cacheBehaviors の allow-all に設定されている場合、コントロールは失敗します。
HTTPでの通信ではなく、HTTPSのみの許可もしくはリダイレクトを設定するようにしましょうということですね。修正手順はシンプルなのでサクッと試したいと思います。
修復方法
ViewerProtocolPolicy
をhttps-only
かredirect-to-https
に設定することで解決します。
AWSコンソールでの修正手順
① CloudFront > ディストリビューション > ビヘイビアへ移動します
② 変更したい対象を選択した状態で、「編集」をクリック
③ ビヘイビアの設定項目にあるビューワープロトコルポリシーの箇所で「RedirectHTTP to HTTPS」を選択するか、「HTTPS only」を選択します。
④ 設定が完了したら「変更を保存」をクリックして設定を保存します。


Terraformでの修復手順
Terraformの場合はdefault_cache_behavior
と追加でキャッシュ操作が必要な場合はordered_cache_behavior
の設定で**https-only
** もしくは**redirect-to-https
** を設定すればよいです。
# CloudFront Distribution
resource "aws_cloudfront_distribution" "example" {
enabled = true
is_ipv6_enabled = true
comment = "Example CloudFront Distribution"
default_root_object = "index.html"
# オリジンの設定
origin {
domain_name = "example-origin.s3.amazonaws.com"
origin_id = "S3-example-origin"
s3_origin_config {
origin_access_identity = aws_cloudfront_origin_access_identity.example.cloudfront_access_identity_path
}
}
# デフォルトのキャッシュ動作
default_cache_behavior {
allowed_methods = ["DELETE", "GET", "HEAD", "OPTIONS", "PATCH", "POST", "PUT"]
cached_methods = ["GET", "HEAD"]
target_origin_id = "S3-example-origin"
forwarded_values {
query_string = false
cookies {
forward = "none"
}
}
viewer_protocol_policy = "https-only"
min_ttl = 0
default_ttl = 3600
max_ttl = 86400
}
# 追加のキャッシュ動作(必要に応じて)
ordered_cache_behavior {
path_pattern = "/content/*"
allowed_methods = ["GET", "HEAD", "OPTIONS"]
cached_methods = ["GET", "HEAD", "OPTIONS"]
target_origin_id = "S3-example-origin"
forwarded_values {
query_string = false
headers = ["Origin"]
cookies {
forward = "none"
}
}
min_ttl = 0
default_ttl = 86400
max_ttl = 31536000
compress = true
viewer_protocol_policy = "https-only"
}
# 地理的制限の設定(必要に応じて)
restrictions {
geo_restriction {
restriction_type = "none"
}
}
# SSL証明書の設定
viewer_certificate {
cloudfront_default_certificate = true # カスタムドメインを使用する場合は、ここでACM証明書を指定
}
# タグ(必要に応じて)
tags = {
Environment = "Production"
}
}
最後に
今回は、CloudFront ディストリビューションで転送中の暗号化がされていない場合の対処方法についてご紹介しました。 HTTPのまま利用し続けることにより、中間者攻撃または同様の攻撃を使用してネットワークトラフィックの盗聴可能な状態となってしまう危険性があるため、転送先との通信はHTTPSで暗号化した上での利用が推奨されています。そのため、設定を行っていなければこの記事を参考に設定してみてください。
この問題の検出は弊社が提供するSecurifyのCSPM機能で簡単に検出及び管理する事が可能です。
運用が非常に楽に出来る製品になっていますので、ぜひ興味がある方はお問い合わせお待ちしております。
最後までお読みいただきありがとうございました。この記事が皆さんの役に立てば幸いです。
最後までお読みいただきありがとうございました。この記事が皆さんの役に立てば幸いです。