

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

# 리포지토리 정책
<a name="repo-policies"></a>

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

자세한 내용은 [리소스 기반 정책](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#policies_resource-based)과 [자격 증명 기반 정책 및 리소스 기반 정책](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_identity-vs-resource.html)을 참조하세요.

## 리소스 정책을 생성하여 읽기 액세스 권한 부여
<a name="creating-a-resource-policy-to-grant-read-access"></a>

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

------
#### [ JSON ]

****  

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

------

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

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

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

------
#### [ JSON ]

****  

```
{
    "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": "*"
        }
    ]
}
```

------

## 정책 설정
<a name="setting-a-policy"></a>

정책 문서를 만든 후에는 `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`를 호출하면 권한을 평가할 때 리포지토리의 리소스 정책이 무시됩니다. 이렇게 하면 도메인 소유자가 자기 자신을 리포지토리 외부에 고립되게 해 리소스 정책을 업데이트하지 못하는 일을 방지할 수 있습니다.

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

샘플 출력:

```
{
    "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`에 전달할 수 있습니다. 이렇게 하면 문서의 알려진 개정은 덮어쓰고, 다른 작성자가 설정한 최신 버전은 덮어쓰지 않게 됩니다.

## 정책 읽기
<a name="reading-a-policy"></a>

`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
```

샘플 출력:

------
#### [ JSON ]

****  

```
{
    "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": "*"
        }
    ]
}
```

------

## 정책 삭제
<a name="deleting-a-policy"></a>

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

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

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

## 보안 주체에게 읽기 액세스 권한 부여
<a name="granting-read-access-to-specific-principals"></a>

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

------
#### [ JSON ]

****  

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

------

## 패키지에 쓰기 액세스 권한 부여
<a name="granting-write-access-to-specific-packages"></a>

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

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

다음 예제에서는 도메인 `my_domain`의 `my_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` 권한을 계정에 부여합니다.

------
#### [ JSON ]

****  

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

------

**중요**  
Maven 및 NuGet 패키지 버전을 게시할 수 있는 권한을 부여하려면 `codeartifact:PublishPackageVersion`에 더해 다음 권한을 추가하세요.  
NuGet: `codeartifact:ReadFromRepository` 및 리포지토리 리소스 지정
Maven: `codeartifact:PutPackageMetadata`

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

## 리포지토리에 대한 쓰기 액세스 권한 부여
<a name="granting-write-access-to-a-repository"></a>

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

------
#### [ JSON ]

****  

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

------

## 리포지토리와 도메인 정책 간의 상호 작용
<a name="interaction-repo-domain-policies"></a>

 CodeArtifact는 도메인 및 리포지토리에 대한 리소스 정책을 지원합니다. 리소스 정책은 선택 사항입니다. 각 도메인에는 하나의 정책이 있을 수 있으며 도메인의 각 리포지토리에는 자체 리포지토리 정책이 있을 수 있습니다. 도메인 정책과 리포지토리 정책이 모두 있는 경우 CodeArtifact 리포지토리에 대한 요청이 허용 또는 거부되는지 여부를 결정할 때 둘 모두 평가됩니다. 도메인 및 리포지토리 정책은 다음 규칙을 사용하여 평가됩니다.
+ [ListDomains](https://docs.aws.amazon.com/codeartifact/latest/APIReference/API_ListDomains.html) 또는 [ListRepositories](https://docs.aws.amazon.com/codeartifact/latest/APIReference/API_ListRepositories.html)와 같은 계정 수준 작업을 수행할 때는 리소스 정책이 평가되지 않습니다.
+ [DescribeDomain](https://docs.aws.amazon.com/codeartifact/latest/APIReference/API_DescribeDomain.html) 또는 [ListRepositoriesInDomain](https://docs.aws.amazon.com/codeartifact/latest/APIReference/API_ListRepositoriesInDomain.html)과 같은 도메인 수준 작업을 수행할 때는 리포지토리 정책이 평가되지 않습니다.
+ [PutDomainPermissionsPolicy](https://docs.aws.amazon.com/codeartifact/latest/APIReference/API_PutDomainPermissionsPolicy.html)를 수행할 때는 도메인 정책이 평가되지 않습니다. 이 규칙은 잠금을 방지합니다.
+ 도메인 정책은 [PutRepositoryPermissionsPolicy](https://docs.aws.amazon.com/codeartifact/latest/APIReference/API_PutRepositoryPermissionsPolicy.html)를 수행할 때 평가되지만 리포지토리 정책은 평가되지 않습니다.
+ 정책의 명시적 거부는 다른 정책의 허용을 무시합니다.
+ 명시적 허용은 하나의 리소스 정책에서만 필요합니다. 리포지토리 정책에서 작업을 생략해도 도메인 정책에서 작업을 허용하는 경우 암시적 거부가 발생하지 않습니다.
+ 작업을 허용하는 리소스 정책이 없는 경우 직접 호출하는 보안 주체의 계정이 도메인 소유자 또는 리포지토리 관리자 계정이고 자격 증명 기반 정책이 작업을 허용하지 않는 한 결과는 암시적 거부입니다.

 리소스 정책은 리포지토리에 액세스하는 데 사용되는 호출자 계정이 도메인 소유자 및 리포지토리 관리자 계정과 동일한 단일 계정 시나리오에서 액세스 권한을 부여하는 데 사용되는 경우 선택 사항입니다. 호출자의 계정이 도메인 소유자 또는 리포지토리 관리자 계정과 동일하지 않은 교차 계정 시나리오에서 액세스 권한을 부여하려면 리소스 정책이 필요합니다. CodeArtifact의 교차 계정 액세스는 *IAM 사용 설명서*의 [교차 계정 요청 허용 여부 결정](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_evaluation-logic-cross-account.html#policy-eval-cross-account)에 설명된 교차 계정 액세스에 대한 일반 IAM 규칙을 따릅니다.
+ 도메인 소유자 계정의 보안 주체에게는 자격 증명 기반 정책을 통해 도메인의 모든 리포지토리에 대한 액세스 권한이 부여될 수 있습니다. 이 경우 도메인 또는 리포지토리 정책에는 명시적인 허용이 필요하지 않습니다.
+ 도메인 소유자 계정의 보안 주체에게는 도메인 또는 리포지토리 정책을 통해 모든 리포지토리에 대한 액세스 권한이 부여될 수 있습니다. 이 경우 자격 증명 기반 정책에는 명시적인 허용이 필요하지 않습니다.
+ 리포지토리 관리자 계정의 보안 주체에게는 자격 증명 기반 정책을 통해 리포지토리에 대한 액세스 권한이 부여될 수 있습니다. 이 경우 도메인 또는 리포지토리 정책에는 명시적인 허용이 필요하지 않습니다.
+ 다른 계정의 보안 주체는 작업을 명시적으로 거부하는 정책 없이 하나 이상의 리소스 정책 및 하나 이상의 자격 증명 기반 정책에서 허용하는 경우에만 액세스 권한이 부여됩니다.