客户管理型策略示例 - Amazon CodeCommit
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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

客户管理型策略示例

此外,您还可以创建您自己的自定义 IAM policy,以向 CodeCommit 操作和资源授予相关权限。您可以将这些自定义策略附加到需要这些权限的 IAM 用户或组。您还可以创建自己的自定义 IAM policy,以便集成 CodeCommit 和其他 Amazon 服务。

客户管理型身份策略示例

以下 IAM policy 示例为各种 CodeCommit 操作授予权限。使用它们来限制 IAM 用户和角色对 CodeCommit 的访问。这些策略控制使用 CodeCommit 控制台、API、Amazon 软件开发工具包或 Amazon CLI 执行操作的能力。

注意

所有示例都使用 美国西部(俄勒冈)区域 (us-west-2) 和虚构的账户 ID。

示例

示例 1:允许用户在单个 Amazon Web Services 区域中执行 CodeCommit 操作

以下权限策略使用通配符 ("codecommit:*") 以允许用户在 us-east-2 区域中(而不是在其他 Amazon Web Services 区域中)执行所有 CodeCommit 操作。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "codecommit:*", "Resource": "arn:aws:codecommit:us-east-2:111111111111:*", "Condition": { "StringEquals": { "aws:RequestedRegion": "us-east-2" } } }, { "Effect": "Allow", "Action": "codecommit:ListRepositories", "Resource": "*", "Condition": { "StringEquals": { "aws:RequestedRegion": "us-east-2" } } } ] }

示例 2:允许用户对单个存储库使用 Git

在 CodeCommit 中,GitPull IAM policy 权限适用于从 CodeCommit 检索数据的任何 Git 客户端命令,包括 git fetchgit clone 等。同样,GitPush IAM policy 权限适用于将数据发送到 CodeCommit 的任何 Git 客户端命令。例如,如果 GitPush IAM policy 权限设置为 Allow,则用户可以使用 Git 协议推送分支删除。针对该 IAM 用户的 DeleteBranch 操作应用的任何权限都不会影响该推送。DeleteBranch 权限适用于通过控制台、Amazon CLI、软件开发工具包和 API 执行的操作,但不适用于通过 Git 协议执行的操作。

下面的示例允许指定用户对名为 MyDemoRepo 的 CodeCommit 存储库执行拉取和推送操作:

{ "Version": "2012-10-17", "Statement" : [ { "Effect" : "Allow", "Action" : [ "codecommit:GitPull", "codecommit:GitPush" ], "Resource" : "arn:aws:codecommit:us-east-2:111111111111:MyDemoRepo" } ] }

示例 3:允许从指定 IP 地址范围连接的用户访问存储库

您可以创建一个策略,仅允许 IP 地址在特定 IP 地址范围内的用户连接到 CodeCommit 存储库。可通过两种等效方法来实现此目的。一种是创建 Deny 策略,当用户 IP 地址不在特定块内时禁止 CodeCommit 操作;另一种是创建 Allow 策略,当用户 IP 地址在特定块内时允许 CodeCommit 操作。

您可以创建 Deny 策略,拒绝在特定 IP 范围之外的所有用户的访问。例如,您可以为所有需要访问存储库的用户附加 AWSCodeCommitPowerUser 托管式策略和客户管理型策略。以下示例策略拒绝向 IP 地址不在指定的 IP 地址块 203.0.113.0/16 内的用户授予所有 CodeCommit 权限:

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Deny", "Action": [ "codecommit:*" ], "Resource": "*", "Condition": { "NotIpAddress": { "aws:SourceIp": [ "203.0.113.0/16" ] } } } ] }

下面的示例策略允许指定用户访问名为 MyDemoRepo 的 CodeCommit 存储库,只有当他们的 IP 地址位于指定的地址块 203.0.113.0/16 内时,才具有与 AWSCodeCommitPowerUser 托管式策略同等的权限:

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "codecommit:BatchGetRepositories", "codecommit:CreateBranch", "codecommit:CreateRepository", "codecommit:Get*", "codecommit:GitPull", "codecommit:GitPush", "codecommit:List*", "codecommit:Put*", "codecommit:Post*", "codecommit:Merge*", "codecommit:TagResource", "codecommit:Test*", "codecommit:UntagResource", "codecommit:Update*" ], "Resource": "arn:aws:codecommit:us-east-2:111111111111:MyDemoRepo", "Condition": { "IpAddress": { "aws:SourceIp": [ "203.0.113.0/16" ] } } } ] }

