因此,情况如下:我有一个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:AsseumeRole创建角色,我认为任何使用该存储库的用户都会扮演这个角色,从而剥夺他们推送到master的能力,但事实并非如此。
我想我们可能把事情搞得过于复杂了,我们应该直接在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
。