使用 HashiCorp Vault 根 KMS 的服务器端对象加密
此过程假设一台运行 MinIO 和 KES 容器的单台主机。在此过程中,您将
部署一个配置为使用 Vault 作为根 KMS 的 KES 容器。
在 Vault 上创建一个新的 EK,用于 SSE。
在 单节点单驱动模式 下部署一个 MinIO 服务器容器,该容器配置为使用 KES 容器来支持 SSE。
配置自动桶默认 SSE-KMS。
对于生产编排环境,请使用 MinIO Kubernetes 运算符来部署启用了 SSE 并配置为使用 HashiCorp Vault 的租户。
对于生产裸机环境,请参阅 MinIO on Linux 文档,了解有关使用 KES 和 HashiCorp Vault 配置 MinIO 的教程。
重要
在 MinIO 部署上启用 SSE 会自动使用默认加密密钥对该部署的后端数据进行加密。
MinIO *需要* 访问 KES *和* 根 KMS 才能解密后端并正常启动。您无法在以后禁用 KES 或在以后的某个时间点“撤消” SSE 配置。
先决条件
部署或确保可以访问 HashiCorp Vault 服务
此过程假设本地主机可以访问现有的 HashiCorp Vault 安装。Vault 快速入门 为此过程提供了足够的入门基础。请参阅 Vault 文档,了解有关部署和配置的指南。
KES 操作需要未密封的 Vault
您必须解封 Vault 实例,才能执行任何加密操作,包括密钥创建和检索。如果配置的 Vault 服务已密封,KES 会返回错误。
如果您重新启动或以其他方式密封 Vault 实例,则 KES 无法对 Vault 执行任何加密操作。您必须解封 Vault,以确保正常运行。
有关更多信息,请参阅有关 密封/解封 的 Vault 文档。
MinIO KES 支持 V1 或 V2 Vault K/V 引擎。
MinIO KES 需要使用 AppRole 身份验证连接到 Vault 服务器。您必须创建一个 AppRole,为其分配具有必要权限的策略,并检索 AppRole ID 和 Secret 以用于配置 KES。
您可以使用以下步骤来启用 AppRole 身份验证并创建必要的策略,以支持 KES 对 Vault 的核心功能
启用 AppRole 身份验证
vault auth enable approle
为 KES 创建策略
创建 具有必要功能的策略,供 KES 在访问 Vault 时使用。选择与用于存储 KES 机密的 KV 引擎相对应的选项卡
使用类似于以下内容的配置创建一个访问策略
kes-policy.hcl
path "kv/*" { capabilities = [ "create", "read", "delete" ] }
使用
vault policy write kes-policy kes-policy.hcl
将策略写入 Vault。使用类似于以下内容的配置创建一个访问策略
kes-policy.hcl
path "kv/data/*" { capabilities = [ "create", "read"] } path "kv/metadata/*" { capabilities = [ "list", "delete"] }
使用
vault policy write kes-policy kes-policy.hcl
将策略写入 Vault为 KES 创建一个 AppRole,并为其分配已创建的策略
vault write auth/approle/role/kes-role token_num_uses=0 secret_id_num_uses=0 period=5m vault write auth/approle/role/kes-role policies=kes-policy
检索 AppRole ID 和 Secret
vault read auth/approle/role/kes-role/role-id vault write -f auth/approle/role/kes-role/secret-id
安装 Podman 或类似的容器管理接口
此过程假设您拥有一个可以正常工作的 Podman 安装,并将其配置为在“Rootfull”模式下运行。
“无根”模式可能无法提供足够的权限来运行 KES,并使用必要的安全设置。有关更多信息,请参阅相关的 “无根”文档。
(Podman) 使用 Hashicorp Key Vault 部署 MinIO 和 KES,并使用服务器端加密
在开始这些步骤之前,请创建以下文件夹
mkdir -P ~/minio-kes-vault/certs
mkdir -P ~/minio-kes-vault/config
mkdir -P ~/minio-kes-vault/minio
对于 Windows 主机,请使用 Windows 风格的路径替换路径,例如 C:\minio-kes-vault\
。
1) 为 KES 和 MinIO 生成 TLS 证书
以下命令创建两个将在创建后 30 天内过期的 TLS 证书
用于 KES 的 TLS 证书,以确保它与 Hashicorp Vault 服务之间的通信安全。
用于 MinIO 的 TLS 证书,以执行对 KES 的 mTLS 身份验证。
在生产环境中使用时请谨慎
请勿使用在此过程中生成的 TLS 证书用于任何长期开发或生产环境。
请遵循组织/行业关于 TLS 证书生成和管理的最佳实践。有关创建有效证书(例如格式良好、最新和受信任)的完整指南超出了本程序的范围。
# These commands output keys to ~/minio-kes-vault/certs and ~/minio-kes-vault/certs on the host operating system
podman run --rm \
-v ~/minio-kes-vault/certs:/certs \
quay.io/minio/kes:2024-01-11T13-09-29Z identity new kes_server \
--key /certs/kes-server.key \
--cert /certs/kes-server.cert \
kes-server
podman run --rm \
-v ~/minio-kes-vault/certs:/certs \
quay.io/minio/kes:2024-01-11T13-09-29Z identity new minio_server \
--key /certs/minio-kes.key \
--cert /certs/minio-kes.cert \
minio-server
根据您的 Vault 配置,您可能需要将 kes-server.cert
作为受信任的证书颁发机构传递。有关更多信息,请参阅 Hashicorp Vault 配置文档。请参考客户端文档以获取有关信任第三方 CA 的说明。
2) 创建 KES 和 MinIO 配置
创建 KES 配置文件
使用您喜欢的文本编辑器创建配置文件。以下示例使用
nano
nano ~/minio-kes-vault/config/kes-config.yaml
KES 使用 YAML 格式的配置文件。以下 YAML 提供了使用 Hashicorp Vault 作为根 KMS 所需的最小字段。您必须修改此 YAML 以反映您的部署环境。
address: 0.0.0.0:7373 # Disable the root administrator identity, as we do not need that level of access for # supporting SSE operations. admin: identity: disabled # Specify the TLS keys generated in the previous step here # For production environments, use keys signed by a known and trusted Certificate Authority (CA). tls: key: /certs/kes-server.key cert: /certs/kes-server.cert # Specify the path to CAs used by KES for validating client certificates # This can alternatively be a single CA # KES uses these CAs in addition to the system trust store for validating client certificates. ca: /certs/CAs/ # Sets access policies for KES # The `minio` policy grants access to the listed APIs. policy: minio: allow: - /v1/key/create/* # You can replace these wildcard '*' with a string prefix to restrict key names - /v1/key/generate/* # e.g. '/minio-' - /v1/key/decrypt/* - /v1/key/bulk/decrypt - /v1/key/list/* - /v1/status - /v1/metrics - /v1/log/audit - /v1/log/error identities: - MINIO_API_KEY_HASH # Replace with the hash output returned from kes identity new # Specify the connection information for the Vault server. # The endpoint should be resolvable from the host. # This example assumes that Vault is configured with an AppRole ID and # Secret for use with KES. keystore: vault: endpoint: https://HOSTNAME:8200 engine: "/path/to/engine" # Replace with the path to the K/V Engine version: "v1|v2" # Specify v1 or v2 depending on the version of the K/V Engine approle: id: "VAULTAPPID" # Hashicorp Vault AppRole ID secret: "VAULTAPPSECRET" # Hashicorp Vault AppRole Secret ID retry: 15s status: ping: 10s # Required if Vault uses certificates signed by an unknown CA, # e.g. self-signed or internal (non-globally trusted). # Replace this value with the full path to the Vault CA certificate. tls: ca: vault-tls-CA.cert
将
MINIO_IDENTITY_HASH
设置为 MinIO mTLS 证书的身份哈希。以下命令计算必要的哈希
podman run --rm \ -v ~/minio-kes-vault/certs/certs:/certs \ kes:2024-01-11T13-09-29Z tool identity of /certs/minio-kes.cert
将
vault.endpoint
替换为 Vault 服务器的域名。将
VAULTAPPID
和VAULTAPPSECRET
替换为相应的 Vault AppRole 凭据。
创建 MinIO 环境文件
使用您喜欢的文本编辑器创建环境文件。以下示例使用
nano
nano ~/minio-kes-vault/config/minio
此命令假设
minio-kes.cert
、minio-kes.key
和kes-server.cert
证书可在指定位置访问MINIO_ROOT_USER=myminioadmin MINIO_ROOT_PASSWORD=minio-secret-key-change-me MINIO_VOLUMES="/mnt/data" # KES Configurations MINIO_KMS_KES_ENDPOINT=https://127.0.0.1:7373 MINIO_KMS_KES_CERT_FILE=/certs/minio-kes.cert MINIO_KMS_KES_KEY_FILE=/certs/minio-kes.key MINIO_KMS_KES_CAPATH=/certs/server.cert MINIO_KMS_KES_KEY_NAME=minio-backend-default-key MINIO_KMS_KES_ENCLAVE=<name>
MinIO 使用
MINIO_KMS_KES_KEY_NAME
密钥执行以下加密操作MinIO 使用
MINIO_KMS_KES_ENCLAVE
密钥定义要使用的 KES enclave 的名称。将
<name>
替换为要使用的 enclave 的名称。如果未定义,MinIO 不会发送任何 enclave 信息。这可能导致使用有状态 KES 服务器的默认 enclave。
KES enclave 将其关联的密钥与有状态 KES 服务器上的其他 enclave 隔离。
minio-kes
证书仅启用 MinIO 部署和 KES 服务器之间的 mTLS。它们不会以其他方式为其他客户端连接到 MinIO 启用 TLS。如果根 KMS 上不存在此密钥,KES 会自动创建它。
3) 创建 Pod 和容器
本节中的命令创建以下资源
一个 Podman Pod,以促进容器通信
用于 KES 服务器的容器,配置为使用 Hashicorp Vault 作为根 KMS。
用于 MinIO 服务器的容器,在 单节点单驱动模式 下运行。
sudo podman pod create \
-p 9000:9000 -p 9001:9001 -p 7373:7373 \
-v ~/minio-kes-vault/certs:/certs \
-v ~/minio-kes-vault/minio:/mnt/minio \
-v ~/minio-kes-vault/config:/etc/default/ \
-n minio-kes-vault
sudo podman run -dt \
--cap-add IPC_LOCK \
--name kes-server \
--pod "minio-kes-vault" \
-e KES_SERVER=https://127.0.0.1:7373 \
-e KES_CLIENT_KEY=/certs/kes-server.key \
-e KES_CLIENT_CERT=/certs/kes-server.cert \
quay.io/minio/kes:2024-01-11T13-09-29Z server \
--auth \
--config=/etc/default/kes-config.yaml \
sudo podman run -dt \
--name minio-server \
--pod "minio-kes-vault" \
-e "MINIO_CONFIG_ENV_FILE=/etc/default/minio" \
quay.io/minio/minio:RELEASE.2024-02-17T01-15-57Z server \
--console-address ":9001"
您可以使用以下命令验证容器的状态
# Should show three pods - one for the Pod, one for KES, and one for MinIO
sudo podman container ls
如果所有 Pod 都在运行,您可以通过在浏览器中打开 http://127.0.0.1:9000 并使用 MinIO 环境文件中指定的根凭据登录来连接到 MinIO 部署。
4) 生成新的加密密钥
在创建密钥之前解封 Vault
您必须解封支持的 Vault 实例才能创建新的加密密钥。有关更多信息,请参阅有关 密封/解封 的 Vault 文档。
MinIO 要求 EK 在执行使用该密钥的 SSE 操作之前存在于根 KMS 上。使用 kes key create
或 mc admin kms key create
创建新的 EK 以用于 SSE。
以下命令使用 kes key create
命令添加新的外部密钥 (EK),该密钥存储在根 KMS 服务器上,用于加密 MinIO 后端。
sudo podman run --rm \
-v ~/minio-kes-vault/certs:/certs \
-e KES_SERVER=https://127.0.0.1:7373 \
-e KES_CLIENT_KEY=/certs/minio-kes.key \
-e KES_CLIENT_CERT=/certs/minio-kes.cert \
kes:2024-01-11T13-09-29Z key create -k my-new-encryption-key
您可以根据您的使用情况指定任何密钥名称,例如特定于存储桶的密钥 minio-mydata-key
。
5) 为存储桶启用 SSE-KMS
您可以使用 MinIO 控制台或 MinIO mc
CLI 来使用生成的密钥启用存储桶默认 SSE-KMS
通过在您喜欢的浏览器中导航到 http://127.0.0.1:9001 并使用为 MinIO 容器指定的根凭据登录来打开 MinIO 控制台。
登录后,创建一个新的存储桶,并根据您的喜好命名它。选择齿轮图标以打开管理视图。
选择铅笔图标在 加密 字段旁边,以打开配置存储桶默认 SSE 方案的模态。
选择 SSE-KMS,然后输入在上一步骤中创建的密钥的名称。
保存更改后,尝试将文件上传到存储桶。在对象浏览器中查看该文件时,请注意侧边栏中的元数据包含 SSE 加密方案和用于加密该对象密钥的信息。这表示对象已成功加密。
Hashicorp Vault 的配置参考
以下部分介绍了使用 Hashicorp Vault 作为 SSE 的根密钥管理服务 (KMS) 的 密钥加密服务 (KES) 配置设置。
重要
从 https://github.com/minio/minio/releases/tag/RELEASE.2023-02-17T17-52-43Z 开始,MinIO 要求扩展的 KES 权限才能执行功能。本节中的示例配置包含所有必需的权限。
以下 YAML 描述了将 Hashicorp Vault 配置为支持 SSE 的外部 KMS 所需的最小字段。
带有 ${<STRING>}
的字段使用与 <STRING>
值匹配的环境变量。您可以使用此功能来设置凭据,而无需将其写入配置文件。
YAML 假设访问 KES 的 MinIO 部署具有最小的权限集。或者,您可以省略 policy.minio-server
部分,而是将 ${MINIO_IDENTITY}
哈希设置为 ${ROOT_IDENTITY}
。
address: 0.0.0.0:7373
admin:
identity: ${ROOT_IDENTITY}
tls:
key: kes-server.key
cert: kes-server.cert
policy:
minio-server:
allow:
- /v1/key/create/*
- /v1/key/generate/*
- /v1/key/decrypt/*
- /v1/key/bulk/decrypt
- /v1/key/list/*
- /v1/status
- /v1/metrics
- /v1/log/audit
- /v1/log/error
identities:
- ${MINIO_IDENTITY}
keys:
- name: "minio-encryption-key-alpha"
- name: "minio-encryption-key-baker"
- name: "minio-encryption-key-charlie"
keystore:
vault:
endpoint: https://vault.example.net:8200
engine: "kv"
version: "v1"
namespace: "minio"
prefix: "keys"
approle:
id: ${KES_APPROLE_ID}
secret: ${KES_APPROLE_SECRET}
retry: 15s
status:
ping: 10s
tls:
key: "kes-mtls.key"
cert: "kes-mtls.cert"
ca: vault-tls.cert
键 |
描述 |
---|---|
|
KES 服务器在启动时监听的网络地址和端口。默认情况下,所有主机网络接口的端口为 |
|
KES 超级用户( 指定 |
|
KES 用于建立 TLS 安全通信的 TLS 私钥和证书。分别为私有 |
|
指定一个或多个 策略 来控制对 KES 服务器的访问。 MinIO SSE 需要访问以下 KES 密码 API
指定其他密钥不会扩展 MinIO SSE 功能,并且可能会违反围绕向客户端提供对密码密钥操作的无必要访问的安全最佳实践。 您可以通过在 KES 使用 mTLS 通过将 TLS 证书的哈希与每个配置策略的 |
|
指定一个密钥数组,这些密钥必须存在于根 KMS 上,以便 KES 成功启动。如果密钥不存在,KES 会尝试创建这些密钥,如果无法创建任何密钥,则会退出并显示错误。在完成对所有指定密钥的验证之前,KES 不会接受任何客户端请求。 |
|
Hashicorp Vault 密钥库的配置。以下字段是必需的
|