如何使用IAM角色让AWS EC2实例继承发起者用户的权限?
可行方案与最佳实践
方案1:通过标签传递用户身份实现权限绑定
核心是在实例启动阶段强制关联用户身份标签,再让共享实例角色基于该标签匹配权限,替代无法在角色会话中使用的aws:username变量。
配置用户启动权限:在用户的权限策略中,限制启动EC2/ASG时必须为实例打上自身用户名的
OriginalUser标签,且只能使用指定的共享实例配置文件:{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": ["ec2:RunInstances", "autoscaling:CreateAutoScalingGroup"], "Resource": "*", "Condition": { "StringEquals": { "ec2:InstanceProfile": "arn:aws:iam::ACCOUNT_ID:instance-profile/SharedInstanceRole", "ec2:Tag/OriginalUser": "${aws:username}" } } }, { "Effect": "Allow", "Action": ["ec2:CreateTags"], "Resource": "arn:aws:ec2:*:*:instance/*", "Condition": { "StringEquals": { "ec2:CreateTags/OriginalUser": "${aws:username}" } } } ] }配置共享实例角色的信任策略:仅允许带有
OriginalUser标签的EC2服务角色会话:{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "ec2.amazonaws.com" }, "Action": "sts:AssumeRole", "Condition": { "StringEquals": { "aws:ResourceTag/OriginalUser": "${aws:PrincipalTag/OriginalUser}" } } } ] }调整实例角色的权限策略:用
aws:ResourceTag/OriginalUser变量替代aws:username,实现与原用户一致的资源访问限制:{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "s3:*", "Resource": [ "arn:aws:s3:::bucket-${aws:ResourceTag/OriginalUser}", "arn:aws:s3:::bucket-${aws:ResourceTag/OriginalUser}/*" ] }, { "Effect": "Allow", "Action": ["ec2:StartInstances", "ec2:StopInstances"], "Resource": "arn:aws:ec2:*:*:instance/*", "Condition": { "StringEquals": { "ec2:ResourceTag/OriginalUser": "${aws:ResourceTag/OriginalUser}" } } } ] }
方案2:使用STS AssumeRoleWithTagSession传递会话标签
让用户先通过STS接口获取带自身身份标签的临时角色凭证,再用该凭证启动实例,直接将用户身份注入到实例角色的会话中。
用户权限配置:允许用户调用
sts:AssumeRoleWithTagSession访问共享角色,且必须传递自身用户名标签:{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "sts:AssumeRoleWithTagSession", "Resource": "arn:aws:iam::ACCOUNT_ID:role/SharedInstanceRole", "Condition": { "StringEquals": { "sts:Tag/OriginalUser": "${aws:username}" } } } ] }实例角色权限策略:直接引用会话中的
sts:Tag/OriginalUser变量限制资源访问,无需依赖实例标签,适用于需要更灵活会话控制的场景。
方案3:权限边界+动态标签策略
针对权限频繁更新的场景,用IAM权限边界固化用户权限模板,结合标签实现动态绑定:
- 为共享实例角色设置权限边界,边界策略使用
aws:PrincipalTag/OriginalUser匹配对应用户的权限模板。 - 用户启动实例时强制传递身份标签,实例角色的权限会被自动限制在对应模板范围内。
- 用AWS Config或IAM Access Analyzer定期审计权限配置,确保边界策略与用户权限同步更新。
最佳实践总结
- 拒绝为每个用户创建独立角色:维护成本极高,优先采用共享角色+身份传递的模式。
- 用标签/会话变量替代
aws:username:彻底解决角色会话无法获取原用户名的问题。 - 强制身份标签传递:在用户启动权限中添加条件,防止篡改标签获取越权访问。
- 用权限边界加固安全:即使角色权限配置出错,也能通过边界限制最大访问范围。
- 定期审计权限:通过AWS原生工具监控权限变更,确保合规性。
内容的提问来源于stack exchange,提问作者Marcelo Villa
相关产品推荐
相关产品推荐

