2023年,某安全团队在AWS环境中审计时发现:一个Lambda函数的执行角色被授予了iam:PassRole + lambda:CreateFunction权限。这两个权限单独看都不危险,但组合在一起,攻击者可以创建一个新Lambda函数并赋予它管理员角色——从低权限提升到集群管理员,只用了两次API调用。
这不是个例。云安全事件统计显示,超过70%的云安全breach与IAM配置错误直接相关——过度宽松的策略、长期有效的访问密钥、未轮换的凭据、特权Service Account。在云环境中,身份就是新的边界(Identity is the new perimeter),而IAM就是这个边界上的城门。
本文将从云IAM的信任模型出发,分析三大云平台的IAM攻击面,解析权限提升的经典路径,并构建云身份的纵深防御体系。
一、前置知识:云身份的信任模型
1.1 传统网络边界 vs 云身份边界
传统网络中,进入内网就基本可信。云环境中,每个API调用都需要独立的身份验证和授权——没有”内网”的概念,只有”有权限的API调用”和”无权限的API调用”。
这意味着:
- 网络边界消失了,但身份边界变得至关重要
- IAM配置错误等于城墙开了一个洞
- 凭据泄露等于城门钥匙被盗
1.2 云IAM的核心概念
cloud_iam_core: # 身份主体(Who) principals: - "用户(User): 人类操作者" - "组(Group): 用户的集合" - "角色(Role): 临时身份,可被担任" - "Service Account: 服务/工作负载的身份"
# 权限策略(What) policies: - "允许/拒绝(Allow/Deny)" - "资源范围(Resource ARN)" - "条件约束(Condition: IP、时间、MFA等)" - "显式拒绝优先于允许"
# 认证方式(How) authentication: - "长期凭据: Access Key / Service Account Key" - "临时凭据: STS AssumeRole / OIDC / SAML" - "联合身份: IdP → 云IAM" - "实例元数据: IMDS自动获取临时凭据"1.3 临时凭据 vs 长期凭据
这是云IAM安全最重要的区分:
| 维度 | 长期凭据 | 临时凭据 |
|---|---|---|
| 有效期 | 永不过期(直到手动轮换) | 数分钟到数小时自动过期 |
| 示例 | AWS Access Key、GCP Service Account Key | STS Session Token、OIDC Token |
| 泄露影响 | 持续有效,攻击者可长期使用 | 自动失效,窗口有限 |
| 管理成本 | 需要轮换流程 | 无需手动轮换 |
| 推荐程度 | 避免使用 | 推荐使用 |
核心原则:能用临时凭据,就绝不用长期凭据。
1.4 当前态势:IAM配置错误是云安全第一大威胁
二、三大云平台IAM攻击面
2.1 AWS IAM
AWS IAM是最成熟也最复杂的云身份系统——这种复杂性本身就是攻击面:
aws_iam_attack_surface: # 凭据类型 credentials: - "Access Key ID + Secret Access Key: 长期,永不过期" - "STS Session Token: 临时,最长12小时" - "IAM Role信任策略: 跨账户/跨服务授权" - "Instance Profile: EC2自动获取Role凭据"
# 常见配置错误 common_misconfigurations: - "Access Key泄露在GitHub/环境变量/日志中" - "Root账户未启用MFA" - "IAM策略使用通配符: Resource: '*'" - "过度授权: 授予不需要的权限" - "长期Access Key未轮换" - "S3桶策略允许公开访问" - "EC2 Instance Role权限过大"AWS IAM的权限提升路径是最丰富的——Bishop Fox的”Iam Privilege Escalation”研究列举了20+种单步提权路径:
| 提权手法 | 所需权限 | 原理 |
|---|---|---|
iam:CreateAccessKey | 为其他用户创建Access Key | 直接获得目标用户的长期凭据 |
iam:PassRole + lambda:CreateFunction | 传递角色 + 创建Lambda | 创建新函数赋予高权限角色 |
iam:AttachUserPolicy | 为用户附加策略 | 给自己附加AdministratorAccess |
sts:AssumeRole | 担任高权限角色 | 如果角色信任策略允许 |
ec2:RunInstances + iam:PassRole | 启动EC2 + 传递角色 | 启动新实例获得高权限角色凭据 |
iam:CreateRole + iam:AttachRolePolicy | 创建角色 + 附加策略 | 创建管理员角色并附加 |
ssm:StartSession | SSM Session Manager | 连接到EC2实例(无需SSH密钥) |
2.2 GCP IAM
GCP IAM的设计理念与AWS不同——更强调组织层级和继承:
gcp_iam_attack_surface: # 组织层级 hierarchy: - "Organization → Folder → Project → Resource" - "策略从上到下继承,IAM绑定可覆盖" - "Organization Admin = 整个组织的上帝权限"
# Service Account service_accounts: - "SA Key: 长期JSON密钥文件(危险)" - "Workload Identity: K8s Pod绑定SA(推荐)" - "SA Impersonation: 允许其他身份充当SA"
# 常见配置错误 common_misconfigurations: - "SA Key下载到本地且未轮换" - "项目级Editor/Owner角色过度授权" - "Compute默认SA权限过大(含storage读写)" - "Workload Identity绑定范围过宽" - "Organization策略未设置约束"GCP特有的攻击路径:
2.3 Azure RBAC + Entra ID
Azure的身份系统基于Entra ID(原Azure AD),与K8s RBAC结合形成双重授权:
azure_iam_attack_surface: # Entra ID(原Azure AD) entra_id: - "用户 + 组 + 应用注册 + Service Principal" - "条件访问策略(Conditional Access)" - "Privileged Identity Management(PIM)"
# Azure RBAC rbac: - "Owner/Contributor/Reader + 自定义角色" - "范围: 管理组/订阅/资源组/资源" - "经典管理员 vs RBAC角色"
# 常见配置错误 common_misconfigurations: - "Service Principal密码/证书未轮换" - "Subscription级Owner/Contributor过度授权" - "托管身份(Managed Identity)权限过大" - "条件访问策略未覆盖所有应用" - "PIM未启用,永久管理员权限"三、实例元数据服务(IMDS):从容器到云的桥梁
3.1 IMDS的工作原理
实例元数据服务(Instance Metadata Service,IMDS)是云环境中的”特洛伊木马”——EC2/Pod/VM可以通过HTTP请求169.254.169.254自动获取自己的IAM临时凭据:
这意味着:任何在EC2/Pod上执行的代码,都可以通过IMDS获取该实例的IAM角色凭据。这包括:
- 容器逃逸后在宿主机上执行的代码
- 应用RCE漏洞在Pod内执行的代码
- SSRF漏洞发送请求到元数据服务
3.2 SSRF → IMDS → 云接管的攻击链
Capital One 2019年数据泄露事件就是这个攻击链的典型:攻击者利用WAF配置错误的SSRF,通过IMDS获取EC2角色的临时凭据,然后用这些凭据访问了S3中1亿+客户的信用卡数据。
3.3 IMDSv2:纵深防御的进步
AWS在2019年推出了IMDSv2——要求使用PUT请求+Token获取元数据,而非简单的GET:
imds_comparison: IMDSv1: method: "GET" protection: "无" exploit: "SSRF可直接获取凭据"
IMDSv2: method: "PUT (获取Token) + GET (携带Token)" protection: - "Token有效期最长6小时" - "需要两步请求,SSRF难以利用" - "跳数限制(Hop Limit)防止容器内访问" recommendation: "强制所有EC2使用IMDSv2"# IMDSv2获取元数据的两步过程# 第1步: 获取TokenTOKEN=$(curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600")
# 第2步: 使用Token获取IAM凭据curl -H "X-aws-ec2-metadata-token: $TOKEN" "http://169.254.169.254/latest/meta-data/iam/security-credentials/"关键:设置HttpTokens=required强制使用IMDSv2,并设置HttpPutResponseHopLimit=1阻止从容器内访问宿主机元数据。
四、权限提升深度分析
4.1 AWS IAM权限提升矩阵
Bishop Fox的研究将AWS IAM提权分为三类:
privilege_escalation_categories: # 类别1: 创建新凭据 credential_creation: - "iam:CreateAccessKey → 为其他用户创建长期凭据" - "iam:CreateLoginProfile → 为其他用户设置密码" - "sts:AssumeRole → 担任高权限角色"
# 类别2: 修改策略 policy_modification: - "iam:AttachUserPolicy/AttachRolePolicy → 附加管理员策略" - "iam:PutUserPolicy/PutRolePolicy → 内联策略写入" - "iam:CreatePolicy + iam:AttachPolicy → 创建并附加自定义策略"
# 类别3: 委托授权(最隐蔽) delegation: - "iam:PassRole + lambda:CreateFunction → 创建Lambda使用高权限角色" - "iam:PassRole + ec2:RunInstances → 启动EC2使用高权限角色" - "iam:PassRole + cloudformation:CreateStack → 通过Cf使用高权限角色"4.2 GCP Service Account提权
GCP的提权路径围绕Service Account展开:
4.3 跨账户/跨项目攻击
云环境的另一个独特威胁是跨账户攻击——一个被入侵的账户可以成为攻击其他账户的跳板:
cross_account_attack: # AWS跨账户 aws: - "角色信任策略过于宽松: 允许整个AWS账户担任" - "S3桶策略允许其他账户读写" - "KMS Key策略允许其他账户使用"
# GCP跨项目 gcp: - "SA在多个项目有IAM绑定" - "共享VPC中SA可跨项目访问" - "Organization级IAM绑定影响所有项目"
# Azure跨租户 azure: - "多租户应用注册" - "Guest用户权限" - "跨订阅管理组继承"五、纵深防御体系
5.1 IAM安全框架
5.2 凭据安全最佳实践
credential_security: # AWS aws: - "禁用Access Key: 尽可能使用IAM Role代替" - "必须使用Access Key时: 启用自动轮换" - "EC2使用IMDSv2: HttpTokens=required, HopLimit=1" - "Lambda使用执行角色: 避免硬编码Access Key" - "EKS使用IRSA: IAM Roles for Service Accounts" - "Root账户: 启用MFA, 禁用Access Key, 创建IAM管理员用户"
# GCP gcp: - "禁用SA Key下载: 使用Workload Identity代替" - "Compute使用默认SA + 最小权限: 不使用storage-full" - "GKE使用Workload Identity: 不挂载默认SA" - "Organization策略: 禁止SA Key创建" - "短期Token: 使用STS/Workload Identity自动轮换"
# Azure azure: - "使用Managed Identity: 代替Service Principal" - "启用PIM: Just-In-Time特权访问" - "条件访问策略: 要求MFA/IP限制" - "AKS使用AAD Pod Identity: 不使用SP Key" - "定期轮换SP密码/证书"5.3 最小权限策略
least_privilege: # 原则 principles: - "只授予实际需要的权限(而非'可能需要的')" - "使用权限边界(Permissions Boundary)限制最大权限" - "使用条件约束(Condition)限制权限适用范围" - "定期审计:移除90天未使用的权限"
# AWS权限边界 aws_permissions_boundary: - "为所有IAM用户/角色设置Permissions Boundary" - "Boundary定义最大权限范围" - "即使策略授予更多权限,也受Boundary约束" - "示例: Boundary禁止iam:*和organizations:*操作"
# GCP组织策略 gcp_org_policy: - "constraints/iam.disableServiceAccountKeyCreation" - "constraints/iam.allowedPolicyMemberDomains" - "constraints/compute.requireOsLogin" - "constraints/iam.serviceAccountKeyMaxExpiration"
# Azure条件访问 azure_conditional_access: - "要求MFA: 所有特权角色操作" - "IP限制: 仅允许企业网络" - "设备合规: 要求托管设备" - "会话限制: 缩短特权会话时长"5.4 IAM审计与权限分析工具
iam_audit_tools: # AWS aws: - name: IAM Access Analyzer features: ["未使用的权限检测", "跨账户访问分析", "S3桶公开检测"]
- name: CloudTrail + Athena features: ["API调用审计", "异常行为查询", "权限使用分析"]
- name: Prowler features: ["CIS Benchmark检查", "IAM配置审计", "过度授权检测"]
- name: pmapper (Principal Mapper) features: ["IAM权限图构建", "权限提升路径发现", "等价权限分析"]
# GCP gcp: - name: IAM Recommender features: ["权限使用分析", "最小权限建议", "自动缩小权限"]
- name: Forseti Security features: ["IAM策略扫描", "组织策略合规", "跨项目权限审计"]
# Azure azure: - name: Azure AD Access Reviews features: ["定期权限审查", "组/角色成员清理", "PIM激活审计"]
- name: Azure Policy features: ["自定义策略合规", "RBAC约束", "托管身份限制"]5.5 防御层对照表
| 防御层 | 针对威胁 | 实现方式 |
|---|---|---|
| 临时凭据 | 长期凭据泄露 | STS/Workload Identity/Managed Identity |
| IMDSv2 | SSRF→元数据→凭据 | 强制IMDSv2 + HopLimit=1 |
| 权限边界 | 权限提升 | Permissions Boundary/Org Policy |
| 条件约束 | 凭据滥用 | MFA + IP限制 + 时间限制 |
| 最小权限 | 过度授权 | Access Analyzer + Recommender |
| 审计日志 | 未授权操作 | CloudTrail + 异常API检测 |
| 定期审查 | 权限腐化 | Access Reviews + 90天未使用权限清理 |
六、我的思考
6.1 身份是新的边界,但边界比想象中复杂
“Identity is the new perimeter”这句话已经说了很多年,但实际落地远比口号复杂。云IAM的权限模型是隐式的——一个主体的最终权限是所有附加策略、继承策略、组织策略的并集,减去显式拒绝。没有人能一眼看穿一个IAM主体到底能做什么。
这就是为什么权限分析工具(pmapper、IAM Access Analyzer)如此重要——人工审计IAM策略几乎是不可能的,必须依赖自动化工具构建权限图、发现提升路径。
6.2 长期凭据是云安全的原罪
Access Key永不过期、Service Account Key永不过期——这些长期凭据是云安全事件的第一大根因。但完全消除长期凭据在2026年仍然困难——CI/CD流水线、遗留系统、第三方集成都需要长期凭据。
折中方案:为长期凭据设置自动轮换(AWS Access Key轮换、GCP SA Key轮换),并监控凭据使用——90天未使用的Access Key应该被禁用,1天未使用的Access Key突然活跃应该触发告警。
6.3 IMDS是容器逃逸到云接管的桥梁
上一篇分析了容器逃逸,本文分析了IMDS。两者的组合是最致命的攻击链:容器逃逸 → 宿主机 → IMDS → 云凭据 → 云资源接管。
IMDSv2的Hop Limit是关键的防御措施——设置HttpPutResponseHopLimit=1意味着只有宿主机上的进程可以访问IMDS,容器内的请求因为多了一跳而被拒绝。但这个防御可以被绑定了hostNetwork: true的Pod绕过——所以Pod Security Standards禁止hostNetwork同样是必要的。
6.4 权限腐化是不可避免的
云环境的权限会随着时间”腐化”——开发者临时授予的权限变成永久的,团队调整后旧权限未清理,新服务上线时使用了过宽的模板权限。权限腐化是不可逆的熵增,需要持续投入审计和清理。
GCP的IAM Recommender是一个好的实践方向——它分析过去90天的API调用,自动建议缩小权限范围。但最终,组织需要建立”权限只减不增”的文化——新权限需要审批,旧权限定期过期。
七、总结
云IAM是云安全的第一战场——70%的云breach源于IAM配置错误。长期凭据泄露、过度授权、权限提升路径、IMDS滥用——这些不是理论威胁,而是每天都在发生的真实攻击。
2026年的云IAM安全需要四个转变:
- 从长期凭据到临时凭据——能用STS/Workload Identity,就不用Access Key/SA Key
- 从过度授权到最小权限——Access Analyzer + Recommender自动化权限收敛
- 从隐式信任到条件约束——MFA + IP限制 + 时间限制 + 权限边界
- 从静态配置到持续审计——CloudTrail异常检测 + 定期Access Review + 90天权限清理
下一篇将分析云安全态势管理——当IAM配置不可避免地会腐化,如何通过CSPM持续检测配置偏差并自动修复。
参考来源:Bishop Fox “AWS IAM Privilege Escalation” 研究, AWS IMDSv2文档, GCP IAM Recommender, Capital One 2019数据泄露事件报告.
参考
支持与分享
如果这篇文章对你有帮助,欢迎支持作者或分享给更多人
部分信息可能已经过时






