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 生命周期应该包含以下六个阶段:
- 创建:强随机性生成,长度和复杂度满足安全基线。别人工敲键盘设置密码。
- 分发:通过加密通道传递给使用者。不要明文发到聊天群或 Git。
- 存储:使用专用的 Secrets 存储(如 Vault、AWS Secrets Manager),加密存储且审计所有访问。
- 使用:运行时从存储读取到内存,使用后及时清空。不要在日志里打印 Secrets。
- 轮换:定期更换或按事件触发(如泄露、员工离职)。自动化是关键。
- 吊销/销毁:确保不再使用的 Secrets 被彻底删除,防止被利用做旧凭证攻击。
注意:吊销和销毁要配合依赖方同步更新。光删了 Vault 里的密钥,但服务还在用缓存中的旧值,那等于白干。我建议先 deactivate(失效),等确认无引用再物理删除。
一张图看清四种 Secrets 的覆盖关系
下面是四种常见 Secrets 的逻辑分类图。我特意做了分层,方便你对照自己的系统里有哪些:
再说说生命周期里容易踩的坑
结合我自己的项目经历,总结几个常见的坑:
- 凭证硬编码:我曾经见过把数据库密码写在 Python 脚本里推到 GitHub 公开仓库……不到五分钟就被人扫走了。解决方案:用环境变量 + 正向代理,或者直接上 Secrets 管理器。
- 令牌不过期:有些团队图省事,把 OAuth 设成永不过期。这相当于给了攻击者一把永久钥匙。我建议把令牌有效期压到 1 小时以内,配合刷新令牌。
- 密钥轮换没自动化:手动轮换等于没轮换。人在压力下会偷懒,而且容易忘记通知所有下游。我之前一个项目就是手动换了 RDS 密码,结果有个批处理脚本没同步,第二天告警炸了。
- 证书私钥当公钥发:真的有人把 .key 文件和 .crt 文件弄混,直接把私钥分发给客户端。嗯,心大。
我的一个小习惯:给 Secrets 加上 owner 标签和轮换日期,然后定期扫描哪些 Secrets 超过 90 天没轮换。这样至少有个预警。你可以在 Vault 或 AWS Secrets Manager 里用 tags 实现。
总结一下这一节的核心要点
凭证、令牌、密钥、证书本质上都是 Secrets,但有效期、用途和泄露影响面差别很大。我在做多云 Secrets 工具选型时,会先问三个问题:
1. 这些秘密的生命周期能不能自动化?
2. 轮换策略是否统一?
3. 审计日志能不能追踪到每一次访问?