S3バケットのHTTPS強制ポリシーの確認

S3への暗号化されていないHTTPリクエストを拒否してください。

説明

S3へのHTTPリクエストでは通信中のデータが暗号化されず、漏えいや改ざんのリスクがあります。HTTPSを必須にするには、バケットとオブジェクトの両方に対してaws:SecureTransportがfalseのリクエストを明示的に拒否してください。

HTTPSだけを許可するAllow文では、他のポリシーで許可されたHTTPリクエストまで拒否できません。実際の権限付与と明示的な拒否条件を併せて確認してください。

想定される影響

  • リクエストの内容やアップロード・ダウンロードするデータが、通信中に盗聴・改ざんされるおそれがあります。
  • HTTPSが必要な環境でも、承認されたアクセスが保護されていない経路で行われる可能性があります。

対処方法

  • バケットARNとオブジェクトARNの両方に、aws:SecureTransport = falseをDenyするポリシーを適用してください。
  • 必要な権限とネットワーク制限を維持し、クライアントにHTTPSを使わせてください。
  • ネットワーク情報が省略されるAWSサービスの呼び出しを確認し、必要なサービスプリンシパルの例外はaws:PrincipalIsAWSService条件で限定してください。

例

以下はバケットリソースを省略したポリシーの抜粋です。変更前は指定IPアドレスからのリクエストを拒否する例であり、IP許可リストでもHTTPSの強制でもありません。実際のポリシーでは、必要なIP制限を維持しながら通信条件を追加してください。

変更前

hcl
resource "aws_s3_bucket_policy" "example" {
  bucket = aws_s3_bucket.b.id

  policy = <<EOF
{
    "Version": "2012-10-17",
    "Id": "MYBUCKETPOLICY",
    "Statement": [
      {
        "Sid": "IPAllow",
        "Effect": "Deny",
        "Principal": "*",
        "Action": "s3:*",
        "Resource": [
          "${aws_s3_bucket.b.arn}",
          "${aws_s3_bucket.b.arn}/*"
        ],
        "Condition": {
          "IpAddress": {
            "aws:SourceIp": "8.8.8.8/32"
          }
        }
      }
    ]
}
EOF
}

変更後

hcl
resource "aws_s3_bucket_policy" "example" {
  bucket = aws_s3_bucket.b.id

  policy = <<EOF
{
    "Version": "2012-10-17",
    "Id": "MYBUCKETPOLICY",
    "Statement": [
      {
        "Sid": "IPAllow",
        "Effect": "Deny",
        "Principal": "*",
        "Action": "s3:*",
        "Resource": [
          "${aws_s3_bucket.b.arn}",
          "${aws_s3_bucket.b.arn}/*"
        ],
        "Condition": {
          "Bool": {
            "aws:SecureTransport": "false"
          }
        }
      }
    ]
}
EOF
}

説明:

変更後はバケットとオブジェクトへの暗号化されていないリクエストを明示的に拒否します。この文自体がHTTPSリクエストにアクセス権限を付与するわけではありません。

参考資料