

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

# 域策略
<a name="domain-policies"></a>

CodeArtifact 支持使用基于资源的权限来控制访问权限。基于资源的权限让您可以指定能够访问资源的用户，以及这些用户可以对该资源执行的操作。默认情况下，只有拥有域的 AWS 账户才能创建和访问域中的存储库。您可以对域应用策略文档，让其他 IAM 主体可以访问该域。

有关更多信息，请参阅[策略和权限](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html)以及[基于身份的策略和基于资源的策略](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_identity-vs-resource.html)。

**Topics**
+ [启用对域的跨账户访问](#enabling-cross-acount-access-to-a-domain)
+ [域策略示例](#domain-policy-example)
+ [域名策略示例 AWS Organizations](#domain-policy-example-with-aws-organizations)
+ [设置域策略](#set-domain-policy)
+ [读取域策略](#reading-a-domain-policy)
+ [删除域策略](#deleting-a-domain-policy)

## 启用对域的跨账户访问
<a name="enabling-cross-acount-access-to-a-domain"></a>

资源策略是 JSON 格式的文本文件。该文件必须指定主体 (actor)、一个或多个操作以及效果（`Allow` 或 `Deny`）。要在由另一个账户拥有的域中创建存储库，必须向主体授予*域*资源的 `CreateRepository` 权限。

例如，以下资源策略向账户 `123456789012` 授予在域中创建存储库的权限。

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

****  

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

------

要允许创建带有标签的存储库，必须包括 `codeartifact:TagResource` 权限。这也将让账户可以向域及其中的所有存储库添加标签。

对域策略进行评估，以了解针对域和域内所有资源执行的各项操作的情况。这意味着域策略可用于将权限应用于域中的存储库和程序包。当 `Resource` 元素设置为 `*` 时，该语句将应用于域中的所有资源。例如，如果上述策略也在允许的 IAM 操作列表中包含 `codeartifact:DescribeRepository`，则该策略将允许对域中的每个存储库调用 `DescribeRepository`。通过使用`Resource`元素中的特定资源，可以使用域策略将权限应用于域 ARNs 中的特定资源。

**注意**  
域策略和存储库策略均可用于配置权限。当这两个策略均存在时，将对两者进行评估，如果任一策略允许，则允许执行操作。有关更多信息，请参阅 [存储库策略与域策略之间的交互](repo-policies.md#interaction-repo-domain-policies)。

要访问另一个账户拥有的域中的程序包，必须向主体授予*域资源*的 `GetAuthorizationToken` 权限。授予权限后，域所有者可以控制哪些账户可以读取域中存储库的内容。

例如，以下资源策略向账户 `123456789012` 授予为域中任何存储库检索身份验证令牌的权限。

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

****  

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

------

**注意**  
除了域的 `GetAuthorizationToken` 权限外，还必须向想要从存储库端点提取程序包的主体授予存储库资源的 `ReadFromRepository` 权限。同样，除了 `GetAuthorizationToken` 权限之外，还必须向想要将程序包发布到存储库端点的主体授予 `PublishPackageVersion` 权限。  
有关 `ReadFromRepository` 和 `PublishPackageVersion` 权限的更多信息，请参阅[存储库策略](repo-policies.md)。

## 域策略示例
<a name="domain-policy-example"></a>

当多个账户使用一个域时，应向这些账户授予一组基本权限，让他们可以充分使用该域。以下资源策略列出了一组允许充分使用域的权限。

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "BasicDomainPolicy",
            "Action": [
                "codeartifact:GetDomainPermissionsPolicy",
                "codeartifact:ListRepositoriesInDomain",
                "codeartifact:GetAuthorizationToken",
                "codeartifact:DescribeDomain",
                "codeartifact:CreateRepository"
            ],
            "Effect": "Allow",
            "Resource": "*",
            "Principal": {
                "AWS": "arn:aws:iam::123456789012:root"
            }
        }
    ]
}
```

------

**注意**  
如果一个域及其所有存储库归一个账户所有，并且只需要从该账户中使用，则无需创建域策略。

## 域名策略示例 AWS Organizations
<a name="domain-policy-example-with-aws-organizations"></a>

您可以使用`aws:PrincipalOrgID`条件密钥向组织中的所有账户授予对 CodeArtifact 域的访问权限，如下所示。

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": {
        "Sid": "DomainPolicyForOrganization",
        "Effect": "Allow",
        "Principal": "*",
        "Action": [
             "codeartifact:GetDomainPermissionsPolicy",
             "codeartifact:ListRepositoriesInDomain",
             "codeartifact:GetAuthorizationToken",
             "codeartifact:DescribeDomain",
             "codeartifact:CreateRepository"
        ],
        "Resource": "*",
        "Condition": {
            "StringEquals": { "aws:PrincipalOrgID":["o-xxxxxxxxxxx"]}
        }
    }
}
```

------

有关使用 `aws:PrincipalOrgID` 条件键的更多信息，请参阅**《IAM 用户指南》中的 [AWS 全局条件上下文键](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html)。

## 设置域策略
<a name="set-domain-policy"></a>

您可以使用 `put-domain-permissions-policy` 命令将策略附加到域。

```
aws codeartifact put-domain-permissions-policy --domain my_domain --domain-owner 111122223333 \
 --policy-document file://</PATH/TO/policy.json>
```

如果调用 `put-domains-permissions-policy`，则在评估权限时会忽略域中的资源策略。这样可以确保域的所有者不会将自己锁定在域之外，因而使他们无法更新资源策略。

**注意**  
 您不能向其他 AWS 账户授予使用资源策略更新域上资源策略的权限，因为调用时会忽略资源策略 put-domain-permissions-policy。

示例输出：

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

命令输出包含域资源的 Amazon 资源名称 (ARN)、策略文档的完整内容以及修订标识符。可以使用 `--policy-revision` 选项将修订标识符传递给 `put-domain-permissions-policy`。这样可以确保覆盖文档的已知修订版，而不是由另一个作者设置的较新版本。

## 读取域策略
<a name="reading-a-domain-policy"></a>

要读取策略文档的现有版本，请使用 `get-domain-permissions-policy` 命令。要格式化输出来提高可读性，请将 `--output` 和 `--query policy.document` 与 Python `json.tool` 模块一起使用，如下所示。

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

示例输出：

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "BasicDomainPolicy",
            "Action": [
                "codeartifact:GetDomainPermissionsPolicy",
                "codeartifact:ListRepositoriesInDomain",
                "codeartifact:GetAuthorizationToken",
                "codeartifact:CreateRepository"
            ],
            "Effect": "Allow",
            "Resource": "*",
            "Principal": {
                "AWS": "arn:aws:iam::111122223333:root"
            }
        }
    ]
}
```

------

## 删除域策略
<a name="deleting-a-domain-policy"></a>

使用 `delete-domain-permissions-policy` 命令从域中删除策略。

```
aws codeartifact delete-domain-permissions-policy --domain my_domain --domain-owner 111122223333
```

输出的格式与 `get-domain-permissions-policy` 和 `delete-domain-permissions-policy` 命令的输出格式相同。