1. 凭据轮换概述

1.1 什么是凭据轮换

凭据轮换,说白了就是定期换掉你的「钥匙」。 不管是数据库密码、API 令牌还是 SSH 密钥,用久了就该换。你想想看,你家门锁半年不换,万一有人配了把钥匙呢?系统凭据也一样。

我最早接触轮换是因为一个合规审计项——PCI DSS 要求每 90 天换一次数据库密码。当时觉得真麻烦,后来才明白,这是最朴素的防线。

核心定义:凭据轮换是指按预定周期或事件触发,用新凭据替换旧凭据,并确保旧凭据立即失效的过程。

1.2 为什么需要自动轮换

手工轮换?我曾经在某金融项目里干过一晚上换 37 个数据库密码的事。凌晨三点,手抖输错一个字符,生产库直接连不上…… 嗯,从那以后我坚决推自动轮换。

  • 降低泄露风险:凭据在野存活时间越短,被利用的可能性越低。
  • 满足合规要求:SOC 2、ISO 27001、PCI DSS 都要求定期轮换。
  • 减少人为失误:手工轮换漏一个服务就出事故,我见过太多次了。
  • 应急响应提速:发现泄露后,一键触发轮换比跑机房改密码快太多了。
血的教训:不要以为凭据「没人知道」就不轮换。内部员工离职、代码仓库被扫、日志泄露…… 真出了问题再换就晚了。

1.3 常见凭据类型

不同的凭据有不同的轮换策略。我整理了一张对比表,帮你快速看清差异:

凭据类型典型示例轮换周期建议轮换难度
云厂商 Access Key30~90 天中
数据库密码MySQL 连接密码60~90 天高(需协调应用)
JWT / OAuth 令牌刷新令牌、访问令牌按过期时间(通常 1h~24h)低(自动刷新机制)
SSH 密钥服务器登录密钥对180 天或人员变动时中
TLS 证书HTTPS 证书90 天(Let's Encrypt)或 1年低(ACME 自动续签)
我的习惯:对于 ,我会设置 45 天自动轮换加 72 小时旧 Key 宽限期。这样既安全又避免应用因为缓存导致中断。

1.4 手工轮换的痛点

你可能会想:「我脚本写好了,定时跑不行吗?」告诉你,没那么简单。我在一个 SaaS 平台就踩过坑:

  1. 依赖链断裂:改了 A 服务的密码,B 服务还在用旧连接池,全报 401。
  2. 回滚困难:新凭据有问题,旧凭据已经删除,服务直接瘫了。
  3. 审计黑洞:谁换了?什么时候换的?手工操作基本靠喊。

说白了,手工轮换 + 多服务 = 事故预订。

1.5 自动轮换的核心逻辑

自动轮换不是简单「改个密码」,它是一条闭环链路。下面这张图是我经常用来和团队对齐的流程:

自动凭据轮换闭环流程 生成新凭据 存储到安全仓库 部署到应用 验证新凭据 回收旧凭据 验证失败时触发回滚

这个闭环有五个关键动作:

  • 生成新凭据:随机、高熵、符合复杂度要求。
  • 存储到安全仓库:比如 Vault、AWS Secrets Manager,而不是配置文件里硬编码。
  • 部署到应用:通过 SDK 或 Sidecar 热加载,无需重启。
  • 验证新凭据:用新凭据做一个真实请求,确认通顺。
  • 回收旧凭据:确认新凭据生效后,立即删除或禁用旧凭据。
我的建议:在验证步骤加一个「宽限期」,例如让新旧凭据同时生效 5 分钟。很多轮换事故都是因为旧凭据还在连接池里,一回收就断。

1.6 自动轮换的技术方案对比

选工具这事,我用过的坑不少。给你一个快速对比:

方案成本适合场景我踩过的坑
云原生服务(Secrets Manager)中等全云上、无自建需求跨账号轮换时权限配置复杂
HashiCorp Vault较高混合云、需要细粒度策略Initial rollout 容易忽略集群节点同步
开源脚本 + Cron低小规模、快速实验没有回滚机制,炸过两次
自定义 Sidecar高遗留系统、专用协议Sidecar 版本与主服务兼容要命的

我个人的经验是:别一开始就上最重的方案。先用云服务跑起来,再慢慢演进。想一步到位?往往半年还在规划阶段。

注意:无论选哪种方案,一定要有「轮换失败时通知」的机制。我曾经在凌晨 3 点被轮换失败告警吵醒,那次是因为数据库主从延迟导致新密码没同步到从库… 嗯,后来加了 pre-check 环节。

1.7 总结