mobile wallpaper 1mobile wallpaper 2mobile wallpaper 3mobile wallpaper 4
2386 字
7 分钟
云身份与权限管理:IAM如何成为云安全的第一战场
2025-03-08

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 云身份边界#

graph TB subgraph "传统模型:网络边界" A1["防火墙"] --> B1["VPN接入"] B1 --> C1["内网 = 可信"] C1 --> D1["身份验证仅限登录"] end subgraph "云模型:身份边界" A2["IAM策略"] --> B2["持续验证"] B2 --> C2["每个API调用独立鉴权"] C2 --> D2["身份 = 唯一信任锚点"] end style C1 fill:#FFD700 style D2 fill:#90EE90

传统网络中,进入内网就基本可信。云环境中,每个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 KeySTS Session Token、OIDC Token
泄露影响持续有效,攻击者可长期使用自动失效,窗口有限
管理成本需要轮换流程无需手动轮换
推荐程度避免使用推荐使用

核心原则:能用临时凭据,就绝不用长期凭据。

1.4 当前态势:IAM配置错误是云安全第一大威胁#

graph TB subgraph "2024-2026年云安全事件根因" A1["IAM配置错误: 72%"] --> A2["过度授权<br/>长期凭据<br/>未轮换密钥"] B1["网络配置错误: 15%"] --> B2["公开S3桶<br/>暴露管理端口"] C1["应用漏洞: 10%"] --> C2["API未认证<br/>注入攻击"] D1["其他: 3%"] --> D2["社工/零日/供应链"] end style A1 fill:#FF6B6B

二、三大云平台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:StartSessionSSM 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特有的攻击路径:

graph LR A["低权限SA"] -->|"iam.serviceAccounts.actAs"| B["高权限SA"] B -->|"访问GCS/BigQuery/Cloud SQL"| C["数据窃取"] A -->|"compute.instances.create"| D["新VM使用高权限SA"] D -->|"从元数据获取SA Token"| E["SA凭据"] A -->|"cloudfunctions.functions.create"| F["新函数使用高权限SA"] F -->|"执行任意代码"| G["SA权限下的操作"]

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临时凭据:

graph LR A["EC2/VM/Pod"] -->|"GET 169.254.169.254<br/>/latest/meta-data/iam/security-credentials/"| B["IMDS"] B -->|"返回临时Access Key<br/>+ Session Token"| C["IAM Role凭据"] style A fill:#87CEEB style B fill:#FFD700 style C fill:#FF6B6B

这意味着:任何在EC2/Pod上执行的代码,都可以通过IMDS获取该实例的IAM角色凭据。这包括:

  • 容器逃逸后在宿主机上执行的代码
  • 应用RCE漏洞在Pod内执行的代码
  • SSRF漏洞发送请求到元数据服务

3.2 SSRF → IMDS → 云接管的攻击链#

graph LR A["Web应用SSRF漏洞"] -->|"请求169.254.169.254"| B["获取IAM临时凭据"] B -->|"使用AWS CLI/GCP API"| C["云资源操作"] C --> D["S3数据窃取"] C --> E["EC2启动新实例"] C --> F["IAM权限提升"] style A fill:#FF6B6B style B fill:#FFA500 style C fill:#FFD700

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步: 获取Token
TOKEN=$(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展开:

graph TB A["攻击者拥有低权限SA"] --> B{"可用权限"} B -->|"iam.serviceAccounts.actAs"| C["充当高权限SA"] C --> D["使用高权限SA访问资源"] B -->|"compute.instances.create<br/>+ iam.serviceAccounts.actAs"| E["创建VM使用高权限SA"] E --> F["SSH进VM获取SA Token"] B -->|"cloudfunctions.functions.create<br/>+ iam.serviceAccounts.actAs"| G["创建函数使用高权限SA"] G --> H["执行函数获取SA权限"] B -->|"iam.serviceAccountKeys.create"| I["为高权限SA创建新Key"] I --> J["下载Key长期使用"]

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安全框架#

graph TB subgraph "凭据管理" A1["消除长期凭据"] A2["强制临时凭据"] A3["IMDSv2 + Hop Limit"] end subgraph "权限管理" B1["最小权限策略"] B2["权限边界"] B3["条件约束"] B4["定期审计"] end subgraph "监控与检测" C1["CloudTrail/Config"] C2["异常API调用检测"] C3["未授权访问告警"] end subgraph "响应" D1["凭据轮换"] D2["权限撤销"] D3["账户隔离"] end

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
IMDSv2SSRF→元数据→凭据强制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安全需要四个转变:

  1. 从长期凭据到临时凭据——能用STS/Workload Identity,就不用Access Key/SA Key
  2. 从过度授权到最小权限——Access Analyzer + Recommender自动化权限收敛
  3. 从隐式信任到条件约束——MFA + IP限制 + 时间限制 + 权限边界
  4. 从静态配置到持续审计——CloudTrail异常检测 + 定期Access Review + 90天权限清理

下一篇将分析云安全态势管理——当IAM配置不可避免地会腐化,如何通过CSPM持续检测配置偏差并自动修复。


参考来源:Bishop Fox “AWS IAM Privilege Escalation” 研究, AWS IMDSv2文档, GCP IAM Recommender, Capital One 2019数据泄露事件报告.


参考#

支持与分享

如果这篇文章对你有帮助,欢迎支持作者或分享给更多人

云身份与权限管理:IAM如何成为云安全的第一战场
https://blog.souloss.com/posts/cloud-security/cloud-iam-identity-access-management/
作者
Souloss
发布于
2025-03-08
许可协议
CC BY-NC-SA 4.0

部分信息可能已经过时