리포지토리 정책 - CodeArtifact

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

리포지토리 정책

CodeArtifact 리소스 기반 권한을 사용하여 액세스를 제어합니다. 리소스 기반 권한을 사용하면 리포지토리에 액세스할 수 있는 대상 및 이러한 대상이 리포지토리에서 수행할 수 있는 작업을 지정할 수 있습니다. 기본적으로 리포지토리 소유자만 리포지토리에 액세스할 수 있습니다. 사용자는 다른 IAM 보안 주체가 자신의 리포지토리에 액세스하도록 허용하는 정책 문서를 적용할 수 있습니다.

자세한 내용은 리소스 기반 정책자격 증명 기반 정책 및 리소스 기반 정책을 참조하세요.

리소스 정책을 생성하여 읽기 액세스 권한 부여

리소스 정책은 JSON 형식의 텍스트 파일입니다. 파일은 보안 주체(액터), 하나 이상의 작업과 단일 효과(Allow또는Deny)를 지정해야 합니다. 예를 들어 다음 리소스 정책은 리포지토리에서 패키지를 다운로드할 수 있는 123456789012 권한을 계정에 부여합니다.

{ "Version": "2012-10-17", "Statement": [ { "Action": [ "codeartifact:ReadFromRepository" ], "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::123456789012:root" }, "Resource": "*" } ] }

정책은 정책이 연결된 리포지토리 대상 작업에 대해서만 평가되므로, 리소스를 지정하지 않아도 됩니다. 리소스는 암시적이기 때문에 Resource*로 설정할 수 있습니다. 패키지 관리자가 이 리포지토리에서 패키지를 다운로드하려면 크로스 계정 액세스를 위한 도메인 정책도 만들어야 합니다. 도메인 정책은 주체에게 최소한 codeartifact:GetAuthorizationToken 권한을 부여해야 합니다. 크로스 계정 액세스 권한을 부여하는 전체 도메인 정책 예제는 도메인 정책 예제 섹션을 참조하세요.

참고

codeartifact:ReadFromRepository 작업은 리포지토리 리소스에서만 사용할 수 있습니다. codeartifact:ReadFromRepository가 있는 리소스인 패키지의 Amazon 리소스 이름(ARN)은 리포지토리에 있는 패키지의 하위 집합에 대한 읽기 액세스를 허용하는 작업으로 넣을 수 없습니다. 지정된 보안 주체는 리포지토리의 모든 패키지를 읽을 수도 있고 아무 패키지도 읽지 않을 수 있습니다.

리포지토리에서 지정된 작업은 ReadFromRepository뿐이므로, 계정 1234567890의 사용자 및 역할은 리포지토리에서 패키지를 다운로드할 수 있습니다. 하지만 다른 작업(예: 패키지 이름 및 버전 나열)은 수행할 수 없습니다. 리포지토리에서 패키지를 다운로드하는 사용자는 다른 방법으로도 패키지와 상호 작용해야 하니, 대부분의 경우 사용자는 ReadFromRepository와 다음 정책에서 권한을 부여합니다.

{ "Version": "2012-10-17", "Statement": [ { "Action": [ "codeartifact:DescribePackageVersion", "codeartifact:DescribeRepository", "codeartifact:GetPackageVersionReadme", "codeartifact:GetRepositoryEndpoint", "codeartifact:ListPackages", "codeartifact:ListPackageVersions", "codeartifact:ListPackageVersionAssets", "codeartifact:ListPackageVersionDependencies", "codeartifact:ReadFromRepository" ], "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::123456789012:root" }, "Resource": "*" } ] }

정책 설정

정책 문서를 만든 후에는 put-repository-permissions-policy 명령을 사용하여 정책 문서를 리포지토리에 첨부합니다.

aws codeartifact put-repository-permissions-policy --domain my_domain --domain-owner 111122223333 \ --repository my_repo --policy-document file:///PATH/TO/policy.json

put-repository-permissions-policy를 호출하면 권한을 평가할 때 리포지토리의 리소스 정책이 무시됩니다. 이렇게 하면 도메인 소유자가 자기 자신을 리포지토리 외부에 고립되게 해 리소스 정책을 업데이트하지 못하는 일을 방지할 수 있습니다.

참고

호출 시 리소스 정책이 무시되므로 리소스 정책을 사용하여 저장소의 리소스 정책을 업데이트할 수 있는 권한을 다른 AWS 계정에 부여할 수 없습니다 put-repository-permissions-policy.

샘플 출력:

