如何限制SSH用户不获取EC2实例绑定的IAM角色权限?
解决EC2实例SSH用户滥用IAM角色权限的方案
问题背景
- Context:EC2实例绑定的IAM角色权限被SSH登录用户意外获取,需要限制SSH用户登录时不自动继承该角色权限。
- Issue:A、B团队仅能访问各自对应的AWS服务,但某EC2实例绑定的IAM角色拥有部分服务的
Get:*权限(供应用运行),任意团队用户登录实例后可通过该角色访问受限资源,违反权限规则。 - Expectation:实现SSH登录用户无法访问其他团队AWS资源的安全限制。
可行解决方案
1. 剥离实例IAM角色,为应用单独分配权限
移除EC2实例绑定的IAM角色,改为给应用单独配置专用凭证:
- 创建仅授予应用所需
Get:*权限的IAM角色/用户,将凭证通过AWS Secrets Manager或Systems Manager参数存储进行安全管理。 - 应用启动时从上述存储中加载凭证,不再依赖实例元数据获取权限。这样SSH登录用户默认无任何实例关联的IAM权限,只能使用自身的IAM凭证操作。
2. 用SSM会话管理器替代SSH登录
禁用EC2的直接SSH访问,改用AWS Systems Manager会话管理器:
- 关闭EC2安全组的SSH端口(22),配置用户的IAM权限仅允许通过SSM登录实例。
- 强制用户登录时使用自身团队的IAM角色,而非继承实例角色。同时通过IAM策略限制用户无法访问实例元数据服务(IMDS)的凭证接口,彻底阻断获取实例角色权限的路径。
3. 限制实例元数据的访问范围
通过配置EC2实例元数据服务(IMDS),仅允许应用进程访问实例角色凭证:
- 启用IMDSv2,要求访问元数据时必须携带会话令牌,增加访问门槛。
- 在实例IAM角色的信任策略中添加条件,限制只有应用运行的系统用户(例如
appuser)能获取角色临时凭证。SSH登录的普通用户因不符合条件,无法调用元数据服务获取权限。
4. 团队访问隔离优化
如果业务允许,对实例或应用进行隔离:
- 拆分实例:为A、B团队分别部署独立的EC2实例,各自绑定仅对应团队权限的角色,避免跨团队访问同一实例。
- 容器化隔离:将应用部署到Docker或Kubernetes容器中,每个团队的应用运行在独立容器内,用户仅能进入自身团队的容器环境,无法接触到实例级别的IAM角色权限。
内容的提问来源于stack exchange,提问作者Nitin G
相关产品推荐
相关产品推荐

