配置IAM策略仅访问特定区域EC2实例遇权限问题求助
问题原因及解决方法
核心问题
EC2的DescribeInstances等查询类操作不支持资源级权限控制,你只指定arn:aws:ec2:REGION:ACCOUNT:instance/*作为Resource,这类操作会因为找不到匹配的权限规则而报错。
AWS的IAM权限逻辑中,部分EC2操作(比如启动、终止实例)支持资源级权限,但像DescribeInstances、DescribeVolumes这类全局查询操作,必须将Resource设为*,同时通过Condition来限制访问的区域。
修正后的策略
你需要拆分权限规则,分别处理支持资源级的操作和查询类操作,同时通过Condition限制区域:
{ "Version": "2012-10-17", "Statement": [ // 允许针对指定区域实例的所有支持资源级的EC2操作 { "Action": [ "ec2:StartInstances", "ec2:StopInstances", "ec2:TerminateInstances", "ec2:RebootInstances", "ec2:CreateTags", "ec2:DeleteTags" ], "Effect": "Allow", "Resource": "arn:aws:ec2:REGION:ACCOUNT:instance/*" }, // 允许指定区域内的查询类操作,这类操作不支持资源级权限 { "Action": [ "ec2:DescribeInstances", "ec2:DescribeInstanceStatus", "ec2:DescribeRegions", "ec2:DescribeVolumes" ], "Effect": "Allow", "Resource": "*", "Condition": { "StringEquals": { "aws:RequestedRegion": "REGION" } } } ] }
如果想简化,也可以用ec2:*但分两条规则,同时遵循最小权限原则:
{ "Version": "2012-10-17", "Statement": [ { "Action": "ec2:*", "Effect": "Allow", "Resource": "arn:aws:ec2:REGION:ACCOUNT:instance/*" }, { "Action": "ec2:*", "Effect": "Allow", "Resource": "*", "Condition": { "StringEquals": { "aws:RequestedRegion": "REGION" } }, "NotAction": [ "ec2:StartInstances", "ec2:StopInstances", "ec2:TerminateInstances", "ec2:RebootInstances", "ec2:CreateTags", "ec2:DeleteTags" ] } ] }
验证逻辑
- 执行
describe-instances时,会匹配第二条规则的Resource: *和区域条件,从而获得权限。 - 针对实例的操作(比如启动)会匹配第一条规则的实例ARN,确保只能操作指定区域的实例。
内容的提问来源于stack exchange,提问作者laurent
相关产品推荐
相关产品推荐

