Secrets Manager架构设计原则
做Secrets Manager这些年,我觉得最难的不是把功能写出来。而是怎么让它既安全又好用。说白了,安全工程师和开发者的诉求往往矛盾。一个要锁得死死的,一个要拿得顺顺的。怎么平衡?
今天我就聊聊自己总结的几个设计原则。都是我在项目里踩过坑之后,回头再想明白的东西。
原则一:安全隔离,分层治理
这是最核心的一条。很多人一上来就想搞个大一统的密钥库。我劝你别这么做。你想想看,如果所有密钥都放在一个池子里,一旦被攻破,全线崩溃。
我个人习惯把密钥分成三层:
- 静态密钥:数据库密码、这类。变化频率低,但一旦泄露影响大。
- 动态密钥:临时凭证、STSToken。生命周期短,频繁轮换。
- 联邦密钥:与外部IDP绑定的身份。需要跨系统信任。
每层用不同的加密方案和访问策略。这样即使某一层被突破,也不会波及全局。我记得有次客户把生产环境密钥和测试环境密钥放在同一个桶里,结果测试环境的一个bug把生产数据库密码给暴露了。这事儿后来成了我们内部培训的经典案例。
原则二:密钥分层,根密钥必须离线
这其实是加密系统里很经典的设计——信封加密。但很多人容易忽略一个细节:谁保护最顶层的根密钥?
我在设计Secrets Manager时,强制要求根密钥不能在线存储。什么意思呢?就是你得把它放在硬件安全模块(HSM)里,最好还是“一次写入,永不读取”的那种。
来看一个典型的分层结构:
Root Key (K1) → 存储于离线HSM,仅用于解密K2
└── Key Encryption Key (K2) → 存储于内存,用于加密密钥表
└── Data Encryption Key (K3) → 每次动态生成,加密具体密钥值
这样做的好处很明显。即使攻击者拿到了内存权限,能看到的也只是K2。而K2只能解密密钥表,拿不到根密钥。想拿到K1?你得物理接触HSM,还得过生物识别。
原则三:自动轮换,减少人工干预
我曾经遇到过一家公司,他们的数据库密码是写在文本文件里的。每年改一次,还是手动改。结果有次改密码的时候打漏了一个字符,生产环境挂了整整两小时。
自动轮换这件事,说白了就是“程序帮你记住所有麻烦”。Secrets Manager应该支持两种轮换策略:
| 策略类型 | 适用场景 | 轮换周期 | 风险等级 |
|---|---|---|---|
| 定时轮换 | 静态密钥、长期凭证 | 30天 / 90天 | 低 |
| 按需轮换 | 动态密钥、临时凭证 | 按API调用/按时间 | 中 |
| 事件触发轮换 | 泄露预警、人员离职 | 即时 | 高 |
原则四:审计与监控,所有操作留痕
安全里有一句话:只有可审计的操作才是安全的。因为如果谁都查不到谁读了哪个密钥,密钥泄露了你连是谁干的都不知道。
我设计的Secrets Manager会记录以下关键事件:
- 密钥读取:谁、什么时候、从哪个IP、读取了哪个密钥
- 密钥变更:谁创建/更新/删除了密钥
- 权限变更:谁修改了访问策略
- 异常行为:短时间内大量读取、非工作时段访问
这些日志不仅用于事后追溯,还能做实时告警。比如有人凌晨三点批量读密钥,直接触发告警给安全团队。
原则五:最小权限,默认拒绝
这个原则其实几乎所有安全产品都在提。但在Secrets Manager这里要更严格。因为密钥的敏感性远高于普通资源。
我的做法是:
- 每个应用服务只能访问自己需要的密钥。不能访问其他服务的密钥。
- 即使是同一个应用,也区分“读”和“写”权限。
- 默认情况下,任何人(包括管理员)都没有权限。权限必须显式授予。
你可能会问:那管理员需要紧急访问怎么办?我留了一个“紧急访问通道”。需要两名管理员同时授权,并且所有操作都会记录并生成告警。这样既保证了应急能力,又防止了滥用。
好了,这些就是我总结的几个核心原则。安全隔离让你不会一崩全崩;密钥分层让根密钥离线;自动轮换减少人工失误;审计监控让你看得清一切;最小权限让攻击面最小化。
嗯,这些原则说起来简单。但真正在设计时,每一条背后都有无数细节。希望你能从我的经验里学到点什么,别重复踩我踩过的坑。