설명
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 강제도 별도로 구성해야 합니다. 첫 예제의 공개 읽기 허용도 제거됩니다.