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

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

客户管理型策略示例

您可以创建自己的自定义 IAM 策略以授予 CodeCommit 操作和资源的权限。您可以将这些自定义策略附加到需要这些权限的 IAM 用户或组。您还可以创建自己的自定义 IAM 策略,以便在与其他 Amazon 服务 CodeCommit 之间进行集成。

客户管理型身份策略示例

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

注意

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

示例

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

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

{ "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,GitPullIAM 策略权限适用于从中检索数据的任何 Git 客户端命令,包括 CodeCommitgit fetchgit clone、等。同样,GitPushIAM 策略权限适用于向其发送数据的任何 Git 客户端命令 CodeCommit。例如,如果 GitPush IAM policy 权限设置为 Allow,则用户可以使用 Git 协议推送分支删除。针对该 IAM 用户的 DeleteBranch 操作应用的任何权限都不会影响该推送。该DeleteBranch权限适用于使用控制台、软件开发工具包和 API 执行的操作,但不适用于使用 Git 协议执行的操作。 Amazon CLI

以下示例允许指定用户从名为的存储库中提取和推送到该 CodeCommit 存储库MyDemoRepo

{ "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" ] } } } ] }

以下示例策略仅允许指定用户的 IP 地址在指定的地址块 203.0.113.0/16 内时访问 MyDemoRepo 具有 AWSCodeCommitPowerUser 托管策略等效权限的 CodeCommit存储库:

{ "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策略,拒绝用户在名为的存储库中对名为 main 的分支进行更改,包括删除该分支MyDemoRepo。您可以将此策略与AWSCodeCommitPowerUser托管策略一起使用。应用了这两个策略的用户将能够创建和删除分支、创建拉取请求以及允许的所有其他操作 AWSCodeCommitPowerUser,但他们无法将更改推送到名为 main 的分支,也无法在 CodeCommit 控制台的主分支中添加或编辑文件,也无法将分支或拉取请求合并到分支中。由于 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 托管策略一起使用,以允许自动推送到主分支中的存储库。由于效果是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 标签密钥为 Stat us 且钥值为 Secret 的任何存储库 CodeCommit 执行所有操作,然后将该策略应用于您为普通开发人员(开发人员)创建的 IAM 群组。然后,您需要确保在这些标记存储库上工作的开发人员不是该普通开发人员组的成员,而是属于未应用限制性策略的其他 IAM 组(SecretDevelopers)。

以下示例拒绝对标有 Stat us 密钥和密钥值为 S ecret 的存储库 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 执行操作。例如,以下策略仅允许对未使用指定标签标记的AWSCodeCommitPowerUser存储库 CodeCommit 执行操作,不同之处在于它只允许对未使用指定标签标记的存储库 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": "*" } ] }

客户管理型集成策略示例

本节提供了客户管理的用户策略示例,这些策略授予与其他 Amazon 服务 CodeCommit 之间的集成的权限。有关允许跨账户访问 CodeCommit仓库的策略的具体示例,请参阅使用角色配置对 Amazon CodeCommit 仓库的跨账户访问权限

注意

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

示例

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

您可以配置 CodeCommit 存储库,以便代码推送或其他事件触发操作,例如从亚马逊简单通知服务 (Amazon SNS) Simple Notification Service 发送通知。如果您使用与创建 CodeCommit存储库相同的账户创建 Amazon SNS 主题,则无需配置其他 IAM 策略或权限。您可以创建主题,然后为存储库创建触发器。有关更多信息,请参阅 为 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 SNS) Simple Notification 主题策略以允许 CloudWatch 亚马逊活动向该主题 CodeCommit 发布事件

您可以将 CloudWatch 事件配置为在事件(包括 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 事件的更多信息,请参阅支持的服务中的CloudWatch 事件事件示例。有关 IAM 和策略语言的更多信息,请参阅 IAM JSON 策略语言的语法

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

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

如果您希望触发器直接运行 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 函数资源策略的更多信息,请参阅AddPermission开发人员指南中的拉取/推送事件模型。Amazon Lambda