示例 4:拒绝或允许对分支执行操作

您可以创建一条策略,拒绝用户在一个或多个分支上执行指定操作的权限。或者,您可以创建一条策略,允许在一个或多个分支上执行某些操作,但在该存储库的其他分支上则不允许执行这些操作。这些策略可与相应的托管 (预定义) 策略结合使用。有关更多信息,请参阅在 Amazon CodeCommit 中限制针对分支的推送和合并

例如,您可以创建一个 Deny 策略,拒绝用户更改名为 MyDemoRepo 的存储库中名为 main 的分支,包括删除该分支。您可以将此策略与 AWSCodeCommitPowerUser 托管式策略一起使用。应用了这两个策略的用户可以创建和删除分支、创建拉取请求,还可以执行 AWSCodeCommitPowerUser 允许的所有其他操作,但不能将更改推送到名为 main 的分支、不能在 CodeCommit 控制台中添加或编辑 main 分支中的文件,也不能将分支或拉取请求合并到 main 分支。由于 Deny 应用于 GitPush,您必须在该策略中包含 Null 语句,当用户从本地存储库进行推送时,分析初始 GitPush 调用是否有效。

提示

如果您希望创建一个策略,应用于您的 Amazon Web Services 账户的所有存储库中名为 main 的所有分支,对于 Resource,请指定星号 (*) 而不是存储库 ARN。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Deny", "Action": [ "codecommit:GitPush", "codecommit:DeleteBranch", "codecommit:PutFile", "codecommit:Merge*" ], "Resource": "arn:aws:codecommit:us-east-2:111111111111:MyDemoRepo", "Condition": { "StringEqualsIfExists": { "codecommit:References": [ "refs/heads/main" ] }, "Null": { "codecommit:References": "false" } } } ] }

以下示例策略允许用户对 Amazon Web Services 账户的所有存储库中名为 main 的分支进行更改。它不允许更改任何其他分支。可以将此策略与 AWSCodeCommitReadOnly 托管式策略结合使用,以允许自动推送到 main 分支中的存储库。由于效果为 Allow,所以此示例策略无法与 AWSCodeCommitPowerUser 这样的托管式策略结合使用。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "codecommit:GitPush", "codecommit:Merge*" ], "Resource": "*", "Condition": { "StringEqualsIfExists": { "codecommit:References": [ "refs/heads/main" ] } } } ] }

示例 5:使用标签拒绝或允许对存储库执行操作

您可以根据与存储库相关联的 Amazon 标签创建允许或拒绝对存储库执行操作的策略,然后将这些策略应用到您为管理 IAM 用户而配置的 IAM 组。例如,您可以创建一个策略,拒绝对 Amazon 标签键为 Status 且键值为 Secret 的任何存储库执行所有 CodeCommit 操作,然后将该策略应用到您为普通开发人员创建的 IAM 组(开发人员)。然后,您需要确保在标记的存储库上工作的开发人员不是一般开发人员组的成员,而是属于另一个没有应用限制性策略的 IAM 组 (SecretDevelopers)。

以下示例拒绝对用键 Status 和键值 Secret 标记的存储库执行所有 CodeCommit 操作:

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Deny", "Action": [ "codecommit:Associate*", "codecommit:Batch*", "codecommit:CancelUploadArchive", "codecommit:CreateBranch", "codecommit:CreateCommit", "codecommit:CreatePullRequest*", "codecommit:CreateRepository", "codecommit:CreateUnreferencedMergeCommit", "codecommit:DeleteBranch", "codecommit:DeleteCommentContent", "codecommit:DeleteFile", "codecommit:DeletePullRequest*", "codecommit:DeleteRepository", "codecommit:Describe*", "codecommit:DisassociateApprovalRuleTemplateFromRepository", "codecommit:EvaluatePullRequestApprovalRules", "codecommit:GetBlob", "codecommit:GetBranch", "codecommit:GetComment*", "codecommit:GetCommit", "codecommit:GetDifferences*", "codecommit:GetFile", "codecommit:GetFolder", "codecommit:GetMerge*", "codecommit:GetObjectIdentifier", "codecommit:GetPullRequest*", "codecommit:GetReferences", "codecommit:GetRepository*", "codecommit:GetTree", "codecommit:GetUploadArchiveStatus", "codecommit:Git*", "codecommit:ListAssociatedApprovalRuleTemplatesForRepository", "codecommit:ListBranches", "codecommit:ListPullRequests", "codecommit:ListTagsForResource", "codecommit:Merge*", "codecommit:OverridePullRequestApprovalRules", "codecommit:Post*", "codecommit:Put*", "codecommit:TagResource", "codecommit:TestRepositoryTriggers", "codecommit:UntagResource", "codecommit:UpdateComment", "codecommit:UpdateDefaultBranch", "codecommit:UpdatePullRequest*", "codecommit:UpdateRepository*", "codecommit:UploadArchive" ], "Resource": "*", "Condition": { "StringEquals": { "aws:ResourceTag/Status": "Secret" } } } ] }

