在 Amazon CodeCommit 中限制针对分支的推送和合并 - Amazon CodeCommit
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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

在 Amazon CodeCommit 中限制针对分支的推送和合并

默认情况下,任何拥有足够权限将代码推送到存储 CodeCommit 库的存储库用户都可以为该仓库中的任何分支做出贡献。无论是使用控制台、命令行或 Git,您以何种方式在存储库中添加分支情况都是如此。但是您可能希望对某一分支进行配置,只允许存储库的一些用户向该分支推送或合并代码。例如,您可能希望配置一个生产代码所用的分支,只有一部分高级开发人员才能在该分支上推送或合并更改。其他开发人员仍可从该分支拉取内容,生成他们自己的分支并创建拉取请求,但他们不能将更改推送或合并到该分支。您可以在 IAM 中创建条件策略,针对一个或多个分支使用上下文键,从而配置此访问权限。

注意

要完成本主题中的一些步骤,您必须作为管理员用户登录,该用户需拥有配置并应用 IAM 策略的足够权限。有关更多信息,请参阅创建 IAM 管理员用户和组

配置 IAM 策略以限制针对分支的推送和合并

您可以在 IAM 中创建一个策略,阻止用户更新分支,包括向分支推送提交以及将拉取请求合并到分支。为此,您的策略需使用条件语句,只在满足条件时才应用 Deny 语句的效果。Deny 语句中包含的 API 将决定不允许执行的操作。您可以将此策略配置为只应用于一个存储库中的一个分支,应用于一个存储库中的多个分支,或应用于一个 Amazon Web Services 账户的所有存储库中满足条件的所有分支。

为分支创建条件策略
  1. 登录到 Amazon Web Services Management Console,然后通过以下网址打开 IAM 控制台:https://console.aws.amazon.com/iam/

  2. 在导航窗格中,选择策略

  3. 选择创建策略

  4. 选择 JSON,然后粘贴以下示例策略。将 Resource 的值替换为存储库的 ARN,其中包含您希望限制访问权限的分支。将 codecommit:References 的值替换为您希望限制访问权限的一个或多个分支的引用。例如,该策略拒绝针对名为 main 的分支和名为 prod 的分支(位于名为 MyDemoRepo 的存储库中)推送提交、合并分支、删除分支、合并拉取请求和添加文件:

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

    Git 中的分支只是 HEAD 提交 SHA-1 值的指针 (引用),这就是条件使用 References 的原因。如果策略的效果是 Deny,而且其中一个操作是 GitPush,则 Null 语句是必需的,这是由 Git 和 git-receive-pack 将更改从本地存储库推送到 CodeCommit 的工作原理决定的。

    提示

    要创建一个策略来应用于 Amazon Web Services 账户的所有存储库中所有名为 main 的分支,请将 Resource 的值从存储库 ARN 改为星号 (*)。

  5. 选择查看策略。更正策略语句中的所有错误,然后继续创建策略

  6. JSON 经过验证后,将显示创建策略页面。摘要部分出现一条警告,告知此策略不会授予权限。这是预期行为。

    • 名称中,输入此策略的名称,例如 DenyChangesToMain

    • 描述中,输入策略用途的描述。您可以自由选择,但我们建议您这样做。

    • 选择 创建策略

将 IAM 策略应用于 IAM 组或角色

您已创建一个策略来限制针对某一分支的推送和合并,但该策略在应用于 IAM 用户、组或角色后才会生效。作为最佳实践,请考虑将该策略应用于 IAM 组或角色。将策略应用于单个 IAM 用户无法很好地扩展。

将条件策略应用于组或角色
  1. 登录 Amazon Web Services Management Console,然后使用以下网址打开 IAM 控制台:https://console.aws.amazon.com/iam/

  2. 在导航窗格中,如果您希望针对 IAM 组应用策略,请选择。如果您希望针对用户代入的角色应用策略,请选择角色。选择组或角色的名称。

  3. 权限选项卡上,选择附加策略

  4. 从策略列表中选择您创建的条件策略,然后选择附加策略

有关更多信息,请参阅附加和分离 IAM 策略

测试策略

您应测试策略针对组或角色应用的效果,确保与预期效果相同。您可以使用多种方法进行测试。例如,要测试与上述策略类似的策略,您可以:

  • 使用 IAM 用户登录 CodeCommit 控制台,该用户要么是已应用策略的 IAM 群组的成员,要么担任已应用该策略的角色。在控制台中,向受限分支添加文件。您在尝试向该分支保存或上传文件时,应看到一条错误消息。将文件添加到其他分支。这次操作应该会成功。

  • 使用 IAM 用户登录 CodeCommit 控制台,该用户要么是已应用策略的 IAM 群组的成员,要么担任已应用该策略的角色。创建将合并到受限分支的拉取请求。您应该能够创建拉取请求,但在尝试合并时会出现错误。

  • 在终端或命令行中,在适用限制的分支上创建提交,然后将该提交推送到 CodeCommit 存储库。您应该看到一条错误消息。从其他分支进行的提交和推送应该是正常的。