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 요청에 접근 권한을 부여하는 것은 아닙니다.

참조