您可以通过指定特定存储库(而不是所有存储库)作为资源以进一步优化该策略。您还可以创建策略,允许对未使用特定标签标记的所有存储库执行 CodeCommit 操作。例如,以下策略允许对 CodeCommit 的操作使用等同于 AWSCodeCommitPowerUser 的权限,但只允许对未使用指定标签标记的存储库执行 CodeCommit 操作:

注意

此策略示例仅包括对 CodeCommit 的操作。它不包括对 AWSCodeCommitPowerUser 托管式策略中包含的其他 Amazon 服务的操作。有关更多信息,请参阅Amazon 托管式策略:AWSCodeCommitPowerUser

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "codecommit:Associate*", "codecommit:Batch*", "codecommit:CancelUploadArchive", "codecommit:CreateBranch", "codecommit:CreateCommit", "codecommit:CreatePullRequest*", "codecommit:CreateRepository", "codecommit:CreateUnreferencedMergeCommit", "codecommit:DeleteBranch", "codecommit:DeleteCommentContent", "codecommit:DeleteFile", "codecommit:DeletePullRequest*", "codecommit:Describe*", "codecommit:DisassociateApprovalRuleTemplateFromRepository", "codecommit:EvaluatePullRequestApprovalRules", "codecommit:GetBlob", "codecommit:GetBranch", "codecommit:GetComment*", "codecommit:GetCommit", "codecommit:GetDifferences*", "codecommit:GetFile", "codecommit:GetFolder", "codecommit:GetMerge*", "codecommit:GetObjectIdentifier", "codecommit:GetPullRequest*", "codecommit:GetReferences", "codecommit:GetRepository*", "codecommit:GetTree", "codecommit:GetUploadArchiveStatus", "codecommit:Git*", "codecommit:ListAssociatedApprovalRuleTemplatesForRepository", "codecommit:ListBranches", "codecommit:ListPullRequests", "codecommit:ListTagsForResource", "codecommit:Merge*", "codecommit:OverridePullRequestApprovalRules", "codecommit:Post*", "codecommit:Put*", "codecommit:TagResource", "codecommit:TestRepositoryTriggers", "codecommit:UntagResource", "codecommit:UpdateComment", "codecommit:UpdateDefaultBranch", "codecommit:UpdatePullRequest*", "codecommit:UpdateRepository*", "codecommit:UploadArchive" ], "Resource": "*", "Condition": { "StringNotEquals": { "aws:ResourceTag/Status": "Secret", "aws:ResourceTag/Team": "Saanvi" } } }, { "Effect": "Allow", "Action": [ "codecommit:CreateApprovalRuleTemplate", "codecommit:GetApprovalRuleTemplate", "codecommit:ListApprovalRuleTemplates", "codecommit:ListRepositories", "codecommit:ListRepositoriesForApprovalRuleTemplate", "codecommit:UpdateApprovalRuleTemplateContent", "codecommit:UpdateApprovalRuleTemplateDescription", "codecommit:UpdateApprovalRuleTemplateName" ], "Resource": "*" } ] }

客户管理型集成策略示例

本节提供客户管理型用户策略示例,它们为 CodeCommit 和其他 Amazon 服务之间的集成授予权限。有关允许对 CodeCommit 存储库进行跨账户存取的特定策略示例,请参阅使用角色配置对 Amazon CodeCommit 存储库的跨账户访问

注意

所有示例在需要 Amazon Web Services 区域 时都使用美国西部(俄勒冈州)区域 (us-west-2),并包含一个虚构的账户 ID。

示例

示例 1:创建允许对 Amazon SNS 主题进行跨账户存取的策略

您可以配置 CodeCommit 存储库,以便代码推送或其他事件触发操作,例如从 Amazon Simple Notification Service (Amazon SNS) 发送通知。如果使用用于创建 CodeCommit 存储库的同一账户创建 Amazon SNS 主题,则无需配置其他 IAM policy 或权限。您可以创建主题,然后为存储库创建触发器。有关更多信息,请参阅为 Amazon SNS 主题创建触发器

