1. Secrets 管理基础:什么是 Secrets,为什么需要专门的 Secrets 管理
1.1 先聊聊什么是 Secrets
做安全这些年,我见过太多人把数据库密码直接写在代码里。
你想想看,那个场景就像把家门钥匙挂在门上。
当时确实方便,但风险也是明摆着的。
Secrets,说白了就是那些不能让外人看到的敏感数据。
它们通常是应用程序用来验证身份、访问资源的一串钥匙。
最常见的几种,我列一下:
- 数据库连接字符串 — 用户名、密码、主机地址
- — 调用第三方服务用的令牌
- 私钥 / 证书 — TLS 证书、SSH 私钥
- 加密密钥 / 盐值 — 对称加密 key、哈希盐
- 服务账号令牌 — Kubernetes ServiceAccount、AWS IAM 密钥
- 环境变量里的密码 — 很多人觉得放环境变量就安全了,其实不完全
我个人习惯把 Secrets 分成两类:
- 凭证型 — 谁可以访问(用户名/密码、)
- 密钥型 — 什么能解密 / 签名(私钥、加密 key)
有些 Secrets 同时属于两类。比如数据库密码既是凭证又可能是加密 Key。
1.2 为什么不能把 Secrets 写死在代码里?
我记得刚入行时,项目里有个 config.json,里面躺着生产环境的数据库密码。
所有人都能访问 git 仓库。
那时候没觉得有什么问题,直到有一次代码库被 fork 出去…
嗯,那段时间我每天都在改密码。
核心风险就三条:
- 泄露面不可控 — 代码会进仓库、进 CI/CD、进镜像、进容器,每一步都可能被看到
- 变更成本高 — 改一个密码要重新构建、重新部署,还得通知所有相关方
- 审计盲区 — 谁在什么时候访问了你的数据库密码?根本查不到
下面这个表格,是我总结的几种常见管理方式对比:
| 管理方式 | 常见场景 | 风险等级 | 我见过最离谱的翻车案例 |
|---|---|---|---|
| 硬编码在源码 | 新手项目、POC | ⚡⚡⚡⚡⚡ 极高 | 某公司把 AWS Key 直接提交到 public repo,几小时后被盗刷 3 万美金 |
| 配置文件 + .gitignore | 小型团队 | ⚡⚡⚡⚡ 高 | 某运维误操作把 .env 文件 push 上去,亏了整整一天的审计才行 |
| 环境变量 | Docker、K8s | ⚡⚡⚡ 中 | 我在某项目中用环境变量传递私钥,结果 /proc 被读到,泄露了一周的数据 |
| 专门 Secrets 管理 | Vault、AWS Secrets Manager | ⚡ 低 | 基本没翻过车,配置对的话,安全性和易用性都能兼顾 |
1.3 专门的 Secrets 管理,到底解决什么问题?
说白了,就是把「钥匙」和「门」彻底分开管理。
你不用再操心钥匙放哪,只用管好谁来用钥匙。
我做过一个微服务项目,当时有 50 多个服务,每个服务要连 3 个数据库、调 5 个第三方 API。
如果全放在配置文件里,每次更新都是灾难。
那段时间我每天加班到后半夜,就是因为一个数据库密码改了,开发团队得重新部署所有服务。
专门的 Secrets 管理方案,能给你带来几点实打实的好处:
- 集中存储 — 所有 Secrets 放在一个安全仓库里,不分散到代码、配置、镜像中
- 自动轮换 — 密码、密钥定期自动更新,不用人工介入
- 细粒度访问控制 — 谁可以读哪个 Secrets,精确到每个用户、每个应用
- 审计日志 — 谁在什么时候读了哪个 Secrets,全部记录下来
- 加密传输与存储 — 存储时加密,传输时加密,不存在明文传输
我曾经遇到过一个很好的例子:某金融客户用了专门 Secrets 管理后,一次密钥泄露事件,从发现到完成轮换只用了 2 分钟。
而之前没有这个能力时,光确认泄露面就要花一天。
1.4 一个典型的 Secrets 操作流程长什么样?
我习惯用一张图来说明核心流程。下图展示服务启动时获取 Secrets 的典型架构:
这个流程里,我觉得最关键的是「应用不直接碰 Secrets」。
应用只需要说自己是谁,Sidecar 代理去后端帮它取,取完再注入到内存里。
这样做的好处是:即使应用被攻破,攻击者也拿不到后端的访问凭证。
1.5 避坑指南:我曾经踩过的坑
做 Secrets 管理这些年,我翻车的次数也不少。
下面几个是我印象最深的,分享出来给你们避避坑:
坑一:把 Secrets 塞进镜像层
我曾经在 Dockerfile 里用 ENV 指令把数据库密码写进去了。镜像推送到私仓后,以为万事大吉。结果镜像层的那个 ENV 是明文存在的,用 docker history 就能看到。后面我改用 docker secret 了,再也没犯这个错。
坑二:忘记设置 Secrets 轮换周期
某次上线后,一个 用了整整两年没换过。直到安全扫描发现这个 Key 被泄露到公共仓库了。教训就是:不管用多好的管理工具,不设轮换等于没设。
务实建议:
- 如果你的项目还小,至少把 Secrets 放到
.env文件里,并且保证它不在 git 中 - 如果团队超过 5 个人,建议上专业的 Secrets 管理工具
- 永远不要在日志里打印 Secrets。我见过有人把
DEBUG=True打开,直接在日志里输出环境变量,密码全暴露了
1.6 本章小结
这一章我们聊了 Secrets 的定义、为什么不能写死在代码里、以及专门管理能解决哪些问题。
我个人的经验是:Secrets 管理越早引入越好。越往后推,改起来的成本越高。
下一章我们会深入具体的工具和集成方法,到时会有代码示例和实操演示。
嗯,今天就先聊这么多吧。