AWS Cloudformation - CodeCommit - 拒绝推送到主机

AWS Cloudformation - CodeCommit - Deny Push to Master

情况是这样的: 我有一个 Cloudformation,它创建 CodeCommit 存储库,其中包含一些额外的资源供其他 devops 进程运行。

我得到了阻止用户推送到特定分支的要求,在这种情况下,master,我找到了这样做的策略。来源:https://docs.aws.amazon.com/codecommit/latest/userguide/how-to-conditional-branch.html

所以我写了一个角色和策略如下:

Resources:
  CodeCommitRepository:
    Type: AWS::CodeCommit::Repository
    Properties:
      RepositoryName: !Sub '${ProjectCode}-${ProjectName}-${ComponentName}'
      RepositoryDescription: !Ref CodeCommitRepositoryDescription
      Tags:
        - Key: fdr:general:project-code
          Value: !Ref ProjectCode
        - Key: fdr:general:project-name
          Value: !Ref ProjectName

  DenyPushRole:
    Type: AWS::IAM::Role
    Properties:
      RoleName: !Sub '${ProjectCode}-${ProjectName}-${ComponentName}-DenyPush-Role'
      ManagedPolicyArns:
        - !Ref DenyPushToMasterPolicy
      AssumeRolePolicyDocument:
        Version: '2012-10-17'
        Statement:
        - Action:
            - sts:AssumeRole
          Effect: Allow
          Principal:
            Service:
              - codecommit.amazonaws.com

  DenyPushToMasterPolicy:
    Type: AWS::IAM::ManagedPolicy
    Properties:
      ManagedPolicyName: !Sub '${ProjectCode}-${ProjectName}-${ComponentName}-DenyPush-Policy'
      Description: Policy to deny push to master
      PolicyDocument:
        Version: 2012-10-17
        Statement:
        - Action:
          - codecommit:GitPush
          - codecommit:PutFile
          - codecommit:DeleteBranch
          - codecommit:MergePullRequestByFastForward
          Effect: Deny
          Resource: !GetAtt CodeCommitRepository.Arn
          Condition:
            StringEqualsIfExists:
              codecommit:References: 
              - refs/heads/master
            'Null':
              codecommit:References: 'false'

据我所知,我不会说太多,通过使用策略和 sts:AssumeRole 创建角色,我认为使用该存储库的任何用户都将担任该角色,拒绝他们推送的能力掌握但事实并非如此。

我想我们可能把事情搞得太复杂了,我们应该直接在 IAM 上为所有用户制定该政策,但我们的想法是让它做得非常精细。我做错了什么或者有可能吗?

此致

DenyPushRole 不适用于任何用户。您将其指定为仅适用于 codecommit.amazonaws.com,这是 不正确的

用户不会自动承担任何角色。他们必须 明确地 假定你的 DenyPushRole 使用 AssumeRole API 调用。您的用户还必须具有 sts:AssumeRole.

的权限

因此,一般来说,您的角色应该是:

  DenyPushRole:
    Type: AWS::IAM::Role
    Properties:
      RoleName: !Sub '${ProjectCode}-${ProjectName}-${ComponentName}-DenyPush-Role'
      ManagedPolicyArns:
        - !Ref DenyPushToMasterPolicy
      AssumeRolePolicyDocument:
        Version: '2012-10-17'
        Statement:
        - Action:
            - sts:AssumeRole
          Effect: Allow
          Principal:
            AWS: 
              - !Ref AWS::AccountId

一旦角色存在,并且用户有 sts:AssumeRole 担任角色,他们将使用 AssumeRole 命令实际担任角色。这将提供新的临时 AWS 凭证以执行该角色指定的任何操作。在你的情况下,该角色只会拒绝,因此他们无论如何都无法做任何事情。您需要向角色添加一些 allow 语句,以便您的用途真正能够做一些事情,而不仅仅是 deny.