客户托管式策略示例 - AWS CodeCommit

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

客户托管式策略示例

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

客户托管身份策略示例

以下示例 IAM 策略授予执行各种 CodeCommit 操作的权限。可以使用它们限制 IAM 用户和角色的 CodeCommit 访问。这些策略控制使用 CodeCommit 控制台、API、执行操作的能力。AWSSDK,或者AWS CLI.

注意

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

示例

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

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

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

下面的示例允许指定用户对名为的 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 范围之外的所有用户的访问。例如,您可以向需要访问存储库的所有用户附加 AWScodeCommit PowerUser 托管策略和客户托管策略。下面的示例策略拒绝 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" ] } } } ] }

下面的示例策略允许具有 AWSCodeCommitPowerUser 托管策略等效权限的指定用户在 IP 地址位于指定的地址块 203.0.113.0/16 内时访问名为 MyDemoRePO 的 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:拒绝或允许在分支上执行操作

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

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

提示

如果你想创建一个适用于名为的所有分支的策略主要的在您的 Amazon Web Services 账户中的所有仓库中,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,此示例策略无法与 AWSCOdeCommit PowerUser 这样的托管策略结合使用。

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

示例 5:拒绝或允许对带有标签的存储库执行

您可以创建一个使用AWS与这些存储库关联的标签,然后将这些策略应用于为管理 IAM 用户而配置的 IAM 组。例如,您可以创建一个策略,拒绝对任何存储库执行所有 CodeCommit 操作,并使用AWS标签键状态和的关键价值密钥,然后将该策略应用于您为普通开发人员创建的 IAM 组(开发人员)。然后,您需要确保使用这些带有标签的存储库的开发人员不是该常规的成员。开发人员组,而是属于未应用限制性策略的其他 IAM 组(SecretDevelopers)。

以下示例拒绝对用键标记的存储库执行所有 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 的操作。它不包含对其他操作AWS包含在AWSCodeCommitPowerUser托管策略。有关更多信息,请参阅AWS托管策略: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 和其他方面进行集成的权限。AWS服务。有关允许对 CodeCommit 存储库进行跨账户访问的特定策略示例,请参阅配置对的跨账户访问权限AWS CodeCommit存储库使用角色.

注意

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

示例

示例 1:创建允许跨账户访问 Amazon SNS 主题的策略

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

但是,如果要将触发器配置为使用其他 Amazon Web 服务账户中的 Amazon SNS 主题,则必须先为该主题配置允许 CodeCommit 向该主题发布内容的策略。从其他账户打开 Amazon SNS 控制台,从列表中选择该主题,然后对于其他主题操作,选择编辑主题策略. 在存储库的Advanced选项卡中,修改该主题的策略,以允许 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 事件有权将事件发布到您的 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 Events 事件示例. 有关 IAM 和策略语言的更多信息,请参阅IAM JSON 策略语言的语法.

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

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

如果您需要让触发器直接运行 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 触发器时,您还必须使用 LambdaAddPermission命令授予 CodeCommit 调用函数的权限。有关示例,请参阅为现有 Lambda 函数创建触发器Teast CodeCommit 运行 Lambda 函数部分。

有关 Lambda 函数的资源策略的更多信息,请参阅。AddPermission拉/推活动模型中的AWS Lambda开发人员指南.