설명
프라이빗 ECR 리포지토리 정책에서 허용 문장의 Principal을 *로 지정하면 이미지 작업을 수행할 수 있는 주체의 범위가 넓어질 수 있습니다. 실제 권한은 Action, Condition, 명시적 거부와 적용되는 IAM 정책에 따라 달라집니다. 외부 계정과의 공유가 필요하더라도 필요한 주체와 작업으로 범위를 제한해야 합니다.
AWS::ECR::Repository는 프라이빗 리포지토리입니다. 와일드카드 주체를 사용해도 공개 ECR 리포지토리가 되거나 익명 다운로드가 허용되는 것은 아닙니다. 프라이빗 레지스트리에 인증하려면 IAM 정책에서 ecr:GetAuthorizationToken을 허용해야 합니다.
잠재적 영향
- 의도하지 않은 주체가 이미지 읽기 권한을 얻으면 이미지에 포함된 애플리케이션 코드와 구성 정보가 노출될 수 있습니다.
- 이미지 업로드나 삭제까지 허용하면 배포에 쓰이는 이미지가 바뀌거나 필요한 이미지를 사용할 수 없게 될 수 있습니다. 영향은 실제로 부여된 작업 권한에 따라 달라집니다.
해결 방법
- 필요한 IAM 역할, 사용자 또는 계정만 주체로 지정하고
Action을 필요한 리포지토리 작업으로 제한하세요. 와일드카드 주체에Condition을 적용한다면 의도한 접근 범위를 충분히 제한하는지 확인하세요. - 레지스트리 인증 권한과 명시적 거부를 포함해 적용되는 정책을 함께 검토하세요. 교차 계정 접근은 호출 주체 측의 IAM 권한도 확인하세요.
- 기존 리소스의 논리 ID와 업데이트 영향을 확인한 뒤 정책을 변경하세요. 필요한 이미지 작업은 성공하고 의도하지 않은 주체의 요청은 거부되는지 테스트하세요.
예시
두 예시는 리포지토리 정책의 허용 주체를 비교합니다. 논리 ID가 서로 다르므로 기존 스택을 업데이트할 때는 대상 리소스의 ID를 유지하세요. 계정과 사용자 ARN은 실제로 허용할 주체로 바꾸세요. Sid는 AllowPushPull이지만 나열된 세 작업은 이미지 읽기에 사용됩니다. 인증 권한과 다른 정책은 별도로 구성해야 합니다.
변경 전
yaml
Resources:
MyRepository3:
Type: AWS::ECR::Repository
Properties:
RepositoryName: "test-repository"
RepositoryPolicyText:
Version: "2012-10-17"
Statement:
- Sid: AllowPushPull
Effect: Allow
Principal: "*"
Action:
- "ecr:GetDownloadUrlForLayer"
- "ecr:BatchGetImage"
- "ecr:BatchCheckLayerAvailability"
변경 후
yaml
Resources:
MyRepository1:
Type: AWS::ECR::Repository
Properties:
RepositoryName: "test-repository"
RepositoryPolicyText:
Version: "2012-10-17"
Statement:
- Sid: AllowPushPull
Effect: Allow
Principal:
AWS:
- "arn:aws:iam::123456789012:user/Bob"
- "arn:aws:iam::123456789012:user/Alice"
Action:
- "ecr:GetDownloadUrlForLayer"
- "ecr:BatchGetImage"
- "ecr:BatchCheckLayerAvailability"
설명:
- 변경 전: 정책 문장이 주체를
*로 지정해 이미지 읽기 작업의 허용 범위를 넓힙니다. 프라이빗 레지스트리 인증과 다른 정책의 제한은 계속 적용됩니다. - 변경 후: 정책 문장의 주체를 두 IAM 사용자로 한정합니다. 사용자 ARN이 의도한 대상을 가리키는지, 다른 정책이 불필요한 권한을 추가하지 않는지 확인하세요.