작업과 접근 주체에 와일드카드가 있는 S3 버킷 정책

S3 버킷 정책의 작업과 접근 주체를 필요한 범위로 제한해 과도한 권한 부여를 줄입니다.

설명

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을 사용하고 다른 정책이 부여하는 추가 권한도 확인하세요.

참조