{ "policy": { "resourceArn": "arn:aws:codeartifact:region-id:111122223333:repository/my_domain/my_repo", "document": "{ ...policy document content...}", "revision": "MQlyyTQRASRU3HB58gBtSDHXG7Q3hvxxxxxxx=" } }

명령 결과에는 리포지토리 리소스의 Amazon 리소스 이름(ARN), 정책 문서의 전체 내용과 개정 식별자가 포함됩니다. --policy-revision 옵션을 사용하여 개정 식별자를 put-repository-permissions-policy에 전달할 수 있습니다. 이렇게 하면 문서의 알려진 개정은 덮어쓰고, 다른 작성자가 설정한 최신 버전은 덮어쓰지 않게 됩니다.

정책 읽기

get-repository-permissions-policy 명령을 사용하면 정책 문서의 기존 버전을 읽을 수 있습니다. 읽기 쉬운 출력 형식을 지정하려면 --output--query policy.document를 Python json.tool 모듈과 함께 사용하세요.

aws codeartifact get-repository-permissions-policy --domain my_domain --domain-owner 111122223333 \ --repository my_repo --output text --query policy.document | python -m json.tool

샘플 출력:

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::123456789012:root" }, "Action": [ "codeartifact:DescribePackageVersion", "codeartifact:DescribeRepository", "codeartifact:GetPackageVersionReadme", "codeartifact:GetRepositoryEndpoint", "codeartifact:ListPackages", "codeartifact:ListPackageVersions", "codeartifact:ListPackageVersionAssets", "codeartifact:ListPackageVersionDependencies", "codeartifact:ReadFromRepository" ], "Resource": "*" } ] }

정책 삭제

delete-repository-permissions-policy 명령을 사용하여 리포지토리에서 정책을 삭제합니다.

aws codeartifact delete-repository-permissions-policy --domain my_domain --domain-owner 111122223333 \ --repository my_repo

출력의 형식은 get-repository-permissions-policy 명령의 형식과 동일합니다.

보안 주체에게 읽기 액세스 권한 부여

계정의 루트 사용자를 정책 문서의 보안 주체로 지정하면, 계정의 모든 사용자와 역할에 액세스 권한을 부여하게 됩니다. 선택한 사용자 또는 역할에 대한 액세스를 제한하려면 정책의 Principal 섹션에서 관련 ARN을 사용하세요. 예를 들어 다음을 사용하여 계정 123456789012의 IAM 사용자 bob에게 읽기 권한을 부여할 수 있습니다.

{ "Version": "2012-10-17", "Statement": [ { "Action": [ "codeartifact:ReadFromRepository" ], "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::123456789012:user/bob" }, "Resource": "*" } ] }

패키지에 쓰기 액세스 권한 부여

codeartifact:PublishPackageVersion 작업은 패키지의 새 버전을 게시할 권한을 제어하는 용도로 사용합니다. 이 작업에 사용하는 리소스는 반드시 패키지여야 합니다. CodeArtifact 패키지 ARN의 형식은 다음과 같습니다.

arn:aws:codeartifact:region-id:111122223333:package/my_domain/my_repo/package-format/package-namespace/package-name

다음 예제에서는 도메인 my_domainmy_repo 리포지토리에 있는, 범위가 @parity고 이름이 ui인 npm 패키지의 ARN을 확인할 수 있습니다.

arn:aws:codeartifact:region-id:111122223333:package/my_domain/my_repo/npm/parity/ui

범위가 없는 npm 패키지의 ARN은 네임스페이스 필드에 빈 문자열이 있습니다. 예를 들어 my_domain 도메인의 my_repo 리포지토리에 있는, 범위가 없고 이름이 react인 패키지의 ARN은 다음과 같습니다.

arn:aws:codeartifact:region-id:111122223333:package/my_domain/my_repo/npm//react

다음 정책은 my_repo 리포지토리에 @parity/ui의 버전을 게시할 수 있는 123456789012 권한을 계정에 부여합니다.

{ "Version": "2012-10-17", "Statement": [ { "Action": [ "codeartifact:PublishPackageVersion" ], "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::123456789012:root" }, "Resource": "arn:aws:codeartifact:region-id:111122223333:package/my_domain/my_repo/npm/parity/ui" } ] }
중요

Maven 및 NuGet 패키지 버전을 게시할 수 있는 권한을 부여하려면 에 추가로 다음 권한을 추가하십시오. codeartifact:PublishPackageVersion

  1. NuGet: codeartifact:ReadFromRepository 및 리포지토리 리소스를 지정하십시오.

  2. Maven: codeartifact:PutPackageMetadata

