当轮换密钥不再等于安全:2026,云上真正危险的是没人认领的那把钥匙


title: 当轮换密钥不再等于安全:2026,云上真正危险的是没人认领的那把钥匙
date: 2026-09-26 10:00:00
categories:

  • 1

tags:

  • 安全
  • 隐私
  • 科技

安全团队最喜欢的句子之一是:出事了,把密钥轮换一遍。这句话听起来像纪律,执行起来常常像仪式。2023 年 1 月,CircleCI 公开要求客户轮换平台里几乎所有密钥——环境变量、项目令牌、个人 API 令牌、以及曾经穿过流水线的第三方凭据。原因并不神秘:工程师笔记本上的恶意软件偷走了一枚已经过了双因素认证的会话 cookie,攻击者借此进入生产环境,并在约 2022 年 12 月 16 日到 2023 年 1 月 4 日之间接触到一部分客户密钥。CircleCI 事后说明,它无法精确列出哪些客户的密钥被读过,所以只能建议所有人假设自己已经暴露。

这不是“云厂商被打穿了所以大家倒霉”的故事。更刺耳的一点是:双因素认证当时是开着的。它挡得住重新登录,挡不住已经登录成功之后被偷走的会话。密钥在磁盘上可以加密,流水线运行时却必须在内存里解开,否则任务跑不起来。加密因此保护的是“没人进来”的状态,不是“人已经进来了”的状态。

一年多以后,Snowflake 客户实例被盗的战役把同一件事换了个舞台。Google 旗下 Mandiant 在 2024 年 6 月的公开分析里把这起活动记为 UNC5537:攻击者用信息窃取木马早已偷到的客户账号密码登录 Snowflake 实例,导出数据,再勒索或拿到犯罪论坛上卖。Mandiant 明确写过,它没有发现这是 Snowflake 企业环境本身被攻破;它参与响应的案例,根因都回到客户凭据。被利用的账号普遍没有开多因素认证,有的密码几年没换,实例也没有把访问限制在可信网络。Mandiant 与 Snowflake 的分析还提到,攻击者用到的账号里,至少约 79.7% 此前就出现在凭据泄露里。TechCrunch 报道称,两家公司通知了大约 165 家客户,其数据可能已被盗走。Snowflake 当时有九千多家企业客户,所以这不是“全平台沦陷”,但也绝对不是边角料。

两起事件隔了一年多,攻击面却像同一张图纸。人的电脑先被偷,长期有效的凭据再被拿去开一扇不该那么宽的门。轮换密钥是事后唯一诚实的动作,也是事前最常被推迟的动作。推迟的理由通常很具体:这把钥匙挂在三条流水线、两个合作方和一个没人敢动的定时任务上,轮换一次等于约三个团队在周五晚上对答案。

钥匙比人多,而且大多数钥匙没有主人

云上真正膨胀的不是员工账号,是非人身份:服务账号、CI 令牌、云厂商的访问密钥、OAuth 刷新令牌、工作负载证书、给脚本用的数据库密码。它们不会离职,不会参加安全培训,也不会在密码管理器里留下“这是谁申请的”。人走了,钥匙还在;项目黄了,钥匙还在;供应商换了,旧的集成密钥经常还在,因为没人能证明它已经没用。

2026 年,身份厂商把这摊账讲成了新产品类。Okta 在这一年连续把“给 AI 代理发身份”做成发布会主题:代理要登记、要有人类所有者、要能在运行时被限权,甚至要能被审计它连过哪些应用。Cloud Security Alliance 同年的非人身份治理材料把量级说得很不客气——企业里非人身份相对人类用户的平均倍数可以到几十比一,云原生环境里更高。这类倍数来自厂商和行业组织的口径,不该当成审计过的普查,但它指向的结构是真的:你的 IAM 控制台如果还以“员工花名册”为中心,它看见的只是冰面以上的那一层。

这里有一个容易滑进去的叙事:既然问题出在机器身份,那就上一个“非人身份平台”,再给每个机器人发一张工牌。工牌能解决命名,解决不了所有权。一把没有到期日、没有调用方约束、也没有责任人的密钥,换个产品目录里的名字,仍然是一把没人认领的钥匙。Okta 们把代理登记成一等公民,方向对,前提是企业真的有人愿意当那个公民的监护人。否则你只是多了一张更漂亮的失物招领表。

轮换失败,通常败在清单,不败在加密算法

CircleCI 那次让很多团队第一次发现:自己根本说不清“存在 CircleCI 里的一切”包括什么。环境变量是一份,context 是一份,项目令牌是一份,某个三年前的个人令牌又是一份。等公告要求“全部轮换”时,成本并不主要花在生成新密钥,而花在找出旧密钥被谁引用。没有清单的组织,轮换期等于全公司停下来做考古。

