You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 02:31:08