存储库策略 - CodeArtifact

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

存储库策略

CodeArtifact 使用基于资源的权限来控制访问权限。基于资源的权限让您可以指定能够访问存储库的用户,以及这些用户可以对该存储库执行的操作。默认情况下,只有存储库所有者有权访问存储库。您可以应用策略文档,让其他 IAM 主体可以访问您的存储库。

有关更多信息,请参阅基于资源的策略以及基于身份的策略和基于资源的策略

创建资源策略来授予读取访问权限

资源策略是 JSON 格式的文本文件。该文件必须指定主体 (actor)、一个或多个操作以及效果(AllowDeny)。例如,以下资源策略向账户 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-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。这样可以确保覆盖文档的已知修订版,而不是由另一个作者设置的较新版本。

读取策略

使用 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

示例输出:

{ "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-owner 111122223333 \ --repository my_repo

输出的格式与 get-repository-permissions-policy 命令的输出格式相同。

向主体授予读取访问权限

当您在策略文档中将账户的根用户指定为主体时,即向该账户中的所有用户和角色授予访问权限。要限制选定用户或角色的访问权限,请在策略的 Principal 部分使用他们的 ARN。例如,使用以下方法向账户 123456789012 中的 IAM 用户 bob 授予读取权限。

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

授予对程序包的写入权限

codeartifact:PublishPackageVersion 操作用于控制发布程序包新版本的权限。与此操作一起使用的资源必须是程序包。 CodeArtifact 软件包 ARN 的格式如下所示。

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

以下示例显示了域 my_domainmy_repo 存储库中作用域为 @parity 且名称为 ui 的 npm 程序包的 ARN。

arn:aws:codeartifact:region-id:111122223333:package/my_domain/my_repo/npm/parity/ui

如果一个 npm 程序包没有作用域,那么它的 ARN 的命名空间字段为空字符串。以下示例显示了域 my_domainmy_repo 存储库中没有作用域且名称为 react 的程序包的 ARN。

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

  1. NuGet: codeartifact:ReadFromRepository 并指定存储库资源

  2. 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 规则,如 IA M 用户指南中确定是否允许跨账户请求中所述。

  • 通过基于身份的策略,可以向域所有者账户中的委托人授予对域中任何存储库的访问权限。请注意,在这种情况下,不需要在域或存储库策略中明确允许。

  • 可以通过域或存储库策略向域所有者账户中的委托人授予访问任何存储库的权限。请注意,在这种情况下,基于身份的策略不需要明确允许。

  • 可以通过基于身份的策略向存储库管理员帐户中的委托人授予对存储库的访问权限。请注意,在这种情况下,不需要在域或存储库策略中明确允许。

  • 只有在至少一个资源策略和至少一个基于身份的策略允许的情况下,另一个账户的委托人才能获得访问权限,并且没有任何策略明确拒绝该操作。