Secrets 基础概念:到底什么东西才叫 Secrets?

做多云安全这么多年,我见过太多团队把 Secrets 管理理解成「找个地方存密码」。说实话,这个想法有点危险。今天咱们就先把地基打牢——到底什么算 Secrets,凭证、令牌、密钥、证书这些词有什么区别,以及它们的命该怎么管。

我对 Secrets 的定义

我个人习惯把 Secrets 定义为:任何能让系统或人获得非授权访问权限的敏感数据。它不光是密码,还包含连接串、API 令牌、SSH 密钥、数据库凭证、证书私钥……但凡泄露后会危害安全性的,都算。

你想想看,一个 AWS Access Key 配上 Secret Key,别人就能拉你的 EC2 列表、读你的 S3 桶。一个数据库连接串,直接就能跑 SELECT * FROM users。所以我说,Secrets 是整个身份与访问控制的命根子。

一句话记住:Secrets = 能被用来冒充合法身份的私密数据。

凭证、令牌、密钥、证书——四个容易搞混的概念

我刚开始工作时也经常把「密钥」和「令牌」混着喊,直到有一次在代码里把 当成 AES 密钥去解密……嗯,那天的日志真是五彩缤纷。咱们用一张表掰扯清楚:

类型 本质 常见形式 典型场景 泄露后果
凭证 (Credential) 身份证明(用户名+密码/密钥对) 用户名+密码、Access Key + Secret Key 登录控制台、API 认证 完全身份冒用
令牌 () 临时授权凭证(常在服务间传递) JWT、OAuth2.0 、Session ID 微服务间调用、用户会话 权限范围内的短时冒用
密钥 (Key) 加密/签名用的对称或非对称算法参数 AES 密钥、RSA 私钥、HMAC 秘密 数据加密、数字签名、TLS 握手 加密被破解、通信被监听
证书 (Certificate) 带有公钥和身份信息的数字文件(含私钥才算 Secrets) X.509 证书 (.pem, .crt, .key) TLS/SSL、mTLS、代码签名 中间人攻击、伪造身份

我的一点提醒:令牌和凭证最大的区别在于「有效期」。凭证往往持久有效,令牌一般会在几分钟到几小时内过期。所以你在设计系统时,能用令牌就别用长期凭证——这是降低泄露影响面最有效的手段。

生命周期管理——Secrets 从生到死都要有人管

很多团队只管「存」和「用」,忽略了轮换和销毁。我曾经接手过一个项目,数据库密码三年没换过,离职员工的密钥还在 CI/CD 里跑着……说实话,看着那个密钥列表,后背都凉了。

一套完整的 Secrets 生命周期应该包含以下六个阶段:

  1. 创建:强随机性生成,长度和复杂度满足安全基线。别人工敲键盘设置密码。
  2. 分发:通过加密通道传递给使用者。不要明文发到聊天群或 Git。
  3. 存储:使用专用的 Secrets 存储(如 Vault、AWS Secrets Manager),加密存储且审计所有访问。
  4. 使用:运行时从存储读取到内存,使用后及时清空。不要在日志里打印 Secrets。
  5. 轮换:定期更换或按事件触发(如泄露、员工离职)。自动化是关键。
  6. 吊销/销毁:确保不再使用的 Secrets 被彻底删除,防止被利用做旧凭证攻击。

注意:吊销和销毁要配合依赖方同步更新。光删了 Vault 里的密钥,但服务还在用缓存中的旧值,那等于白干。我建议先 deactivate(失效),等确认无引用再物理删除。

一张图看清四种 Secrets 的覆盖关系

下面是四种常见 Secrets 的逻辑分类图。我特意做了分层,方便你对照自己的系统里有哪些:

Secrets 分类与关系图 Secrets 四大家族关系图 Secrets 凭证 用户名+密码 / AK+SK 令牌 JWT / OAuth 密钥 AES / RSA / HMAC 证书 X.509 证书 + 私钥 共同生命周期:创建 → 分发 → 存储 → 使用 → 轮换 → 吊销/销毁 所有 Secrets 类型(凭证、令牌、密钥、证书)都逃不开这六个阶段 注意:证书的私钥才是 Secrets,公钥部分不算。 有有效期 · 可刷新 通常长期有效

再说说生命周期里容易踩的坑

结合我自己的项目经历,总结几个常见的坑:

  • 凭证硬编码:我曾经见过把数据库密码写在 Python 脚本里推到 GitHub 公开仓库……不到五分钟就被人扫走了。解决方案:用环境变量 + 正向代理,或者直接上 Secrets 管理器。
  • 令牌不过期:有些团队图省事,把 OAuth 设成永不过期。这相当于给了攻击者一把永久钥匙。我建议把令牌有效期压到 1 小时以内,配合刷新令牌。
  • 密钥轮换没自动化:手动轮换等于没轮换。人在压力下会偷懒,而且容易忘记通知所有下游。我之前一个项目就是手动换了 RDS 密码,结果有个批处理脚本没同步,第二天告警炸了。
  • 证书私钥当公钥发:真的有人把 .key 文件和 .crt 文件弄混,直接把私钥分发给客户端。嗯,心大。

我的一个小习惯:给 Secrets 加上 owner 标签和轮换日期,然后定期扫描哪些 Secrets 超过 90 天没轮换。这样至少有个预警。你可以在 Vault 或 AWS Secrets Manager 里用 tags 实现。

总结一下这一节的核心要点

凭证、令牌、密钥、证书本质上都是 Secrets,但有效期、用途和泄露影响面差别很大。我在做多云 Secrets 工具选型时,会先问三个问题:
1. 这些秘密的生命周期能不能自动化?
2. 轮换策略是否统一?
3. 审计日志能不能追踪到每一次访问?