Snowflake 战役则说明,清单之外还有时效。Mandiant 写到,有些被利用的凭据四年来没有轮换,而且来自信息窃取木马的历史输出,最早可以追溯到数年之前。密码学上它们一点都不弱。它们只是一直有效。攻击者不需要 0day,只需要一个还没过期的用户名和密码,加上一个不强制二次验证的登录框。

所以“我们每年轮换一次根密钥”并不是安全策略,它只是一个日历提醒。有效的轮换至少要回答四个问题,而且答案得能被机器查到,不能靠人记得:

  • 这把钥匙授权的是哪一个调用方,而不是“整个生产环境”。
  • 它什么时候必须失效,而不是“下次有人想起来”。
  • 失效之后,哪些流水线会红,红了找谁。
  • 如果它今晚被偷,你能不能在几小时内把它换成短命令牌,而不是下周的变更窗口。

答不上来的钥匙,就不该是长命的。云厂商这些年给了一个不漂亮但有效的替代:用 OIDC 或工作负载身份,让 CI 在跑任务的那几分钟里换一张临时凭证,任务结束凭证作废。静态密钥还是会留下,因为不少 SaaS 到现在只认一把永久 API key。那就把它的爆炸半径写小——一个密钥只对一个仓库、一个存储桶、一个只读角色——并且把轮换写进发布流程,而不是写进事故复盘。

反方:短命令牌不是免费午餐

把一切改成临时凭证,听起来像架构师的胜利,落地时会撞上三面墙。

第一面是供应商。支付、物流、老牌 SaaS、部分政府接口,仍然只发长期密钥。你可以在自己这边套一层代理,每隔几小时换内部令牌,但外部那把钥匙还是长期的。代理只是把风险挪到你更可控的地方,没有消灭它。声称“我们已经零静态密钥”的团队,往往只是把最后那几把钥匙移出了 CI 的界面,放进了另一个没人看的保险库。

第二面是排障。长命密钥的好处是无聊:挂了就能在日志里看到同一把钥匙。短命令牌的失败模式是“刚才还能用,现在签名过期了”,而且过期往往和部署、时钟、身份提供商的故障搅在一起。SRE 会用稳定性换可见性,安全会用可见性换爆炸半径。两边都没错,缺的是一次事先约定:哪些路径允许静态密钥,谁每个季度去看它们还在不在被调用。没人调用的钥匙不是资产,是负债。

第三面是身份厂商自己的激励。2026 年 Okta 财报前后,市场愿意为“身份安全需求上升”付钱,CNBC 曾报道其股价在超出预期后大涨约两成,叙事里就有 AI 带来的身份威胁。这不证明产品没用,只证明买家该分开两件事:代理登记、会话绑定、最小权限,是控制问题;“再买一个仪表盘看所有代理”是采购问题。仪表盘若不能强制到期和回收,它只是给审计会议多一页截图。

还有一个更安静的反方。强制轮换如果做得太密、太无差别,人会把新密钥贴回聊天记录、工单和笔记本,因为流程比泄露更痛。Snowflake 战役里那些几年没换的密码是失败;CircleCI 之后有些团队在慌乱中把同一把新密钥写进五个仓库,也是失败。轮换的目标不是次数,是“偷到旧的也没用,偷到新的也只在很窄的窗口里有用”。

判断

云安全这几年有个好用的口号:身份是新的边界。口号本身差不多对,用法经常错。边界如果是一张员工名册加一个 VPN,它防的是 2014 年的办公楼。2026 年的边界是每一把还能用的钥匙:谁签发出去的,能碰什么,今晚能不能作废。

CircleCI 证明,双因素认证挡不住已登录会话被偷,平台侧加密挡不住内存里为了跑任务而解开的密钥。Snowflake 客户被盗证明,木马日志里的旧密码只要还有效,就会被当成钥匙串批发。两次都不需要攻破云厂商的核心网络。它们需要的是一把没人认领、也没有到期日的凭证。

因此真正的分界不是“有没有轮换过”,而是钥匙有没有主人、有没有寿命、有没有调用范围。做不到这三样,轮换只是把同一把风险换成新的字符串。做得到,多数静态密钥会自己变成临时凭证——不是因为厂商的发布会这么说,而是因为没人再愿意为一把不能作废的钥匙背锅。

本文著作权归作者 [ doudoudoubao ] 享有,未经作者书面授权,禁止转载,封面图片来源于 [ 互联网 ] ,本文仅供个人学习、研究和欣赏使用。如有异议,请联系博主及时处理。

发表留言