如何控制IAM角色在新策略中可定义的资源与操作?
如何创建受限AWS管理员角色(防权限绕过)
问题背景
我想做一个仅禁止访问少量特定资源的管理员角色,一开始的思路是给角色挂AWS托管的AdministratorAccess策略,再加个拒绝特定资源的内联策略:
ManagedPolicyArns: - arn:aws:iam::aws:policy/AdministratorAccess Policies: - PolicyName: DenyAccess PolicyDocument: Version: '2012-10-17' Statement: - Effect: Deny Action: - '*' Resource: - arn:aws:s3:::example-bucket - ...
但这方案有漏洞:这个角色有完整IAM权限,用户可以新建一个全权限策略挂到Lambda角色上,通过Lambda就能绕过原角色的拒绝策略,访问受限资源。
我试过用权限边界解决,但配置后没效果,我的权限边界配置是这样的:
- PolicyName: BoundaryPolicy PolicyDocument: Version: '2012-10-17' Statement: - Effect: Allow Action: 'iam:*' Resource: !Sub arn:aws:iam::${AWS::AccountId}:role/* Condition: StringEquals: iam:PermissionsBoundary: !Sub arn:aws:iam::${AWS::AccountId}:policy/DenyPolicy
想问下有没有办法控制这个IAM角色在新建策略时能定义的资源和操作?
可行解决方案
要搞定这个问题,得从两个核心点入手:给管理员角色本身加权限边界限制最大权限,同时强制它创建的所有IAM实体都必须继承这个边界,绝不让绕过的机会。
1. 先做权限边界策略
这个策略是用来定义所有角色能拥有的最大权限——允许所有操作,但禁止访问你指定的资源,专门用作权限边界:
PolicyName: DenyRestrictedResourcesBoundary PolicyDocument: Version: '2012-10-17' Statement: # 允许所有操作,作为权限边界的上限 - Effect: Allow Action: '*' Resource: '*' # 拒绝访问特定资源 - Effect: Deny Action: '*' Resource: - arn:aws:s3:::example-bucket - # 这里填其他需要受限的资源ARN
2. 创建管理员角色并绑定权限边界
给角色挂AdministratorAccess托管策略,同时把上面的权限边界绑定到这个角色上:
Resources: RestrictedAdminRole: Type: AWS::IAM::Role Properties: RoleName: RestrictedAdministrator AssumeRolePolicyDocument: Version: '2012-10-17' Statement: - Effect: Allow Principal: AWS: !Sub arn:aws:iam::${AWS::AccountId}:user/your-admin-user Action: sts:AssumeRole ManagedPolicyArns: - arn:aws:iam::aws:policy/AdministratorAccess # 绑定权限边界,限制该角色的最大权限 PermissionsBoundary: !Sub arn:aws:iam::${AWS::AccountId}:policy/DenyRestrictedResourcesBoundary
3. 加内联策略强制所有新IAM实体用这个边界
给管理员角色加个内联策略,确保它创建的所有角色、用户、策略都必须指定上述权限边界,还得禁止删除边界的操作:
Policies: - PolicyName: EnforcePermissionsBoundary PolicyDocument: Version: '2012-10-17' Statement: # 允许创建/修改IAM实体,但必须带指定的权限边界 - Effect: Allow Action: - iam:CreateRole - iam:PutRolePermissionsBoundary - iam:AttachRolePolicy - iam:CreatePolicy - iam:AttachUserPolicy - iam:CreateUser - iam:PutUserPermissionsBoundary Resource: '*' Condition: StringEquals: iam:PermissionsBoundary: !Sub arn:aws:iam::${AWS::AccountId}:policy/DenyRestrictedResourcesBoundary # 禁止删除权限边界,防止用户解除限制 - Effect: Deny Action: - iam:DeleteRolePermissionsBoundary - iam:DeleteUserPermissionsBoundary Resource: '*'
为什么之前的配置失效?
你之前的配置有两个关键漏洞:
- 没给管理员角色本身绑定正确的权限边界,导致角色自身的权限不受限制
- 只限制了角色相关的IAM操作,没覆盖用户、策略的创建,也没禁止删除边界的操作,用户很容易绕开限制
内容的提问来源于stack exchange,提问作者JanJetze
相关产品推荐
相关产品推荐

