讲解 AWS EC2 IAM Role、Instance Profile、信任与权限策略、临时凭证、IMDSv2、最小权限和 AccessDenied 排查。
运行在 EC2 上的应用需要调用 S3、CloudWatch 等 AWS API 时,应通过 IAM Role 和 Instance Profile 获得自动轮换的临时凭证,而不是把长期 Access Key 写进代码、环境变量或 User Data。
默认做法:进入 AWS 中文控制台“EC2 → 实例”,选中实例后点“操作 → 安全 → 修改 IAM 角色”,绑定只含业务所需动作的角色。应用使用 AWS SDK 默认凭证链,从实例元数据取得自动轮换的临时凭证。角色不会删除实例数据,通常也不单独收费;权限过宽却可能让程序误删资源或产生额外账单。

Role 与 Instance Profile
| 对象 | 职责 |
|---|---|
| Trust Policy | 允许 EC2 服务承担角色 |
| Permissions Policy | 定义可调用的动作和资源 |
| IAM Role | 承载信任与权限 |
| Instance Profile | 把角色交付给 EC2;一个配置文件只能包含一个角色 |
配置顺序
- 列出应用真实需要的 API 动作与资源 ARN;
- 建立允许 EC2 承担的角色;
- 附加最小权限策略;
- 通过 Instance Profile 关联实例或启动模板;
- 让 AWS SDK 使用默认凭证链;
- 使用 CloudTrail 和 AccessDenied 结果收敛权限。
不要手工缓存临时凭证
角色凭证包含临时 Access Key、Secret Key 和 Session Token,AWS 会在到期前轮换。应用应由支持的 SDK 自动刷新;把元数据响应写入配置文件,会重新引入泄露和过期问题。
IMDSv2 与元数据安全
生产实例应评估要求 IMDSv2,并限制不可信进程、代理和 SSRF 访问元数据。切换为 IMDSv2 only 前必须验证旧 SDK、代理和容器网络路径,否则依赖 IMDSv1 的组件会中断。
AccessDenied 排查
- 实例是否关联正确 Instance Profile,而不是只创建了 Role;
- Role 权限是否包含动作、资源与条件;
- 资源策略、KMS Key Policy、SCP 或 Permissions Boundary 是否拒绝;
- 应用使用的是实例角色凭证,还是残留环境变量中的旧密钥;
- 区域、账户和资源 ARN 是否正确。
创建角色时分清两份策略
信任策略回答“谁可以扮演这个角色”,EC2 实例角色应信任 EC2 服务;权限策略回答“临时凭证能做什么”,例如只允许访问某个 S3 桶的指定前缀。Instance Profile 是把角色交付给 EC2 的容器,控制台通常代为创建和关联。只创建 IAM 角色但没有关联到实例,应用仍拿不到凭证。
从长期密钥迁移的顺序
- 盘点应用实际调用的 API、资源 ARN、区域和 KMS 密钥。
- 创建最小权限角色并关联测试实例,启用 IMDSv2 要求。
- 移除代码、环境变量和配置文件中的 Access Key,让 SDK 使用默认凭证链。
- 用真实业务动作验证,再停用旧 Access Key;观察无调用后删除。
不要在文章、日志或工单中输出临时凭证。临时凭证可轮换,不等于泄露后无风险;SSRF 或不可信容器仍可能在有效期内滥用。
AccessDenied 怎么读
- 报错身份不是预期角色:检查实例关联、容器凭证来源和本地环境变量是否覆盖默认链。
- 动作允许但资源拒绝:继续看 S3 桶策略、KMS 密钥策略、组织 SCP 或权限边界中的显式拒绝。
- 刚改策略仍失败:确认调用区域、资源 ARN 和角色会话,避免反复扩大到
*。 - 元数据取不到:检查 IMDSv2 令牌、Hop Limit 与代理环境,不要退回长期密钥。
最小权限怎样验收
在实例内先确认调用身份,再执行一项必需的只读或测试操作;随后尝试明确不应允许的无关操作,必须被拒绝。到 CloudTrail 核对事件主体是角色会话而非个人用户或长期 Key。把策略 JSON、角色名和应用版本纳入变更记录,但不保存凭证。
回退边界
修改前保存上一策略版本和旧角色关联。新版本导致生产失败时,可短时切回上一份已验证的最小策略,同时根据明确拒绝项修正;不要直接绑定管理员策略。只有新角色稳定、旧 Access Key 的调用归零并完成告警后,才删除旧密钥。角色轮换过程本身不会恢复被误删的数据,关键资源仍要独立备份。
容器和代理环境要单独验证
同一 EC2 上运行多个互不信任容器时,实例角色可能让所有能访问元数据的进程共享权限。需要按工作负载隔离凭证时,应采用相应容器身份方案或网络边界,不能只给实例绑定一个宽泛角色。URL 预览、下载代理等功能还要阻止访问链路本地元数据地址,避免 SSRF 取得临时凭证。

