설명
S3 버킷 정책의 Principal: "*"는 다른 AWS 계정뿐 아니라 익명 요청도 포함할 수 있습니다. 필요한 범위보다 넓게 접근을 허용하면 의도하지 않은 주체가 객체를 읽거나 변경할 수 있습니다. 실제 권한은 허용한 작업, 리소스, 조건, 명시적 거부와 S3 Block Public Access 설정에 따라 달라지므로 정책 전체를 함께 검토해야 합니다.
잠재적 영향
- 의도하지 않은 주체에게 객체 읽기가 실제로 허용되면 파일, 로그, 백업 등의 정보가 노출될 수 있습니다.
- 쓰기나 삭제 작업이 허용되면 데이터 무결성이나 가용성에 영향을 줄 수 있습니다. 와일드카드 주체만으로 모든 작업이 허용되는 것은 아닙니다.
해결 방법
- 필요한 계정, 역할, 서비스 주체를 지정하고 각 작업과 리소스 범위를 최소한으로 제한하세요.
- 와일드카드를 조건과 함께 사용해야 한다면 조건의 키, 연산자, 값이 의도한 요청만 허용하는지 검토하세요.
- 공개 접근이 필요하지 않다면 S3 Block Public Access를 적용하고 계정과 버킷에서 실제로 적용되는 설정을 함께 확인하세요. 필요한 외부 연동이 유지되는지도 점검하세요.
예시
첫 예제는 Resource에 SQS 리소스를 가리키는 ${aws_sqs_queue.q.arn}을 사용하므로 유효한 S3 버킷 정책으로 배포할 수 없습니다. 실제 S3 리소스 ARN을 지정해야 합니다. 두 번째 예제의 계정과 역할 ARN도 실제 값으로 바꾸고 관련 권한과 공개 접근 차단 설정을 확인하세요.
변경 전
yaml
- name: Create a simple s3 bucket with a policy
amazon.aws.s3_bucket:
name: mys3bucket
policy:
Version: "2012-10-17"
Id: "sqspolicy"
Statement:
- Sid: First
Effect: Allow
Principal: "*"
Action: "*"
Resource: ${aws_sqs_queue.q.arn}
변경 후
yaml
- name: Create a simple s3 bucket with a policy
amazon.aws.s3_bucket:
name: mys3bucket
policy:
Version: "2012-10-17"
Id: "bucket-policy"
Statement:
- Sid: AllowReadFromSpecificRole
Effect: Allow
Principal:
AWS: "arn:aws:iam::123456789012:role/app-bucket-reader"
Action:
- "s3:GetObject"
Resource: "arn:aws:s3:::mys3bucket/*"
설명:
- 변경 전:
Principal: "*"와Action: "*"는 주체와 작업을 제한하지 않는 조합입니다. 다만 잘못된Resource때문에 이 예제 자체를 유효한 접근 허용 정책으로 사용할 수는 없습니다. - 변경 후: 이 정책 구문은 지정한 역할에 해당 버킷 객체의
s3:GetObject만 허용합니다. 역할에 적용되는 다른 정책이 추가 권한을 부여하는지도 확인하세요.