本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
域策略
CodeArtifact 支持使用基于资源的权限来控制访问权限。基于资源的权限让您可以指定能够访问资源的用户,以及这些用户可以对该资源执行的操作。默认情况下,只有拥有该域的AWS账户才能在域中创建和访问存储库。您可以将策略文档应用于某个域,以允许其他IAM委托人访问该域名。
有关更多信息,请参阅策略和权限以及基于身份的策略和基于资源的策略。
启用对域的跨账户访问
资源策略是一种JSON格式的文本文件。该文件必须指定主体 (actor)、一个或多个操作以及效果(Allow
或 Deny
)。要在由另一个账户拥有的域中创建存储库,必须向主体授予域资源的 CreateRepository
权限。
例如,以下资源策略向账户 123456789012
授予在域中创建存储库的权限。
{ "Version": "2012-10-17", "Statement": [ { "Action": [ "codeartifact:CreateRepository" ], "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::
123456789012
:root" }, "Resource": "*" } ] }
要允许创建带有标签的存储库,必须包括 codeartifact:TagResource
权限。这也将让账户可以向域及其中的所有存储库添加标签。
针对针对该域和域内所有资源的所有操作对域策略进行评估。这意味着域策略可用于将权限应用于域中的存储库和软件包。当Resource
元素设置为时*
,该语句将应用于域中的所有资源。例如,如果上述策略也包含codeartifact:DescribeRepository
在允许的IAM操作列表中,则该策略将允许调用DescribeRepository
域中的每个存储库。通过使用Resource
元素中的特定资源,可以使用域策略将权限应用于域ARNs中的特定资源。
注意
域和存储库策略都可用于配置权限。当两个策略都存在时,将对两个策略进行评估,如果任一策略允许,则允许执行操作。有关更多信息,请参阅 存储库和域策略之间的交互。
要访问另一个账户拥有的域中的程序包,必须向主体授予域资源的 GetAuthorizationToken
权限。授予权限后,域所有者可以控制哪些账户可以读取域中存储库的内容。
例如,以下资源策略向账户 123456789012
授予为域中任何存储库检索身份验证令牌的权限。
{ "Version": "2012-10-17", "Statement": [ { "Action": [ "codeartifact:GetAuthorizationToken" ], "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::
123456789012
:root" }, "Resource": "*" } ] }
注意
除了域的 GetAuthorizationToken
权限外,还必须向想要从存储库端点提取程序包的主体授予存储库资源的 ReadFromRepository
权限。同样,除了 GetAuthorizationToken
权限之外,还必须向想要将程序包发布到存储库端点的主体授予 PublishPackageVersion
权限。
有关 ReadFromRepository
和 PublishPackageVersion
权限的更多信息,请参阅存储库策略。
域策略示例
当多个账户使用一个域时,应向这些账户授予一组基本权限,让他们可以充分使用该域。以下资源策略列出了一组允许充分使用域的权限。
{ "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
您可以使用aws:PrincipalOrgID
条件密钥向组织中的所有账户授予对 CodeArtifact 域的访问权限,如下所示。
{ "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全局条件上下文密钥。
设置域策略
您可以使用 put-domain-permissions-policy
命令将策略附加到域。
aws codeartifact put-domain-permissions-policy --domain
my_domain
--domain-owner111122223333
\ --policy-documentfile://</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
。这样可以确保覆盖文档的已知修订版,而不是由另一个作者设置的较新版本。
读取域策略
要读取策略文档的现有版本,请使用 get-domain-permissions-policy
命令。要格式化输出来提高可读性,请将 --output
和 --query policy.document
与 Python json.tool
模块一起使用,如下所示。
aws codeartifact get-domain-permissions-policy --domain
my_domain
--domain-owner111122223333
\ --output text --query policy.document | python -mjson.tool
示例输出:
{ "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" } } ] }
删除域策略
使用 delete-domain-permissions-policy
命令从域中删除策略。
aws codeartifact delete-domain-permissions-policy --domain
my_domain
--domain-owner111122223333
输出的格式与 get-domain-permissions-policy
和 delete-domain-permissions-policy
命令的输出格式相同。