1、KMS概述

说KMS,你可能会觉得不就是个加密嘛?其实不然。密钥管理服务,它更像一个保险柜管理员。你不需要管钥匙怎么炼的,也不需要担心钥匙被偷走。你只管把东西锁进去,用的时候拿钥匙开就行。

我记得有一次客户跟我抱怨,说业务系统密钥全堆在配置中心,结果一个实习生误删了生产库,差点出事。从那以后我才真正意识到,密钥管理这件事,必须有个专门的平台来扛。所以,KMS的核心价值就是:你只管拿着密钥去用,怎么生成、怎么存、怎么换、怎么防泄露——这些脏活累活都交给云平台。

KMS的核心功能

KMS看起来像黑盒子,但它里面做了四件大事。我习惯把这四件大事记成「生、用、换、审」。

  • 生:自动生成密钥,支持对称密钥、非对称密钥、密钥对。你不需要自己跑openssl生成RSA,也不用管随机数够不够随机。
  • 用:直接调用KMS的API做加密、解密、签名、验签。数据不需要离开安全域,密钥更不会出KMS。
  • 换:密钥轮转。默认一年自动换一次,你可以改成180天。我曾经见过一个项目,密钥用了三年没轮换,后来被安全审计打了大红叉。
  • 审:所有密钥操作都有操作日志。谁在什么时候用了哪把密钥、做了什么操作,全部记入日志。这个对合规特别重要。
功能描述典型场景
密钥生命周期管理创建、启用、禁用、轮转、删除数据库加密、文件加密
加密/解密支持对称和非对称算法HTTPS证书保护、数据脱敏
签名/验签数字签名验证合同签署、API请求签名
审计日志记录所有密钥操作等保合规、安全取证

我个人比较看重审计功能。你想想看,一旦密钥泄露,如果没有审计日志,你连什么时候、谁干的都查不出来。那安全就变成了摆设。

为什么需要密钥边界策略

好,核心功能你听明白了。但会有一个灵魂拷问:我把密钥放KMS,那谁有权限用这把密钥?

如果你说“有RAM权限的人都能用”,那就太危险了。比如,一个运维人员凭RAM访问到了KMS,就能直接调用Decrypt解密数据库里所有客户的身份证号。你不希望这样对吧。

所以阿里云设计了密钥边界策略。说白了,它是对密钥权限的再收窄。即使你有RAM的KMS访问权限,密钥边界策略也能限制你只能用它加密,不能解密;或者只能解某个前缀的密文。它是一种「权限的权限」,是最后一道防线。

密钥边界策略定位:在KMS密钥这一层,再叠一层访问控制保险。RAM管谁能进KMS大门,密钥边界策略管进门以后能干什么。

我在项目中遇到过这么一个坑:同事把一张生产密钥的权限授权给了一个测试环境的应用,结果测试应用误操作把生产数据解密后写到了公共Bucket里。幸亏密钥边界策略限制了只能解密指定标签的数据,不然就出大事故了。

密钥边界策略核心逻辑 密钥边界策略 访问控制边界 风险隔离 操作监管 只能加密 / 只能解密 指定密钥用途 开发/测试/生产密钥隔离 不同业务域不可互访 密钥操作全量审计 异常行为告警 安全合规 · 最小权限 · 可审计

KMS的密钥层级结构

KMS里的密钥不是一朵云,而是有层级的。我习惯画成三层:

  1. 用户主密钥(CMK):你手动创建的根密钥,也叫密钥元数据。它永远不会离开KMS硬件安全模块。
  2. 数据密钥(DEK):由CMK生成,用于加密大量业务数据。你可以把DEK拿出去用,但加密后的DEK(密文DEK)可以安全存到本地。
  3. 信封加密数据:先用DEK加密数据,再用CMK加密DEK。两层套起来,像信封一样。
层级生命周期权限粒度
用户主密钥(CMK)由管理员维护,可轮转不可导出最细粒度(可绑定边界策略)
数据密钥(DEK)短期使用,用完即可销毁中间粒度(由CMK控制生成)
信封加密数据持久存储,随业务数据保留粗粒度(脱敏保护)
一个小技巧:如果你管理多个业务,建议按业务模块创建不同的CMK和别名。不要在同一个CMK下混用金融数据和日志数据。我见过一起事故:运维误删了日志加密的CMK,结果日志解密不了才发现金融数据也用同一把密钥——恢复成本极高。

一个小故事:密钥边界策略的诞生

我之前在阿里云帮助客户做数据安全架构咨询。客户是一家金融科技公司,内部有一个数据中台团队,使用KMS做全库加密。一开始很简单:创建CMK,分配RAM权限,所有人都能用KeyId去调Encrypt和Decrypt。

后来业务越来越多,中台团队扩到30人。问题来了:运维人员A不小心把Decrypt权限泄露给了一个第三方组件。那个组件开始疯狂解密数据库里的客户手机号。如果不是安全团队及时发现,后果不堪设想。

所以阿里云推出了密钥边界策略。它允许你在密钥这一层写上:

{
  "Effect": "Allow",
  "Action": [
    "kms:Encrypt",
    "kms:Decrypt"
  ],
  "Resource": "*",
  "Condition": {
    "StringEquals": {
      "kms:EncryptionContextKey": "environment"
    }
  }
}

你看,只要加上一个环境标签条件,别人即使有权限调用Decrypt,也只能解密环境标签匹配的数据。这就是边界策略的威力。

总结:密钥边界策略的定位

说白了,密钥边界策略是在KMS权限模型之上的安。它不是替代RAM,而是专为密钥定制的第二条防线。你想想看:

  • 第一道防线:RAM权限(谁可以访问KMS)
  • 第二道防线:密钥边界策略(拿到密钥以后能做什么、不能做什么)
  • 第三道防线:审计日志(干了什么全被记录)

我在多个项目里给客户画过这个三层模型。大多数安全问题不是第一道防线出问题,而是第二道防线缺失。所以我把密钥边界策略称为「密钥安全的核心锁」。

注意:密钥边界策略不是调优建议,是安全基线。所以即使你的团队很小、只有两三个人使用KMS,我也建议你从一开始就绑上边界策略。否则以后业务膨胀、人员变更,忘记收权限的成本比你想象的高得多。