1. AWS KMS 作为信任锚点#
必须明确的是:集成AWS KMS并未改变Vault 内部数据加密引擎(如 Transit、KV)的运行时行为。
Vault 依然遵循经典的数据密钥(DEK)与密钥加密密钥(KEK,常称为 Master Key)的双层结构。
接入AWS KMS ,本质上是将保护“根密钥”(Root Key)的职责,从分布式的人工流程移交给了云端受严格物理与逻辑保护的硬件安全模块。
具体而言:
- 传统模式:Vault 的根密钥由 Shamir 算法拆分为多个碎片,依赖人工汇集来解封。
- KMS 模式:Vault 的根密钥在初始化时由 AWS KMS 生成并加密(此过程称为“密封”),密文存储于本地;解封时,Vault 实例通过其 IAM 身份认证,请求 KMS 解密该密文,从而安全恢复根密钥。

因此,AWS KMS 充当了整个 Vault 密钥体系的信任锚点,其安全性决定了后续所有衍生密钥的强度。
这种改变在底层提供了硬件级的安全保障,而在应用层保持了完全的透明性与一致性。
不接入第三方KMS而使用默认的Vault策略时,每当Vault服务重启时都需要重新Unseal:

2. Vault支持的Seal Type#
为满足不同环境下的安全与运维要求,Vault 支持多种密封(Seal)机制。
选择合适的机制是架构设计的核心决策之一:
| 密封类型 | 核心机制 | 自动化程度 | 信任根源 | 适用场景 |
|---|
| Shamir (默认) | 主密钥拆分为多个碎片,需达到阈值数量的人工输入方可解封。 | 低(手动) | 密钥碎片持有人与流程 | 安全隔离要求极高、可接受人工运维的环境 |
| AWS KMS | 利用 AWS IAM 身份与指定的 KMS 密钥,自动加解密 Vault 主密钥。 | 极高(全自动) | AWS CloudHSM | AWS 生态内,追求完全自动化与高可用的生产环境 |
| Azure Key Vault | 通过 Azure 托管身份(Managed Identity)对接 Key Vault 进行自动解封。 | 高(自动) | Azure 专用 HSM | Azure 生态系统 |
| GCP Cloud KMS | 基于服务账号(Service Account)权限,使用 GCP KMS 密钥进行自动解封。 | 高(自动) | Google Cloud KMS | GCP 生态系统 |
| PKCS#11 | 标准接口,直接对接本地或云端的物理硬件安全模块。 | 中(依赖硬件) | 本地物理 HSM 设备 | 混合云或本地化部署,需控制硬件根密钥 |
3. 自动解封验证#
基于 AWS KMS 的实例实现了 Auto-unseal(自动解封)。
这一过程构成了一个闭环的、基于身份的安全链条:
- 启动:Vault 服务启动。
- 认证:Vault 通过其附带的 IAM 角色/实例配置文件向 AWS 证明身份。
- 解密:Vault 将本地存储的加密主密钥密文发送至 AWS KMS,请求解密。
- 激活:KMS 验证权限并执行解密,Vault 获得明文主密钥,随即解密屏障密钥,实例转为活跃(
Sealed: false)状态。
通过 vault status 命令,可清晰观察到 Seal Type: awskms 的标志。这代表了系统已达到一种确定性的安全状态,彻底消除了因人工干预延迟或失误导致的可用性风险。

4. 上层业务加密透明#
在启用 AWS KMS Seal 的 Vault 实例(如 /aws_vault)上,所有面向业务的加密服务(如 Transit 引擎)的操作体验与标准模式完全一致,这证明了底层信任根的升级与上层应用是解耦的。
例如,配置一个 derived=true 的加密密钥(如 aws_aes_key),Transit 引擎能基于当前根密钥派生出无数唯一的数据密钥供客户端使用。客户端的加密 API 调用无需感知根密钥是由人工守护还是由 KMS 守护。


