

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 存储库策略
<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 格式的文本文件。该文件必须指定主体 (actor)、一个或多个操作以及效果（`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` 操作只能在存储库资源上使用。您不能将程序包的 Amazon 资源名称 (ARN) 作为资源，将 `codeartifact:ReadFromRepository` 作为操作来允许对存储库中的程序包子集进行读取访问。给定的主体可以读取存储库中的所有程序包，也可以不读取任何程序包。

由于存储库中指定的唯一操作是 `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`，则在评估权限时会忽略存储库上的资源策略。这样可以确保域的所有者不会将自己锁定在存储库之外，因而使他们无法更新资源策略。

**注意**  
 您不能向其他 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`。这样可以确保覆盖文档的已知修订版，而不是由另一个作者设置的较新版本。

## 读取策略
<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 包的格式 ARNs 如下。

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

以下策略向账户 `123456789012` 授予在 `my_repo` 存储库中发布 `@parity/ui` 版本的权限。

------
#### [ 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 规则，如 IA *M* 用户[指南中确定是否允许跨账户请求](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_evaluation-logic-cross-account.html#policy-eval-cross-account)中所述。
+ 可以通过基于身份的策略，向域所有者账户中的主体授予访问域中任何存储库的权限。请注意，在这种情况下，域策略或存储库策略不需要显式允许。
+ 可以通过域策略或存储库策略，向域所有者账户中的主体授予访问任何存储库的权限。请注意，在这种情况下，基于身份的策略不需要显式允许。
+ 可以通过基于身份的策略，向存储库管理员账户中的主体授予访问存储库的权限。请注意，在这种情况下，域策略或存储库策略不需要显式允许。
+ 只有在至少一个资源策略和至少一个基于身份的策略允许的情况下，另一个账户中的主体才能获得访问权限，并且没有任何策略显式拒绝该操作。