Hashicorp Vault Keystore
本教程展示如何设置一个使用KES服务器Vault的K/V引擎作为持久且安全的密钥存储:
前提条件
要启动开发服务器或使用 Vault CLI 与 Vault 交互,请下载Vault binary.
Vault Server
KES需要Vault K/V引擎v1 or v2以及以下任一凭证AppRole或 Kubernetes 认证方法。
如果您没有现有的 Vault 集群可用,请执行以下操作之一:
- FollowHashicorp Vault 安装指南创建新集群
- 创建一个单节点开发实例
以下文档讨论了如何使用单节点开发实例进行开发设置AppRole认证方法。
单节点开发版 Vault 实例
以下命令以开发模式启动 Vault 服务器:
127.0.0.1:8200开发服务器是临时的,并且是不用于在生产环境中运行。将 Vault 连接到 Vault CLI
-
Set
VAULT_ADDR端点Vault CLI 需要知道 Vault 端点:
export VAULT_ADDR='https://127.0.0.1:8200' -
Set
VAULT_TOKENVault CLI 需要身份验证令牌才能执行操作。
export VAULT_TOKEN=hvs.O6QNQB33ksXtMxtlRKlRZL0R将令牌值替换为您自己的 Vault 访问令牌,例如
Root token在输出中提供的vault server -dev命令。 -
启用
K/V后端KES将密钥存储在Vault K/V后端。 Vault提供两种K/V引擎,
v1和v2.MinIO 推荐使用 K/V
v1engine.The Vault policy for KES depends on the chosen K/V engine version. A policy designed for K/V
v1将无法与 K/V 配合使用v2engine. 同样,为 K/V 设计的策略v2将无法与 K/V 配合使用v1engine.有关从迁移的更多信息
v1tov2请参考Hashicorp 关于从 v1 升级的文档.
设置 KES 访问 Vault
-
创建 Vault 策略
The Vault policy defines the API paths the KES server can access. 创建一个名为的文本文件
kes-policy.hcl.策略的具体内容因所使用的K/V引擎而异。
-
将策略写入 Vault
以下命令在 Vault 中创建策略:
vault policy write kes-policy kes-policy.hcl -
启用身份验证
This step allows the KES server to authenticate to Vault. For this tutorial, we use the此步骤允许 KES 服务器向 Vault 进行身份验证。 在本教程中,我们使用
AppRole认证方法。vault auth enable approle -
创建 KES 角色
以下命令添加一个名为
kes-server在 Vault:vault write auth/approle/role/kes-server token_num_uses=0 secret_id_num_uses=0 period=5m -
将策略绑定到角色
以下命令绑定
kes-server将角色分配给kes-policy:vault write auth/approle/role/kes-server policies=kes-policy -
生成 AppRole ID
为 KES 服务器请求 AppRole ID:
vault read auth/approle/role/kes-server/role-id -
生成 AppRole 密钥
为 KES 服务器请求 AppRole 密钥:
vault write -f auth/approle/role/kes-server/secret-idAppRole 密钥显示为
secret_id你可以忽略secret_id_accessor.
KES Server Setup
-
生成 KES 服务器私钥和证书
以下命令生成一个新的TLS私钥
server.key以及一个自签名的 X.509 证书server.cert对于该IP127.0.0.1和 DNS 名称localhost(as SAN)。 如果您想使用其他IP或DNS名称(例如10.1.2.3orhttps://kes.example.net, 调整--ip和/或--dns相应地调整参数。kes identity new --key server.key --cert server.cert --ip "127.0.0.1" --dns localhost上述命令会生成自签名证书。 如果您已经有为服务器颁发证书的方法,可以使用那些证书。
其他用于 X.509 证书生成的工具也适用。 例如,您可以使用
openssl:openssl ecparam -genkey -name prime256v1 | openssl ec -out server.key openssl req -new -x509 -days 30 -key server.key -out server.cert \ -subj "/C=/ST=/L=/O=/CN=localhost" -addext "subjectAltName = IP:127.0.0.1" -
生成一个API密钥
以下命令生成一个新的KES API密钥。
kes identity new输出类似于以下内容:
Your API key: kes:v1:ABfa1xsnIV0lltXQC8tHXic8lte7J6hT7EoGv6+s5QCW This is the only time it is shown. Keep it secret and secure! Your Identity: cf6c535e738c1dd47a1d746366fde7f0309d1e0a8471b9f6e909833906afbbfa The identity is not a secret. It can be shared. Any peer needs this identity in order to verify your API key. The identity can be computed again via: kes identity of kes:v1:ABfa1xsnIV0lltXQC8tHXic8lte7J6hT7EoGv6+s5QCW生成的
identityis NOT一个密钥,可以公开共享。 它将在稍后的 KES 配置文件中用作管理员身份或分配给策略。The
API key本身is一个秘密,不应共享。 您始终可以重新计算 API 密钥的身份。 -
配置 KES 服务器
创建 KES 服务器配置文件:
config.yml.确保策略部分中的身份信息与
client.crt身份。 添加 approlerole_id和secret_id之前获得的。admin: # Use the identity generated above by 'kes identity new'. identity: "" # For example: cf6c535e738c1dd47a1d746366fde7f0309d1e0a8471b9f6e909833906afbbfa tls: key: private.key # The KES server TLS private key cert: public.crt # The KES server TLS certificate keystore: vault: endpoint: https://127.0.0.1:8200 version: v1 # The K/V engine version - either "v1" or "v2". engine: kv # The engine path of the K/V engine. The default is "kv". approle: id: "" # Your AppRole ID secret: "" # Your AppRole Secret -
启动 KES 服务器
KES CLI 访问
-
Set
KES_SERVER端点以下环境变量指定了 KES CLI 应该连接的 KES 服务器:
export KES_SERVER=https://127.0.0.1:7373 -
定义CLI访问凭据
以下环境变量设置客户端与 KES 服务器通信时使用的密钥:
export KES_API_KEY=kes:v1:ABfa1xsnIV0lltXQC8tHXic8lte7J6hT7EoGv6+s5QCW将值替换为您服务器的 API 密钥。 启动服务器时,服务器的 API 密钥将显示在输出中。
-
测试配置
例如,检查服务器状态:
kes status -k使用密钥生成新的数据加密密钥:
kes key dek my-key-1 -k命令输出类似于以下内容:
{ plaintext : UGgcVBgyQYwxKzve7UJNV5x8aTiPJFoR+s828reNjh0= ciphertext: eyJhZWFkIjoiQUVTLTI1Ni1HQ00tSE1BQy1TSEEtMjU2IiwiaWQiOiIxMTc1ZjJjNDMyMjNjNjNmNjY1MDk5ZDExNmU3Yzc4NCIsIml2IjoiVHBtbHpWTDh5a2t4VVREV1RSTU5Tdz09Iiwibm9uY2UiOiJkeGl0R3A3bFB6S21rTE5HIiwiYnl0ZXMiOiJaaWdobEZrTUFuVVBWSG0wZDhSYUNBY3pnRWRsQzJqWFhCK1YxaWl2MXdnYjhBRytuTWx0Y3BGK0RtV1VoNkZaIn0= }
使用 KES 与 MinIO 服务器
MinIO Server 需要 KES 来启用服务器端数据加密。
查看MinIO KES 操作指南有关将新的 KES 服务器与 MinIO 服务器配合使用所需的额外步骤。
配置参考
以下部分介绍了使用 Hashicorp Vault Keystore 作为根 KMS 存储外部密钥的 Key Encryption Service (KES) 配置设置,例如用于 MinIO 服务器端加密的密钥。
高级配置
这些额外的配置步骤可能解决特定问题。
使用K/V前缀实现多租户
Vault 可以作为多个隔离的 KES 租户的后端。
每个 KES 租户可以包含Nreplicas.
可以有M连接到同一 Vault 服务器/集群的 KES 租户。
这意味着N × MKES服务器实例可以连接到单个Vault。
在这些配置中,每个KES租户在K/V密钥引擎中都有独立的前缀。 每个KES租户都必须有对应的Vault策略。
-
对于 K/V
v1:path "kv/<tenant-name>/*" { capabilities = [ "create", "read", "delete" ] } -
对于 K/V
v2:path "kv/data/<tenant-name>/*" { capabilities = [ "create", "read" ] } path "kv/metadata/<tenant-name>/*" { capabilities = [ "list", "delete" ] }
为每个 KES 租户创建独立的配置文件。 该文件包含租户要使用的 Vault K/V 前缀。
keystore:
vault:
endpoint: https://127.0.0.1:8200
prefix: <tenant-name>
approle:
id: "" # Your AppRole ID
secret: "" # Your AppRole Secret
retry: 15s
status:
ping: 10s
tls:
ca: vault.crt # Manually trust the vault certificate since we use self-signed certificates
使用 Vault 命名空间实现多租户
Vault可以作为多个隔离的KES租户的后端。
每个KES租户可以包含Nreplicas.
可以有M连接到同一 Vault 服务器/集群的 KES 租户。
这意味着N × MKES服务器实例可以连接到单个Vault。
因此,每个 KES 租户在 K/V 密钥引擎中都有独立的前缀。 每个 KES 租户都必须有对应的 Vault 策略。
-
对于 K/V
v1:path "kv/<tenant-name>/*" { capabilities = [ "create", "read", "delete" ] } -
对于 K/V
v2:path "kv/data/<tenant-name>/*" { capabilities = [ "create", "read" ] } path "kv/metadata/<tenant-name>/*" { capabilities = [ "list", "delete" ] }
为每个 KES 租户使用不同的配置文件。 该文件包含 KES 租户应使用的 Vault 命名空间。
keystore:
vault:
endpoint: https://127.0.0.1:8200
namespace: <vault-namespace>
approle:
id: "" # Your AppRole ID
secret: "" # Your AppRole Secret
retry: 15s
status:
ping: 10s
tls:
ca: vault.crt # Manually trust the vault certificate since we use self-signed certificates
加密存储在 Vault 中的密钥
Hashicorp’s中转该功能提供了一种加密和解密存储在保险库中的密钥的方法。 这提供了额外的加密层,在特定情况下可能很有用。
启用后,Hashicorp会在Vault中存储一个密钥,用于加密或解密存储在保险库中的其他密钥。 随后,KES使用这个由保险库管理的密钥来存储或从Vault中检索密钥。
要配置 Transit,请将以下部分添加到 KES 配置 YAML 中keystore.vaultsection:
keystore:
vault:
transit: # Optionally encrypt keys stored on the K/V engine with a Vault-managed key.
engine: "" # The path of the transit engine - e.g. "my-transit". If empty, defaults to: transit (Vault default)
key: "" # The key name that should be used to encrypt entries stored on the K/V engine.