5. 使用受限的 Vault Token 进行加解密测试#
设置环境变量#
1
2
| export CIPHERHUB_VAULT_ADDR="https://cipherhub.cloud/aws_vault"
export CIPHERHUB_VAULT_TOKEN="hvs.CAESIM76f83ZzTrpOtQOZ5tC5di1OWcq9Lt63uSBWxxUB0c-Gh4KHGh2cy40SWRFOVdJT3V6TkZEdnFOd3Z2cGYyRlo"
|
加密请求#
设置明文与 CONTEXT:
1
2
3
4
| PLAIN_TEXT="信用卡号: 4111-1111-1111-1111"
PLAIN_TEXT_B64=$(echo -n "$PLAIN_TEXT" | base64)
CONTEXT_B64=$(echo -n "密码学人CipherHUB" | base64)
VAULT_ADDR="$CIPHERHUB_VAULT_ADDR" VAULT_TOKEN="$CIPHERHUB_VAULT_TOKEN" vault write -format=json aws-based-keys/encrypt/aws_aes_key plaintext="$PLAIN_TEXT_B64" context="$CONTEXT_B64"
|
得到响应:
1
2
3
4
5
6
7
8
9
10
11
12
| {
"request_id": "f7fd48c1-bf19-1883-a693-9e52bde519ea",
"lease_id": "",
"lease_duration": 0,
"renewable": false,
"data": {
"ciphertext": "vault:v1:bWzL1iFRcoiypWLz4a1TklzaawcU1r5YjCBRz/NZhkRvJyeHPKmaIWdXPzr1r2HzYSIackZqxHiTle6VoQ==",
"key_version": 1
},
"warnings": null,
"mount_type": "transit"
}
|
解密请求#
设置密文与 CONTEXT:
1
2
| CONTEXT_B64=$(echo -n "密码学人CipherHUB" | base64)
VAULT_ADDR="$CIPHERHUB_VAULT_ADDR" VAULT_TOKEN="$CIPHERHUB_VAULT_TOKEN" vault write -format=json aws-based-keys/decrypt/aws_aes_key ciphertext="vault:v1:bWzL1iFRcoiypWLz4a1TklzaawcU1r5YjCBRz/NZhkRvJyeHPKmaIWdXPzr1r2HzYSIackZqxHiTle6VoQ==" context="$CONTEXT_B64"
|
得到响应:
1
2
3
4
5
6
7
8
9
10
11
| {
"request_id": "0720bb57-b514-1f53-aad1-32112371af98",
"lease_id": "",
"lease_duration": 0,
"renewable": false,
"data": {
"plaintext": "5L+h55So5Y2h5Y+3OiA0MTExLTExMTEtMTExMS0xMTEx"
},
"warnings": null,
"mount_type": "transit"
}
|
对 plaintext 做 base64 解码:
1
2
| ❯ echo "5L+h55So5Y2h5Y+3OiA0MTExLTExMTEtMTExMS0xMTEx"|base64 -d
信用卡号: 4111-1111-1111-1111
|
其他请求默认被拒绝:
1
2
3
4
5
6
7
8
9
| VAULT_ADDR="$CIPHERHUB_VAULT_ADDR" VAULT_TOKEN="$CIPHERHUB_VAULT_TOKEN" vault write transit/keys/cipherhub_test_aes_key type="aes256-gcm96" convergent_encryption=true derived=true
Error writing data to transit/keys/cipherhub_test_aes_key: Error making API request.
URL: PUT https://cipherhub.cloud/aws_vault/v1/transit/keys/cipherhub_test_aes_key
Code: 403. Errors:
* 1 error occurred:
* permission denied
|
测试 Token 的生成策略#
在 Transit 引擎中,执行加解密操作对应的 API 动作是 POST,在 Vault 策略中对应的 capability 是 update
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| # 禁用所有基础权限,只开放指定路径
path "aws-based-keys/encrypt/aws_aes_key" {
capabilities = ["update"]
}
path "aws-based-keys/decrypt/aws_aes_key" {
capabilities = ["update"]
}
# 显式拒绝其他所有操作(Vault 默认是拒绝,但显式写出更严谨)
path "aws-based-keys/*" {
capabilities = ["deny"]
}
path "sys/*" {
capabilities = ["deny"]
}
|
将策略文件写入Vault实例中:vault policy write limited-transit-policy ./transit-restricted.hcl
基于策略生成受限Token:vault token create -policy="limited-transit-policy" -period="XXX"
最终得到临时 Token:
1
2
3
4
5
6
7
8
9
| Key Value
--- -----
token hvs.CAESIM76f83ZzTrpOtQOZ5tC5di1OWcq9Lt63uSBWxxUB0c-Gh4KHGh2cy40SWRFOVdJT3V6TkZEdnFOd3Z2cGYyRlo
token_accessor 4y2R48VHfo5x6mWBY9SNqhsk
token_duration 768h
token_renewable true
token_policies ["default" "limited-transit-policy"]
identity_policies []
policies ["default" "limited-transit-policy"]
|