但是,如果要将触发器配置为使用另一个 Amazon Web Services 账户中的 Amazon SNS 主题,则必须先用允许 CodeCommit 发布到该主题的策略配置该主题。从另一账户打开 Amazon SNS 控制台,从列表中选择主题,然后在其他主题操作中选择编辑主题策略。在高级选项卡上,修改该主题的策略,以允许 CodeCommit 向该主题发布内容。例如,如果策略是默认策略,则应按如下方式修改策略,更改红色斜体文本中的项目,使其与存储库、Amazon SNS 主题和账户的值相匹配:

{ "Version": "2008-10-17", "Id": "__default_policy_ID", "Statement": [ { "Sid": "__default_statement_ID", "Effect": "Allow", "Principal": { "AWS": "*" }, "Action": [ "sns:Subscribe", "sns:ListSubscriptionsByTopic", "sns:DeleteTopic", "sns:GetTopicAttributes", "sns:Publish", "sns:RemovePermission", "sns:AddPermission", "sns:SetTopicAttributes" ], "Resource": "arn:aws:sns:us-east-2:111111111111:NotMySNSTopic", "Condition": { "StringEquals": { "AWS:SourceOwner": "111111111111" } } }, { "Sid": "CodeCommit-Policy_ID", "Effect": "Allow", "Principal": { "Service": "codecommit.amazonaws.com" }, "Action": "sns:Publish", "Resource": "arn:aws:sns:us-east-2:111111111111:NotMySNSTopic", "Condition": { "StringEquals": { "AWS:SourceArn": "arn:aws:codecommit:us-east-2:111111111111:MyDemoRepo", "AWS:SourceAccount": "111111111111" } } } ] }

示例 2:创建 Amazon Simple Notification Service (Amazon SNS) 主题策略,允许 Amazon CloudWatch Events 向主题发布 CodeCommit 事件

您可以将 CloudWatch Events 配置为在事件(包括 CodeCommit 事件)发生时发布到 Amazon SNS 主题。为此,您必须确保 CloudWatch Events 拥有向 Amazon SNS 主题发布事件的权限,方法是为主题创建策略或修改主题的现有策略,如下所示:

{ "Version": "2008-10-17", "Id": "__default_policy_ID", "Statement": [ { "Sid": "__default_statement_ID", "Effect": "Allow", "Principal": { "AWS": "*" }, "Action": "sns:Publish", "Resource": "arn:aws:sns:us-east-2:123456789012:MyTopic", "Condition": { "StringEquals": { "AWS:SourceOwner": "123456789012" } } }, { "Sid": "Allow_Publish_Events", "Effect": "Allow", "Principal": { "Service": "events.amazonaws.com" }, "Action": "sns:Publish", "Resource": "arn:aws:sns:us-east-2:123456789012:MyTopic" } ] }

有关 CodeCommit 和 CloudWatch Events 的更多信息,请参阅来自受支持服务的 CloudWatch Events 事件示例。有关 IAM 和策略语言的更多信息,请参阅 IAM JSON 策略语言的语法

示例 3:为 Amazon Lambda 与 CodeCommit 触发器的集成创建策略

您可以对 CodeCommit 存储库进行配置,以使代码推送或其他事件能够触发操作,例如调用 Amazon Lambda 中的函数。有关更多信息,请参阅为 Lambda 函数创建触发器。此信息特定于触发器而不是 CloudWatch Events。

如果您希望触发器直接运行 Lambda 函数(而不是使用 Amazon SNS 主题来调用 Lambda 函数),并且不在 Lambda 控制台中配置触发器,则必须在函数的基于资源的策略中包含类似下面的语句:

{ "Statement":{ "StatementId":"Id-1", "Action":"lambda:InvokeFunction", "Principal":"codecommit.amazonaws.com", "SourceArn":"arn:aws:codecommit:us-east-2:111111111111:MyDemoRepo", "SourceAccount":"111111111111" } }

手动配置调用 Lambda 函数的 CodeCommit 触发器时,还必须使用 Lambda AddPermission 命令授予 CodeCommit 调用函数的权限。有关示例,请参阅为现有的 Lambda 函数创建触发器 CodeCommit 允许运行 Lambda 函数部分。

有关 Lambda 函数资源策略的更多信息,请参阅《Amazon Lambda 开发人员指南》中的 AddPermission拉取/推送事件模型