설명
S3 버킷 정책에서 Principal을 *로 지정한 허용 구문은 익명 요청을 포함해 넓은 범위의 주체에 접근을 허용할 수 있습니다. 실제 권한은 허용된 작업과 리소스, 정책 조건, 명시적 거부, Block Public Access 설정에 따라 달라집니다. 주체 범위가 누락되어 있다면 정책의 의도를 명확히 작성하고 문법을 검증해야 합니다. 누락 자체가 접근 권한을 부여하는 것은 아닙니다.
잠재적 영향
- 의도하지 않은 주체가 객체 읽기 권한을 얻으면 데이터가 노출될 수 있습니다. 쓰기나 삭제도 허용된 경우에는 데이터 변경이나 손실로 이어질 수 있습니다.
- 현재 공개 접근을 차단하는 설정이나 조건을 나중에 완화하면 광범위한 허용 구문으로 인해 접근 범위가 확대될 수 있습니다.
해결 방법
- 필요한 계정, 역할, 사용자 또는 서비스를 지정하고 허용할 작업과 리소스를 최소화하세요. 누락되거나 잘못된 정책 요소를 수정하고 전체 정책을 검증하세요.
- 내부용 버킷에는 Block Public Access를 적용하고 관련 계정과 버킷에서 실제로 적용되는 설정을 확인하세요. 의도적으로 공개하는 데이터도 필요한 리소스에 대한 작업만 허용하고 조건을 검토하세요.
- 배포할 버킷과 정책의 리소스 ARN이 일치하는지 확인하세요. IAM Access Analyzer 등으로 정책을 검토하고 필요한 접근은 유지되며 불필요한 접근은 거부되는지 검증하세요.
예시
예제의 버킷에는 BucketName이 없지만 정책은 고정된 DOC-EXAMPLE-BUCKET의 객체 ARN을 사용합니다. 실제 버킷의 객체 ARN과 존재하는 IAM 주체로 바꾸고 Block Public Access 설정도 확인해야 합니다.
변경 전
yaml
Resources:
Bucket:
Type: AWS::S3::Bucket
BucketPolicy:
Type: AWS::S3::BucketPolicy
Properties:
Bucket: !Ref Bucket
PolicyDocument:
Statement:
- Effect: Allow
Principal:
AWS:
- "*"
Action: s3:GetObject
Resource: arn:aws:s3:::DOC-EXAMPLE-BUCKET/*
변경 후
yaml
Resources:
Bucket:
Type: AWS::S3::Bucket
BucketPolicy:
Type: AWS::S3::BucketPolicy
Properties:
Bucket: !Ref Bucket
PolicyDocument:
Statement:
- Effect: Allow
Principal:
AWS:
- arn:aws:iam::111122223333:user/Alice
- arn:aws:iam::111122223333:user/foo
Action: s3:GetObject
Resource: arn:aws:s3:::DOC-EXAMPLE-BUCKET/*
설명:
- 변경 전: 모든 주체에
s3:GetObject를 허용하는 구문입니다. 다른 접근 제어가 막지 않으면 지정된 객체를 공개할 수 있으며, 쓰기나 삭제를 허용하는 예시는 아닙니다. - 변경 후: 같은 읽기 작업의 주체를 두 사용자 ARN으로 제한합니다. 이 구문만으로 사용자가 다른 정책에서 받은 권한까지 제한되지는 않으므로 전체 권한을 확인하세요.