이 정책은 도메인과 리포지토리를 리소스의 일부로 지정하기 때문에, 해당 리포지토리에 연결된 경우에만 게시를 허용합니다.

리포지토리에 대한 쓰기 액세스 권한 부여

와일드카드를 사용하여 리포지토리에 있는 모든 패키지에 쓰기 권한을 부여할 수 있습니다. 예를 들어 다음 정책을 사용하면 my_repo 리포지토리에 있는 모든 패키지에 대한 쓰기 권한을 계정에 부여할 수 있습니다.

{ "Version": "2012-10-17", "Statement": [ { "Action": [ "codeartifact:PublishPackageVersion" ], "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::123456789012:root" }, "Resource": "arn:aws:codeartifact:region-id:111122223333:package/my_domain/my_repo/*" } ] }

리포지토리와 도메인 정책 간의 상호 작용

CodeArtifact 도메인과 리포지토리의 리소스 정책을 지원합니다. 리소스 정책은 선택 사항입니다. 각 도메인에는 하나의 정책이 있을 수 있으며 도메인의 각 저장소에는 자체 저장소 정책이 있을 수 있습니다. 도메인 정책과 리포지토리 정책이 모두 있는 경우 CodeArtifact 리포지토리에 대한 요청의 허용 여부를 결정할 때 둘 다 평가됩니다. 도메인 및 리포지토리 정책은 다음 규칙을 사용하여 평가됩니다.

  • 또는 같은 ListDomains계정 수준 작업을 수행할 때는 리소스 정책이 평가되지 않습니다. ListRepositories

  • 또는 같은 도메인 수준 작업을 수행할 때는 저장소 정책이 평가되지 않습니다. DescribeDomainListRepositoriesInDomain

  • 수행 시 도메인 정책은 평가되지 않습니다. PutDomainPermissionsPolicy 이 규칙은 록아웃을 방지한다는 점에 유의하십시오.

  • 도메인 정책은 수행 시 PutRepositoryPermissionsPolicy평가되지만 리포지토리 정책은 평가되지 않습니다.

  • 모든 정책의 명시적 거부는 다른 정책의 허용보다 우선합니다.

  • 명시적 허용은 한 리소스 정책에만 필요합니다. 도메인 정책에서 해당 작업을 허용하는 경우 저장소 정책에서 작업을 생략해도 암시적 거부가 발생하지 않습니다.

  • 작업을 허용하는 리소스 정책이 없는 경우 호출 주체의 계정이 도메인 소유자 또는 저장소 관리자 계정이고 ID 기반 정책에서 해당 작업을 허용하지 않는 한 암시적 거부가 됩니다.

리포지토리에 액세스하는 데 사용되는 발신자 계정이 도메인 소유자 및 저장소 관리자 계정과 동일한 단일 계정 시나리오에서 액세스 권한을 부여하는 데 리소스 정책을 사용하는 경우 리소스 정책은 선택 사항입니다. 호출자의 계정이 도메인 소유자 또는 저장소 관리자 계정과 동일하지 않은 계정 간 시나리오에서 액세스를 허용하려면 리소스 정책이 필요합니다. 계정 간 액세스는 IAM 사용 설명서의 교차 계정 요청 허용 여부 결정에 설명된 대로 교차 계정 액세스에 대한 일반 IAM 규칙을 CodeArtifact 따릅니다.

  • 도메인 소유자 계정의 보안 주체는 자격 증명 기반 정책을 통해 도메인의 모든 저장소에 대한 액세스 권한을 부여받을 수 있습니다. 이 경우에는 도메인이나 리포지토리 정책에 명시적인 허용이 필요하지 않습니다.

  • 도메인 소유자 계정의 보안 주체는 도메인 또는 저장소 정책을 통해 모든 저장소에 대한 액세스 권한을 부여받을 수 있습니다. 이 경우 ID 기반 정책에서는 명시적인 허용이 필요하지 않습니다.

  • 리포지토리 관리자 계정의 주도자에게 ID 기반 정책을 통해 리포지토리에 대한 액세스 권한을 부여받을 수 있습니다. 이 경우에는 도메인이나 리포지토리 정책에 명시적인 허용이 필요하지 않습니다.

  • 다른 계정의 보안 주체에게는 하나 이상의 리소스 정책과 하나 이상의 ID 기반 정책에서 허용하는 경우에만 액세스 권한이 부여되며, 해당 작업을 명시적으로 거부하는 정책은 없습니다.