我处理过一次让人很无语的权限事故:一位离职九个月的员工,账号居然还能登录生产环境后台,而且角色挂的是整个存储服务的完全控制权限。更讽刺的是,这条权限原本应该24小时过期,结果在权限生命周期设计上缺了“自动回收”这一环,于是一直躺在那里,像一颗定时炸弹。
这类问题反复出现之后,我意识到它拼的不是某位云管理员的责任心,而是**身份访问管理(IAM)**在云计算环境里有没有被当成一套架构来设计。云计算中身份访问管理的架构,从来不等于“在控制台里哪个菜单下点几下”的操作题,它至少包含身份源、认证、授权、审计四条链路,还同时覆盖人和程序两类身份。这篇内容想把这些链路掰开讲清楚,也聊聊那些只有在真实环境里踩过才会理解的坑。适合正在规划云上权限体系的技术负责人,也适合被权限问题折磨过的后端和运维同学。
1. 为什么上云之后,身份与访问管理突然就变难了
很多团队第一次正视IAM,不是因为文档看多了,而是因为出了事。要理解云上IAM为什么比传统环境复杂,得先从底层变化说起。
1.1 访问边界从“网络隔离”变成了“逻辑判断”
传统机房时代,安全边界很具体:防火墙、交换机、VLAN、跳板机。研发想连数据库,你得先申请网段放通;运维想上服务器,得先过堡垒机。边界是由物理网络设备画出来的,权限问题本质上被网络层挡掉了一大部分。
上云之后,资源分布在若干区域,服务之间通过API互相调用,很多资源根本没有“内网IP”这个概念。你说的边界在哪里?不在防火墙配置里,而在策略引擎的某条allow/deny规则里。网络层已经无法回答“谁可以访问什么”了,这个问题被前移到了身份层。
举个例子:某个服务账号要通过API读取另一账号下的配置信息。在传统机房,你可以说“网络不通”。但在云环境里,只要策略写了一条“允许该身份读取该资源”,哪怕两个账号之间的网络完全隔离,请求一样能成功。边界从设备配置变成了策略配置,而策略配置又是肉眼很难检查的。
1.2 身份从“人”扩展到了“机器”
这是云IAM最容易被忽视的一点。早期我们认为身份就是登录账号,但云环境里的身份远不止人:
- 人:员工、外包、临时协作者。他们有密码、有多因素认证。
- 程序:CI/CD流水线、定时任务、监控探针、数据分析脚本。它们需要某种令牌或密钥来模拟身份。
- 服务:微服务之间互相调用时,也需要一个身份凭证,这个身份在成熟的体系里可以是非对称密钥签发的短期凭证。
人还可以靠制度约束,比如离职时行政通知、IT停账号。但服务账号没有“离职”一说,它会一直存在,直到有人主动删除。数量上,机器身份往往是人类身份的几十倍。我曾经梳理过一个业务集群,团队不到二十人,各类服务账号和令牌却超过两百个,大多数都不知道是哪个系统在什么时候创建的。这种身份爆炸才是云上访问管理失控的根源。
1.3 IAM是基础设施,不是“某个人顺手配一下”
从一开始我就持一个观点:云上的身份访问管理必须被当成独立基础设施来设计。什么叫独立基础设施?类比一下,你不会让每层楼自己打一口井解决供水,你会统一建一套水网。IAM就是整个云平台的水网,身份源是水源,认证层是水表,授权层是阀门,审计是对整条管道的监控。
如果每个团队各自建账号、各自配角色、各自写策略,那就会出现同一个人在不同系统里有好几套身份,权限状态谁也说不清。审计的时候打开日志,看到的是一个混乱的身份宇宙。所以优秀的云IAM架构,一定先从“统一身份源”开始,而不是从“某个角色的权限怎么写”开始。
2. 一套云IAM架构通常由哪四层组成
我对IAM架构的理解,可以用一条很朴素的链路来概括:你是谁、怎么证明是你、你能做什么、做了之后怎么追溯。对应到架构上,就是四层。
2.1 身份源与目录层:解决“你是谁”
这一层是整个IAM的地基。身份源负责维护所有身份的唯一记录,包括人的账号、组织结构、职级、部门、外包状态,也包括机器身份、服务账号的登记信息。
大多数成熟企业会把人力资源系统、OA系统或统一目录作为人的身份源,然后通过SCIM协议将账号动态同步到云端的身份目录。比如一个员工入职,HR系统创建了记录,SCIM同步后自动在云端生成账号;员工转岗或离职,记录更新后云端账号随之停用。这才是身份生命周期的正确打开方式。
有不少团队的问题是根本没有身份源,每个云账号下手动建一堆子账号,员工离职后账号留在那里,权限还挂着。身份源统一之后,很多权限问题才能被自动化处理。我的习惯是:人的身份全部以HR系统为准,机器身份全部以配置管理系统为准,两者都通过自动同步下发,拒绝手工注册。
2.2 认证层:解决“怎么证明是你”
认证层做的事情是验证身份。云上认证的关键词有三个:单点登录(SSO)、多因素认证(MFA)、条件访问。
单点登录的目标是让用户通过企业身份源登录一次,就能访问多个云平台或云账号,不再需要每个系统记一套密码。底层协议常见的是SAML和OIDC,你看很多云平台支持“企业外部身份源登录”,本质就是把这层接口开放了出来。
多因素认证不用多说,凡是管理员、财务、数据操作这类敏感角色,强制开启MFA是底线。条件访问稍微进阶一些,它允许你根据请求来源、设备合规状态、地理位置、登录时间等额外因素来决定“这次登录允不允许”。比如“只允许办公网段内访问生产环境控制台”或者“不允许境外IP登录”,这些都属于条件访问策略。
我见过一个很典型的翻车场景:某团队觉得SSO太麻烦,每位成员在云控制台上各自注册密码登录,结果一次钓鱼攻击把三四个高权限账号搞走了。认证层做得再花哨,不用就是零。
2.3 授权层:解决“你能做什么”
授权层是IAM架构里最核心也最容易写错的层。它的本质是一个判断逻辑:谁(主体)在什么条件下对哪个资源(客体)执行什么操作(动作)。
策略引擎会把这四要素组合成一条条规则。很多云平台的策略文件长得像这样:
{ "version": "1.0", "statement": [ { "effect": "allow", "principal": "user:zhangsan", "action": ["storage:read", "storage:list"], "resource": ["resource:cloud:cluster:prod::database-01"], "condition": { "ip": "10.20.0.0/16", "time": "between 09:00 and 18:00" } } ] }注意这里“principal”不能只写人,服务账号同样需要被纳入授权。很多团队给服务账号授权特别粗放,直接给“所有操作权限”,这就等于给了脚本一把万能钥匙。授权层的设计核心是策略收敛,后面我会单独讲最小权限的落地。
2.4 审计与治理层:解决“做了之后怎么追溯”
这一层经常被低估。没有日志,前面三层出了故障你都不知道问题在哪。审计层要做的事情包括:
- 记录所有身份认证成功和失败的事件。
- 记录所有权限变更事件:谁创建了新角色、谁修改了策略、谁给某个身份授予了新权限。
- 记录所有高危操作:删除资源、修改配置、导出数据。
- 定期生成权限报表和异常告警。
我曾经遇到一个故障,生产环境某个配置被改动,影响了一整条业务链。排查时发现审计日志保留期只有七天,而被改动的动作发生在第八天之前。结果就是你知道“有人动过”,但完全查不到是谁。那次之后,我对审计日志的要求是:关键操作日志保留至少一百八十天,必须接入告警,不能用“将来需要时再看”的心态对待。
四层之间的关系可以简单理解成一条流水线:身份源提供“名单”,认证层检查“证件”,授权层控制“门禁”,审计层记录“谁在什么时间经过了哪道门、做了什么动作”。少了任何一层,云IAM都会成为纸糊的墙。
3. 权限模型怎么选:RBAC、ABAC、PBAC的取舍
有了四层架构之后,最实际的架构决策就是选权限模型。这个选择会直接影响后续所有权限策略的写法。我见过好几拨团队在这里反复折腾,所以单独拿出来聊。
3.1 RBAC:大部分团队应该从它开始
基于角色的访问控制,也就是把权限先挂到“角色”上,再把角色分配给用户。好处是符合直觉:职责相似的岗位共用一个角色,权限调整只需要改角色,不需要去逐个改用户。
举一个很常见的例子:一名后端开发需要读取测试环境日志、查看监控面板、部署测试服务。你可以先定义“测试环境开发”角色,把这些权限挂进去,然后让这个角色分配到对应的小组。新同事入职,直接加入小组即可获得同样权限;员工转岗,从小组移除即失去权限。
但RBAC有一个绕不开的问题:角色膨胀。用得久了,大家会因为图省事创建很多杂七杂八的角色,或者往现有角色里不断追加权限,最终角色权限边界变得特别模糊。我见过最小的一个“开发”角色挂了四十多项权限,连负责人都说不清每一项是给谁用的。所以RBAC适合起步,但不适合一直放任不管。
3.2 ABAC:灵活,但依赖强大的元数据
基于属性的访问控制,把“允许谁做什么”建立在属性之上。用户的部门、职级、项目归属,资源的标签、环境、数据分类,以及访问时间、来源IP等,都可以作为属性参与策略判断。
典型的ABAC策略逻辑是:“只有当用户的部门属性等于数据分析部,且资源的环境标签等于生产,且当前时间是工作时间,才允许读取这张数据表”。
ABAC的最大优势是灵活,权限不再需要为每一个岗位单独建角色,而是写一套规则去覆盖各种情况。但它的代价也非常现实:要求你的元数据是干净的。资源不打标签,用户属性不维护,ABAC策略就成了空中楼阁。我见过一个团队认认真真做了ABAC,结果半年后新资源不断增加,运维助理没有给新资源打标签,导致大量需要访问的人被静默拒绝,业务方以为是系统故障。后来他们定了一条铁律:资源创建时必须强制填写环境、归属团队、数据级别三个标签,否则自动拒绝访问并告警。
3.3 PBAC:把策略当成代码去管理
基于策略的访问控制通常指一种治理模式:把策略从“某个控制台里勾选出来的不可见配置”变成版本化的代码资产。策略被写进代码仓库,经过评审后自动分发到云平台生效。
这样做的直接收益是可追溯性和可评审性。每次策略变更都有记录,不会出现“不是我改的但不知道谁改的”情况。策略即代码还能配合自动化扫描工具,审查某一个角色下是否存在明显过大的权限区间。
我把三个模型放在一起做过对比,大概是这样:
| 维度 | RBAC | ABAC | PBAC |
|---|---|---|---|
| 抽象单位 | 角色 | 属性 | 策略 |
| 配置难度 | 低 | 中 | 中高 |
| 灵活性 | 中 | 高 | 高 |
| 对元数据要求 | 低 | 很高 | 中 |
| 可审计性 | 中 | 中 | 高 |
| 适合阶段 | 起步标配 | 有标签体系后 | 治理成熟期 |
实际落地时三者并不互斥,完全可以先用RBAC建立基础岗位模型,再逐步引入ABAC做细粒度控制,最后用PBAC或策略即代码统一管理。真正需要想清楚的是:你的组织有没有能力长期维护模型运行所需的信息?没有这个能力,再先进的模型也会在半年后变得一团糟。
4. 最小权限不是口号:如何把权限收敛做成工程化机制
“最小权限原则”大概是所有人都会说的一句话,但真正做到的不多。它的问题不在于理念,而在于缺乏可执行的机制。这一节讲我自己的落地经验。
4.1 先给最小权限一个可执行的定义
最小权限不是“权限越少越好”,而是在职责边界明确的前提下,给出完成工作所需的最小权限集合。比如负责日志查询的同事,可以给他某个日志项目下的只读权限,而不是整个云账号的只读权限。
要执行这个定义,必须先回答三个问题:每个角色负责哪些资源和操作?每个用户归属于哪些角色?角色之间的权限边界是否清晰?我通常会让团队先做一个角色台账,把每一个角色包含的权限列成表格,凡是有一项权限说不清用途的角色,全部标记为“待整改”。
4.2 权限模板化,让“按需分配”成为默认动作
工程化落地的第一步是建立权限模板库。把业务里常用的权限组合沉淀为标准角色:只看日志的角色、只发布测试环境的角色、只负责备份的角色、只读监控的角色等。任何新的权限申请,优先从模板里选,而不是每次手动勾选一堆细粒度权限。
具体流程是这样的:
- 使用者提交权限申请,说明需要的角色或操作范围。
- 审批人检查申请是否符合该角色职责边界。
- 自动化为使用者分配权限,并设置到期时间。
- 定期复核该使用者的权限是否仍然在用。
这里有一个关键细节:临时授权必须在系统层面设置到期时间。不要相信“我明天会记得删掉”这种鬼话。我是靠一次事故才彻底相信这一条的,后来凡是需要临时提权的操作,一律选择带到期时间的授权通道,到期后自动回收。
4.3 用权限画像发现“权限爆炸”和“影子管理员”
权限收敛做得好不好,不能靠感觉,要定期用数据说话。我建议每季度至少做一次权限画像,重点看三个指标:
- 拥有管理员类权限的用户数。这个数字最好控制在个位数。
- 近九十天没有任何登录或调用记录的身份。那些“僵尸账号”是攻击者最喜欢的目标。
- 被创建后从未使用过的策略或角色。既然没用,为什么还留着?
还有一个需要专门盯的东西叫影子管理员:表面上不在管理员角色里,但因为角色权限配置不当,实际可以修改策略、拉高自身权限、在系统里创建新角色。这种人可能是恶意操作,也可能只是好心办坏事,但风险等价于一个管理员账号在裸奔。我见过最离谱的情况是一个运维同学为了让某个脚本能跑通,把一个服务账号塞进了管理员角色,然后又给这个账号创建了第二个长期访问密钥——这就是典型必须快速处置的权限配置。
4.4 权限回收要像权限发放一样自动化
国内很多团队的权限发放是快的,权限回收却全靠人来催。员工转岗或离职,旧权限不回收;项目结束,环境不销毁,角色不删除。回收做不到自动化,最小权限原则就别想落地。
实现自动回收,关键是给每个身份绑定一个“所有权人”和“到期时间”。所有权人负责解释身份的用途,到期时间到点之后权限自动失效。如果需要延长,可以发起延期审批,但必须重新走一遍流程。这个机制看着机械,却很有效,因为每一次延期都会提醒你:这条权限到底还有没有必要留着。
5. 云上IAM最容易翻车的五个细节
四层架构聊完了,模型也选了,真正折磨人的往往是一些架构图里不会画出来的小细节。我把这些年见过的高频翻车点列一下,每一个都是真实教训。
5.1 服务账号密钥长期不过期
服务账号的密钥一旦发出去,很多团队就再也不管了。密钥写进配置中心,一用就是两三年。如果这个密钥不小心进了日志、代码仓库或命令行历史,就等于把该身份的所有权限公开了。
我的建议是:优先使用短期凭证,不支持短期凭证的场景,密钥必须设置轮换周期,建议不超过九十天,并把轮换动作写进自动化系统,不要靠人工记。如果你发现自己处理过一次“密钥在代码仓库里躺了三个月”的事件,说明密钥管理机制该重建了。
5.2 “临时授权”变成了永久授权
出故障时给某人紧急提个权,非常正常。但不正常的是,提权之后没人回收。我见过不少角色里躺着一堆“紧急管理员”权限,一躺就是半年。当初的负责人早就忘了,审计也不提醒,直到某天做权限复查才发现。
对策就是上面提过的:临时授权默认设置到期时间,到期自动失效。如果系统本身不支持按时间授权,那就用任务日历建一个自动提醒,到期前三天通知发起人和审批人,没延期就自动吊销。
5.3 跨账号信任导致权限放大
多账号架构现在是常态,业务账号、数据账号、网络账号、日志账号各司其职。为了操作方便,很多团队会在账号之间建立信任关系,比如“A账号可以扮演B账号的某个角色”。这就是典型的权限放大点。
信任关系一旦建立,攻击者拿下A账号的任何一台服务,都可能顺着信任关系跳转到B账号。更隐蔽的是,当一个中间账号同时被多个账号信任时,它的风险等级会被低估。我的原则是:信任关系要显式列出,写明信任方向、信任范围和允许的动作,任何无具体用途的信任关系一律删除。
5.4 审计日志开了,但没有人看
“日志我们是开了的”——这句话我在排查问题时听过太多次。开了日志和能用日志是两回事。如果日志存在不可检索的位置,或者保留期只有三十天,出了问题根本追不回来。
我在第二节提过保留期的问题,这里再补充一点:告警规则比日志收集本身更重要。关键事件必须能触达当班的人。比如“创建或修改了权限策略”“为某个身份授予了管理员角色”“删除了存储桶或备份”这类事件,不能只落在日志里,必须同步到告警通道,至少要有人去确认是不是预期操作。
5.5 机器身份没有生命周期管理
人的身份有离职,机器身份也有“退役”。项目下线,服务账号不收回;流水线改造,旧令牌不销毁。大多数团队能把人的身份管清楚,但一提到机器身份就开始含糊,因为它们没有负责人。
机器身份管理在我看来只有三条硬规则:第一,每个机器身份必须有明确负责人;第二,所有机器身份必须有到期时间;第三,任何机器身份被调用时都要能追溯到具体服务。做到这三点,机器身份才不会变成隐身入口。
6. 从现状到治理:一套可以照做的落地路径
最后这部分写给准备动手、但不知道从哪里开始的人。别指望一蹴而就,云IAM治理是分阶段跑完的。
6.1 先画一张权限地图
动手第一步是清理家底:列出现在有哪些账号、哪些角色、哪些策略、哪些机器身份、哪些跨账号信任关系。为每一类对象标出负责人、创建时间、最后使用时间。
这一步不复杂但很累,而且结果往往是触目惊心的。当时我做完之后的第一感受是:我们实际拥有的权限,比我们以为我们拥有的权限多得多。但没关系,这张图就是后续所有治理动作的基线。
6.2 统一身份源,关掉命名混乱
确认了现状之后,优先做身份源收敛。把散落在各系统里的“人”的身份统一接入同一个身份源目录,让同一个人在所有云环境里都对应同一个唯一标识。同时把机器身份登记入册,同步到统一的配置管理系统。
身份源统一之后,认证层的SSO才能顺利推进。不然这边说要做单点登录,那边还各有一套账号体系,根本连不起来。我用过的一个比较实际的判断标准是:如果新员工入职后,还需要手工去三个不同系统创建账号,那身份源就是没有收敛好。
6.3 选一个小团队试点最小权限闭环
别试图一次性把整个公司的权限治理做完,大概率会失败。我的建议是选一个风险高但范围可控的业务团队,再加一个平台团队一起试点。
试点目标很明确:用标准化角色替换该团队现有所有自定义权限,跑通“申请-审批-发放-使用-回收”的闭环,并让试点团队的负责人每周收到一份权限清单,自己确认哪些权限还需要留着。试点周期控制在四周左右,把流程里的卡点暴露出来,再逐步推广到其他团队。
6.4 让治理变成一个月度动作
权限治理不是一次打完就结束的工程,它更像给系统做定期体检。我建议每个月固定做一次权限指标盘点,至少包含以下五项:
- 管理员类身份数量及其变化趋势。
- 闲置身份数量(超过九十天未使用)。
- 未使用的角色和策略数量。
- 临时授权到期未回收数量。
- 策略覆盖率(多少资源没有适用策略保护)。
这些指标不需要做得特别复杂,只要能反映趋势,就能在权限风险变严重之前给你足够信号。权限治理真正成熟后,它不会让团队觉得“多了很多事”,而是会让每一次权限变更都清清楚楚、有据可查。
如果只让我留一条建议,我会说:先做权限清点。把“我们有什么”彻底搞明白,比上来就设计一套宏大权限模型要实际得多。云IAM架构不是一次到位的结果,它是在一次次清理、一次次复盘里慢慢长出来的。把第一张地图画出来,你就已经赢过了大多数团队。