如何编写IAM策略允许指定账号执行EC2:RunInstances并限制特定标签实例操作
解决方案
问题根源
之前的IAM策略失效是因为对ec2:RunInstances操作的所有关联资源(包括实例、AMI、安全组等)统一设置了aws:ResourceAccount = 111111111111条件,但公共AMI属于第三方账号(如AWS官方账号801119661308),不满足该条件,导致授权被拒绝。
正确的IAM策略
以下策略实现两个核心需求:
- 允许在账号111111111111内执行所有EC2操作,包括使用任意账号的AMI创建实例;
- 禁止操作带有
cluster=team-prod-eks或cluster=team-stage-eks标签的EC2实例。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "ec2:*", "Resource": [ "arn:aws:ec2:*:111111111111:instance/*", "arn:aws:ec2:*:111111111111:security-group/*", "arn:aws:ec2:*:111111111111:subnet/*", "arn:aws:ec2:*:111111111111:volume/*", "arn:aws:ec2:*:111111111111:network-interface/*", "arn:aws:ec2:*:111111111111:key-pair/*" ] }, { "Effect": "Allow", "Action": "ec2:RunInstances", "Resource": [ "arn:aws:ec2:*::image/*", "arn:aws:ec2:*::snapshot/*" ] }, { "Effect": "Deny", "Action": "ec2:*", "Resource": "arn:aws:ec2:*:111111111111:instance/*", "Condition": { "StringEquals": { "aws:ResourceTag/cluster": [ "team-prod-eks", "team-stage-eks" ] } } } ] }
策略说明
- 第一条允许语句:授权所有EC2操作在账号111111111111的核心EC2资源上,确保这些资源归属目标账号;
- 第二条允许语句:单独授权
ec2:RunInstances操作可以使用任意账号的AMI和快照,解决公共AMI的跨账号权限问题; - 第三条拒绝语句:拒绝所有EC2操作在带有指定标签的实例上,由于IAM拒绝策略优先级高于允许策略,即使用户有基础操作权限,也无法修改或删除这些EKS集群节点。
内容的提问来源于stack exchange,提问作者DmitrySemenov
相关产品推荐
相关产品推荐

