本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
存储库策略
CodeArtifact 使用基于资源的权限来控制访问权限。基于资源的权限让您可以指定能够访问存储库的用户,以及这些用户可以对该存储库执行的操作。默认情况下,只有存储库所有者有权访问存储库。您可以应用允许其他IAM委托人访问您的存储库的策略文档。
有关更多信息,请参阅基于资源的策略以及基于身份的策略和基于资源的策略。
创建资源策略来授予读取访问权限
资源策略是一种JSON格式的文本文件。该文件必须指定主体 (actor)、一个或多个操作以及效果(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
操作只能在存储库资源上使用。您不能将包的 Amazon 资源名称 (ARN) 作为资源,codeartifact:ReadFromRepository
作为允许对存储库中包子集进行读取权限的操作。给定的主体可以读取存储库中的所有程序包,也可以不读取任何程序包。
由于存储库中指定的唯一操作是 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-owner111122223333
\ --repositorymy_repo
--policy-documentfile:///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-owner111122223333
\ --repositorymy_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-owner111122223333
\ --repositorymy_repo
输出的格式与 get-repository-permissions-policy
命令的输出格式相同。
向主体授予读取访问权限
当您在策略文档中将账户的根用户指定为主体时,即向该账户中的所有用户和角色授予访问权限。要限制对选定用户或角色的访问权限,请在策略Principal
部分使用他们ARN。例如,使用以下命令向账户bob
中的IAM用户授予读取权限123456789012
。
{ "Version": "2012-10-17", "Statement": [ { "Action": [ "codeartifact:ReadFromRepository" ], "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::
123456789012
:user/bob
" }, "Resource": "*" } ] }
授予对程序包的写入权限
codeartifact:PublishPackageVersion
操作用于控制发布程序包新版本的权限。与此操作一起使用的资源必须是程序包。 CodeArtifact 包的格式ARNs如下。
arn:aws:codeartifact:
region-id
:111122223333
:package/my_domain
/my_repo
/package-format
/package-namespace
/package-name
以下示例显示了ARN域中my_repo
存储库ui
中具有作用域@parity
my_domain
和名称的 npm 包。
arn:aws:codeartifact:
region-id
:111122223333
:package/my_domain
/my_repo
/npm
/parity
/ui
ARN对于没有作用域的 npm 包,命名空间字段的字符串为空。例如,以下内容ARN适用于没有作用域且名称react
位于域my_repo
存储库中的软件包my_domain
。
arn:aws:codeartifact:
region-id
:111122223333
:package/my_domain
/my_repo
/npm
//react
以下策略向账户 123456789012
授予在 my_repo
存储库中发布 @parity/ui
版本的权限。
{ "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
NuGet:
codeartifact:ReadFromRepository
并指定存储库资源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
-
在执行域级操作(例如DescribeDomain或)时,不会评估任何存储库策略。ListRepositoriesInDomain
-
执行时不会对域策略进行评估PutDomainPermissionsPolicy。请注意,此规则可防止锁定。
-
执行时会评估域策略 PutRepositoryPermissionsPolicy,但不评估存储库策略。
-
任何策略中的明确拒绝都会优先于其他策略中的允许。
-
仅在一个资源策略中需要明确允许。如果域策略允许该操作,则从存储库策略中省略操作不会导致隐式拒绝。
-
如果没有资源策略允许某项操作,则结果为隐式拒绝,除非调用方委托人的账户是域所有者或存储库管理员账户,并且基于身份的策略允许该操作。
在单一账户场景中用于授予访问权限时,资源策略是可选的,在这种情况下,用于访问存储库的调用者帐户与域所有者和仓库管理员帐户相同。在跨账户场景中,调用者的账户与域名所有者或仓库管理员账户不同,需要使用资源策略来授予访问权限。中的跨账户访问 CodeArtifact 遵循跨账户访问的一般IAM规则,如用户指南中确定是否允许跨账户请求中所述。IAM
-
通过基于身份的策略,可以向域所有者账户中的委托人授予对域中任何存储库的访问权限。请注意,在这种情况下,不需要在域或存储库策略中明确允许。
-
可以通过域或存储库策略向域所有者账户中的委托人授予访问任何存储库的权限。请注意,在这种情况下,基于身份的策略不需要明确允许。
-
可以通过基于身份的策略向存储库管理员帐户中的委托人授予对存储库的访问权限。请注意,在这种情况下,不需要在域或存储库策略中明确允许。
-
只有在至少一个资源策略和至少一个基于身份的策略允许的情况下,另一个账户的委托人才能获得访问权限,并且没有任何策略明确拒绝该操作。