KMS 基础概念与原理
密钥管理服务(KMS)说白了,就是帮你管加密钥匙的“保险柜”。我自己刚接触云安全时,总觉得不就是把钥匙存起来吗?后来踩过坑才明白——钥匙怎么存、怎么轮换、谁能用、怎么销毁,每步都是坑。
这一章咱们先打地基。把 KMS 的核心概念、加解密流程、密钥生命周期捋清楚。以后在多云环境里迁移、做权限隔离,全靠这些基础托底。
什么是 KMS?
KMS 是一个集中管理密钥的服务。它负责生成、存储、轮换、启用、禁用、销毁密钥。你想想看,如果每个应用都自己写加密逻辑,钥匙散落在配置文件里、代码里、甚至日志里,那还谈什么安全?
我个人习惯把 KMS 看作“钥匙管家”。服务不自建,钥匙不落地。所有加密操作通过 API 调 KMS 完成,应用侧只留个指针(Key ID)。
| 角色 | 类比 | 说明 |
|---|---|---|
| KMS | 保险柜 + 钥匙匠 | 生成、保管、审计钥匙 |
| 密钥 | 物理钥匙 | 分主密钥、数据密钥 |
| 访问控制 | 库管员 | 谁有权限拿钥匙 |
| API 调用 | 窗口递条子 | 应用通过 API 请求加密/解密 |
密钥的生命周期
密钥从生到死,一共 4 个阶段。嗯,这里要注意——很多事故都出在“禁用”到“销毁”这步。
- 创建:指定类型、用途(对称/非对称)、自动轮换周期。
- 启用/使用:业务调用,记录审计日志。
- 禁用:业务下线或怀疑泄露,立即禁用。旧数据还能留着解密。
- 销毁:确认无数据依赖后删除密钥材料。一旦销毁,神仙难救。
两种密钥:CMK 与 DEK
KMS 里最常见的区分就是 主密钥(CMK) 和 数据密钥(DEK)。为什么会这样分?
你想想,如果每段数据都直接用 CMK 加密,那流量全往 KMS 走,性能扛不住。所以实践中用“信封加密”——CMK 加密 DEK,DEK 加密数据。
- CMK(Customer Master Key):存储在 KMS 内,不离开 HSM。用于加密 DEK。
- DEK(Data Encryption Key):由 KMS 生成,明文发给应用。应用用 DEK 加密本地数据,用完即可丢弃。
这样做的好处:数据加密在本地完成,KMS 只处理少量的 DEK 加解密请求。上层的 CMK 又受 HSM 保护,一箭双雕。
HSM 的作用
HSM(硬件安全模块)是 KMS 的物理根基。说白了就是一个专用的加密芯片或板卡。钥匙放在 HSM 里,物理上没法强行读走。
我在做金融客户项目时遇到过监管要求:密钥必须存放在通过 FIPS 140-2 Level 3 认证的 HSM 中。当时选了云厂商的专属 HSM 集群,一个机柜就占半个机架。贵,但合规。
KMS 底层是否用 HSM,决定了这个保险柜的“物理强度”。公有云 KMS 默认用软件 HSM(vHSM),如果需要更强的合规隔离,就得买专属 HSM 实例。
核心工作流程:信封加密
信封加密是你日常用的最多的一种模式。流程如下:
- 应用调用 KMS API 生成 DEK(明文 + 密文)。
- 应用用明文 DEK 加密本地数据,然后丢弃明文 DEK。
- 将 DEK 密文(被 CMK 加密过的)和数据一起存盘。
- 读取时:从盘上取出 DEK 密文,调用 KMS 解密,拿到明文 DEK,再解密数据。
这里面有一个关键点:每次生成的 DEK 都不一样。即使两次数据一模一样,加密结果也不同。这样就防住了重放攻击和频率分析。
// 伪代码示例:信封加密
# 生成数据密钥
decrypted_dek, encrypted_dek = kms.generate_data_key(key_id='cmk-abc123')
# 使用明文DEK加密文件
ciphertext = aes_gcm_encrypt(plaintext, decrypted_dek)
ciphertext += nonce + tag
# 丢弃decrypted_dek, 仅存储encrypted_dek和ciphertext
storage.write(encrypted_dek + ciphertext)
KMS 的访问控制模型
密钥很金贵,不能随便给人。KMS 的权限隔离一般靠 IAM 策略 + 密钥策略双重管控。
- IAM 策略:控制“谁能调用 KMS API”。比如某运维角色只能解密,不能创建密钥。
- 密钥策略:控制“某个具体密钥能被谁操作”。常用于跨账号共享场景。
举个例子,你在多云环境里,A 账号的 CMK 要授权 B 账号的某个角色来使用。那就得在密钥策略里指定 B 账号的 IAM 角色 ARN,同时在 B 账号侧也设置信任关系。
本章知识体系
下面这张图把上面提到的核心概念串起来了。你看一眼,就能明白 KMS 在整个加密体系里扮演什么角色。
常见误解与纠偏
- 误解1:KMS 自己能直接加密大数据。 其实是错的。KMS 只加密 DEK,数据加密在本地完成。
- 误解2:密钥轮换会自动重加密数据。 不会。轮换只影响新生成的 DEK,旧 DEK 照用。
- 误解3:所有云厂商 KMS 实现一样。 差很多。AWS KMS 强调自带密钥导入,Azure 严格绑定托管 HSM,GCP 的 Cloud KMS 更扁平。
搞清楚了这些基础,下一步你就能看懂多云场景下 KMS 迁移的难点在哪——不同厂商的 HSM 标准、密钥策略语法、跨账号信任模型都不一致。嗯,那些咱们下章再细聊。