설명
S3 버킷 정책의 Action과 Principal에 와일드카드를 사용해 접근을 허용하면 업무에 필요하지 않은 작업이나 주체까지 권한 범위에 포함될 수 있습니다. 특히 익명 요청에도 광범위한 권한을 부여하지 않도록 작업과 주체의 범위를 함께 검토해야 합니다.
s3:*는 모든 S3 작업을 가리키지만 s3:Get*는 이름이 해당 패턴에 맞는 작업만 가리킵니다. 실제 접근 권한은 각 작업에 적용되는 리소스, 조건, 명시적 거부와 Block Public Access에도 영향을 받으므로 와일드카드 하나만으로 전체 권한을 판단할 수는 없습니다.
잠재적 영향
- 와일드카드가 의도하지 않은 작업이나 주체까지 포함하고 실제 권한으로 적용되면 접근 범위가 과도해질 수 있습니다.
- 객체 읽기, 쓰기, 삭제 중 어떤 영향이 발생하는지는 일치하는 작업과 대상 리소스에 따라 달라집니다.
해결 방법
- 필요한 작업과 접근 주체를 명시하고, 권한을 올바른 버킷 또는 객체 ARN으로 제한하세요.
- 공개 읽기처럼 의도한 접근이 있다면 대상 데이터와 조건을 확인하고 불필요한 작업까지 포함되지 않도록 검토하세요.
- 전체 정책, 명시적 거부, Block Public Access를 함께 확인하고 필요한 접근은 유지되며 원치 않는 접근은 거부되는지 테스트하세요.
예시
두 예제의 Resource에 적힌 버킷 이름은 name: mys3bucket과 다르므로 실제 대상 버킷에 맞게 수정해야 합니다. /*가 붙은 객체 ARN은 버킷 자체에 대한 모든 작업 권한을 의미하지 않습니다. 버킷 작업과 객체 작업에 맞는 ARN을 각각 사용하세요.
변경 전
yaml
- name: Create s3 bucket
amazon.aws.s3_bucket:
name: mys3bucket
policy:
Id: "id113"
Version: "2012-10-17"
Statement:
- Action: "s3:*"
Effect: "Allow"
Resource: "arn:aws:s3:::S3B_181355/*"
Principal: "*"
변경 후
yaml
- name: Create s3 bucket
amazon.aws.s3_bucket:
name: mys3bucket
policy:
Id: "id113"
Version: "2012-10-17"
Statement:
- Action:
- "s3:GetObject"
Effect: "Allow"
Resource: "arn:aws:s3:::S3B_181355/*"
Principal:
AWS: "arn:aws:iam::123456789012:role/read-only-bucket-role"
설명:
- 첫 번째 예시:
s3:*와Principal: "*"는 작업과 주체를 광범위하게 지정합니다. 리소스 ARN을 올바르게 고친 뒤에도 이 권한 범위가 필요한지 검토하세요. - 두 번째 예시: 특정 역할에 객체 읽기 작업인
s3:GetObject만 허용합니다. 실제 역할과 버킷 내 대상 객체의 ARN을 사용하고 다른 정책이 부여하는 추가 권한도 확인하세요.