S3 쓰기 요청의 TLS 강제 설정 점검

S3 쓰기 요청에 HTTPS를 요구해 업로드 데이터를 전송 중에 보호하세요.

설명

S3 버킷 정책에서 업로드 같은 쓰기 작업에 TLS를 강제하지 않으면 권한 있는 클라이언트의 평문 HTTP 요청이 허용될 수 있습니다. 전송 중 암호화가 없으면 업로드 데이터가 네트워크에서 노출될 위험이 있습니다.

AWS::S3::BucketPolicy의 aws:SecureTransport 조건으로 비보안 요청을 명시적으로 거부하세요. HTTPS 요청을 허용하는 문장만 추가해서는 다른 정책이 허용하는 HTTP 요청을 차단할 수 없습니다.

잠재적 영향

  • 평문으로 전송하는 업로드 데이터가 네트워크에서 가로채이거나 변조될 수 있습니다.
  • 조직이 요구하는 전송 구간 암호화 기준을 충족하지 못할 수 있습니다.

해결 방법

  • 보호할 작업과 리소스에 대해 aws:SecureTransport: false일 때 Deny하는 정책을 설정하세요.
  • 애플리케이션과 배포 스크립트가 HTTPS 엔드포인트를 사용하도록 점검하세요.
  • AWS 서비스 간 호출은 네트워크 조건 정보가 생략될 수 있으므로 필요한 서비스 주체의 예외를 검토하고 연동이 계속 동작하는지 시험하세요.

예시

다음은 버킷 정책 발췌입니다. BucketName 입력에는 유효하고 고유한 버킷 이름을 지정하세요. 첫 예제의 공개 읽기 정책은 별도 공개 접근 검토가 필요하며 퍼블릭 액세스 차단이 적용되면 설정이 거부될 수 있습니다.

변경 전

yaml
Resources:
  S3Bucket:
    Type: AWS::S3::Bucket
    Properties:
      BucketName: !Ref BucketName
  BucketPolicy:
    Type: AWS::S3::BucketPolicy
    Properties:
      Bucket: !Ref S3Bucket
      PolicyDocument:
        Statement:
          - Sid: PublicReadForGetBucketObjects
            Effect: Allow
            Principal: "*"
            Action: s3:GetObject
            Resource: !Sub arn:aws:s3:::${S3Bucket}/*

이 문장은 공개 읽기만 허용하며 쓰기 권한이나 HTTPS 강제를 제공하지 않습니다. 별도 정책에서 쓰기를 허용하더라도 여기에는 HTTP 쓰기를 거부하는 조건이 없습니다.

변경 후

yaml
Resources:
  S3Bucket:
    Type: AWS::S3::Bucket
    Properties:
      BucketName: !Ref BucketName
  BucketPolicy:
    Type: AWS::S3::BucketPolicy
    Properties:
      Bucket: !Ref S3Bucket
      PolicyDocument:
        Statement:
          - Sid: EnsureSSL
            Effect: Deny
            Principal: "*"
            Action: s3:PutObject
            Condition:
              Bool:
                aws:SecureTransport: false
            Resource: !Sub arn:aws:s3:::${S3Bucket}/*

객체에 대한 HTTP s3:PutObject 요청을 거부합니다. 업로드 권한 자체는 별도로 필요하며, 다른 작업의 TLS 강제도 별도로 구성해야 합니다. 첫 예제의 공개 읽기 허용도 제거됩니다.

참조