华为云数据加密服务DEW实战:KMS密钥管理与信封加密
一、背景:数据加密,难的是“管钥匙”
等保、密评以及各类行业合规要求,几乎都会提到“敏感数据加密存储”。加密算法本身并不难,AES-256 有现成的库可以调用;真正难的是密钥管理:密钥放在哪里?谁可以使用?怎么定期更换?密钥泄露或误删怎么办?如果把密钥写在配置文件或代码里,加密就形同虚设。
华为云 数据加密服务 DEW(Data Encryption Workshop,新版文档中也称“密码安全中心”) 中的 密钥管理服务 KMS(Key Management Service) 提供了托管式的密钥管理:密钥由经过安全认证的硬件安全模块(HSM)保护,所有密钥操作都有访问控制并可在云审计服务中追溯,并且与对象存储 OBS、云硬盘 EVS 等云服务深度集成。本文从创建用户主密钥开始,讲清信封加密原理,再演示 OBS 与 EVS 的 KMS 加密、密钥轮换,最后总结最佳实践。
二、核心概念
| 概念 | 说明 |
|---|---|
| 用户主密钥(CMK) | KMS 中最高级别的密钥,用于加密数据密钥,密钥材料不出 KMS |
| 默认密钥 | 云服务首次使用 KMS 加密时自动创建,别名以 /default 结尾,如 obs/default、evs/default |
| 自定义密钥 | 用户自行创建的 CMK,可控制启用、禁用、轮换、授权和删除 |
| 数据加密密钥(DEK) | 直接用来加密业务数据的密钥,由 CMK 派生并加密保护 |
| 信封加密 | 用 DEK 加密数据、用 CMK 加密 DEK 的分层加密方式 |
默认密钥与自定义密钥的区别:默认密钥省心,但不支持轮换等精细化管理;自定义密钥可以按业务、环境划分,单独授权、开启轮换,更适合生产环境。每个区域可创建的自定义密钥数量有配额限制(官方文档中为 100 个,以控制台实际显示为准)。
三、创建自定义密钥(CMK)
使用前请确认当前 IAM 用户具备 KMS 相关权限(例如 KMS CMKFullAccess)。
- 登录数据加密服务(DEW)控制台,在左上角选择区域或项目。注意:密钥只能在创建它的区域使用。
- 在左侧导航中进入“密钥管理”,单击右上角“创建密钥”。
- 填写参数:
- 密钥名称:建议按“业务-环境-用途”命名,例如
order-prod-obs; - 密钥算法:对称加密场景选择
AES_256(部分区域支持国密SM4); - 密钥用途:
ENCRYPT_DECRYPT,创建后不可修改; - 托管类型:平台托管(由 KMS 生成密钥材料),或外部导入(BYOK);
- 企业项目、标签按需填写。
- 密钥名称:建议按“业务-环境-用途”命名,例如
- 单击“确定”,密钥创建后默认处于“启用”状态,在列表中可以查看密钥 ID,后续云服务和 API 都通过它引用该密钥。
四、信封加密:为什么不直接用主密钥加密数据
KMS 直接加解密的数据大小有限,而且每次都把整份数据通过网络发给 KMS,性能和成本都不可接受。华为云服务普遍采用信封加密:
加密流程:
- 调用 KMS 的“创建数据密钥”接口,指定 CMK,得到明文 DEK 和密文 DEK(密文 DEK 由 CMK 加密生成);
- 在本地用明文 DEK 加密业务数据,生成密文数据;
- 将密文 DEK 与密文数据一起存储,立即从内存中丢弃明文 DEK。
解密流程:
- 读取密文 DEK 和密文数据;
- 调用 KMS 的“解密数据密钥”接口,由同一个 CMK 解出明文 DEK;
- 在本地用明文 DEK 解密数据。
这样,大数据量的加解密都在本地完成,KMS 只负责保护“钥匙的钥匙”。需要特别注意:如果 CMK 被删除,所有用它保护的 DEK 都将无法解密,数据也就永久无法恢复。
使用华为云命令行工具 KooCLI(hcloud)可以快速体验(凭证通过 hcloud configure init 配置,切勿把 AK/SK 写进脚本):
# 1. 用指定 CMK 生成一个 256 位数据密钥,返回明文与密文
hcloud KMS CreateDatakey --cli-region="cn-north-4" \
--key_id="<your-cmk-id>" --datakey_length=256
# 2. 需要解密时,用同一 CMK 解密密文数据密钥
hcloud KMS DecryptDatakey --cli-region="cn-north-4" \
--key_id="<your-cmk-id>" --cipher_text="<cipher-datakey>" \
--datakey_cipher_length=32
本地加密部分可以使用任意成熟的密码库,例如 Python 的 cryptography:
import os
from cryptography.hazmat.primitives.ciphers.aead import AESGCM
def encrypt_file(plain_dek: bytes, src: str, dst: str):
nonce = os.urandom(12)
data = open(src, "rb").read()
ct = AESGCM(plain_dek).encrypt(nonce, data, None)
with open(dst, "wb") as f:
f.write(nonce + ct) # 密文 DEK 另行与文件一起保存
具体参数名称以 KooCLI 和 DEW API 参考文档为准,生产环境建议直接使用华为云 SDK 并配合 IAM 委托或临时凭证。
五、使用 KMS 密钥加密 OBS 对象
OBS 支持 SSE-KMS、SSE-OBS、SSE-C 三种服务端加密方式,其中 SSE-KMS 由 KMS 提供和管理密钥,适合合规要求较高的场景。为已有桶开启桶级加密:
- 进入 OBS 控制台“桶列表”,单击目标桶,进入“概览”页;
- 在“基础配置”区域单击“服务端加密”,打开开关;
- 加密模式选择“SSE-KMS”,加密密钥类型选择“自定义密钥”,并在下拉框中选中第三节创建的密钥;
- 单击“确定”。
几点注意:
- 桶加密只对开启之后上传的对象生效,不会改变已有对象的加密状态;
- 自定义密钥必须与桶位于同一区域;
- 访问 SSE-KMS 加密对象的 IAM 用户除了 OBS 权限,还需要
kms:dek:create、kms:dek:decrypt等 KMS 权限,否则会上传或下载失败; - SSE-KMS 相关请求必须使用 HTTPS,且匿名用户无法访问加密对象;
- 正在使用的密钥不能删除,否则加密对象将无法下载。
六、使用 KMS 密钥加密 EVS 云硬盘
EVS 加密使用 XTS-AES-256 算法,密钥由 KMS 提供:
- 首次使用时需要授权 EVS 访问 KMS,系统会创建名为
EVSAccessKMS的委托,并生成默认密钥evs/default; - 创建云硬盘时,在“更多”中勾选“加密”,选择默认密钥或自己创建的自定义密钥;
- 将加密盘挂载到 ECS 后,加解密对操作系统和应用透明,使用方式与普通云硬盘一致。
需要注意:加密属性在云硬盘创建后不能修改,已有的非加密盘无法直接“开启加密”;系统盘加密则依赖于加密镜像。如需把存量数据迁移到加密盘,可以新建加密盘后在系统内拷贝数据。
七、密钥轮换
KMS 支持两种轮换方式:
- 手动轮换:创建新的密钥 B,在云服务侧(如 OBS 桶加密配置)把密钥 A 替换为 B;
- 自动轮换:在密钥详情页的“轮换策略”页签打开“密钥轮换”,设置轮换周期(30~365 天,默认 365 天)。
自动轮换只更换 CMK 的密钥材料,密钥 ID、别名、权限都不变,历史数据仍能用旧材料正常解密,因此对业务无感知。但它不会重新加密已有数据,也不会轮换已经生成的 DEK。另外,自动轮换仅支持处于“启用”状态、平台托管的对称自定义密钥,默认密钥不支持轮换;每次新增的密钥材料可能产生费用,官方推荐 90、180、270 或 365 天等周期。
八、最佳实践
- 按业务和环境拆分密钥:不同系统、生产与测试使用不同 CMK,缩小单个密钥的影响面。
- 最小权限授权:区分“密钥管理员”和“密钥使用者”,应用只授予加解密数据密钥所需的权限。
- 谨慎删除,善用禁用:删除是计划删除,可设置 7~1096 天的等待期,期间可以取消;不确定是否还在用的密钥先“禁用”观察。
- 开启自动轮换:对长期使用的对称密钥开启轮换,满足合规中“定期更换密钥”的要求。
- 审计密钥使用:结合云审计服务 CTS 记录密钥的创建、禁用、删除等操作,对计划删除类高危操作配置通知。
- 关注调用量与流控:KMS 接口有流控限制,每月有一定的免费 API 调用额度,超出部分按量计费;高并发场景可在安全可控的范围内短期复用数据密钥,避免每条数据都调用一次 KMS。
九、总结
数据加密服务 DEW 的密钥管理 KMS 解决了加密中最难的“管钥匙”问题:CMK 由 HSM 保护、不出 KMS;信封加密让大数据量的加解密在本地高效完成;OBS、EVS 等云服务只需在控制台选中密钥即可实现透明加密;自动轮换与云审计配合,满足合规对密钥生命周期的要求。落地时牢记三点:按业务拆分密钥并最小授权、绝不轻易删除在用密钥、尽早开启轮换和审计,就能以很低的改造成本为云上数据加上一把可靠的锁。
- 点赞
- 收藏
- 关注作者
评论(0)