使用 KES 进行服务器端对象加密
此过程假设您使用单台主机来运行 MinIO 和 KES 容器。有关运行 KES 的说明,请参阅KES 文档。
在此过程中,您将
对于生产编排环境,请使用 MinIO Kubernetes 运算符部署启用了 SSE 并配置为与您的KMS 一起使用的租户。
对于生产裸机环境,请参阅MinIO Linux 文档,了解有关将 MinIO 与 KES 和您的KMS 配合使用的教程。
重要
在 MinIO 部署上启用 SSE 会自动使用默认加密密钥加密该部署的后端数据。
MinIO *需要* 访问 KES 和外部 KMS 才能解密后端并正常启动。KMS **必须**维护并提供对MINIO_KMS_KES_KEY_NAME
的访问权限。您以后无法禁用 KES 或在以后撤消 SSE 配置。
先决条件
确保 KES 能够访问受支持的 KMS 目标
此过程假设已安装并连接到受支持的 KMS 安装的 KES,两者都可从本地主机访问。请参阅您受支持的 KMS 目标的安装说明,以部署 KES 并将其连接到 KMS 解决方案。
KES 操作需要未密封的目标
某些受支持的 KMS 目标允许您密封或解除密封保管库实例。如果配置的 KMS 服务已密封,则 KES 将返回错误。
如果重新启动或以其他方式密封保管库实例,则 KES 无法对保管库执行任何加密操作。您必须解除密封保管库以确保正常操作。
有关是否可能需要解除密封的更多信息,请参阅您选择的 KMS 解决方案的文档。
请参阅您选择的受支持 KMS 的KES 文档中的配置说明。
安装 Podman 或类似的容器管理接口
此过程假设您已安装并配置为以“Rootfull”模式运行的工作Podman。
“Rootless”模式可能无法提供足够的权限来以必要的安全设置运行 KES。有关更多信息,请参阅相关的“rootless”文档。
部署启用服务器端加密的 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\
。
先决条件
根据您选择的受支持的 KMS 目标配置,您可能需要将 kes-server.cert
作为受信任的证书颁发机构 (CA) 传递。请参考客户端文档以获取有关信任第三方 CA 的说明。
1) 创建 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-10-31T07-42-41Z tool identity of /certs/minio-kes.cert
有关为您的 受支持的 KMS 解决方案 设置 KES 的说明,请参阅为您的所选 KMS 目标定义的附加变量。
创建 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_API_KEY=<API-key-identity-string-from-KES> # Replace with the key string for your credentials MINIO_KMS_KES_CAPATH=/certs/server.cert MINIO_KMS_KES_KEY_NAME=minio-backend-default-key
注意
API 密钥是使用 KES 服务器进行身份验证的首选方式,因为它为 KES 服务器提供了一个简化且安全的身份验证过程。
或者,指定
MINIO_KMS_KES_KEY_FILE
和MINIO_KMS_KES_CERT_FILE
而不是MINIO_KMS_KES_API_KEY
。API 密钥与基于证书的身份验证互斥。指定 API 密钥变量或密钥文件和证书文件变量。
本网站上的文档使用 API 密钥。
MinIO 使用
MINIO_KMS_KES_KEY_NAME
密钥执行以下加密操作minio-kes
证书仅启用 MinIO 部署和 KES 服务器之间的 mTLS。它们不会以其他方式为其他客户端连接到 MinIO 启用 TLS。如果根 KMS 上尚不存在此密钥,KES 会自动创建它。
2) 创建 Pod 和容器
本节中的命令创建以下资源
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-10-31T07-42-41Z 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-10-29T16-01-48Z 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 部署。
3) 生成新的加密密钥
创建密钥之前解除 Vault 密封
如果您的所选提供商需要,您必须在创建新的加密密钥之前解除支持 KMS 实例的密封。有关更多信息,请参阅您所选 KMS 解决方案的文档。
MinIO 要求在使用该密钥执行 SSE 操作之前,EK 必须存在于根 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-10-31T07-42-41Z key create -k my-new-encryption-key
您可以根据您的用例指定任何密钥名称,例如特定于存储桶的密钥 minio-mydata-key
。
4) 为存储桶启用 SSE-KMS
您可以使用 MinIO 控制台或 MinIO mc
CLI 使用生成的密钥启用存储桶默认 SSE-KMS
通过在您首选的浏览器中导航到 http://127.0.0.1:9001 并使用为 MinIO 容器指定的根凭据登录来打开 MinIO 控制台。
登录后,创建一个新的存储桶并根据您的喜好命名。选择齿轮图标以打开管理视图。
选择铅笔图标,位于 加密 字段旁边,以打开配置存储桶默认 SSE 方案的模态窗口。
选择 SSE-KMS,然后输入上一步中创建的密钥的名称。
保存更改后,尝试将文件上传到存储桶。在对象浏览器中查看该文件时,请注意,在侧边栏中,元数据包含 SSE 加密方案和用于加密该对象密钥的信息。这表示对象已成功加密。
以下命令
为 MinIO 部署创建一个新的 别名
创建一个用于存储加密数据的新的存储桶
在该存储桶上启用 SSE-KMS 加密
mc alias set local http://127.0.0.1:9000 ROOTUSER ROOTPASSWORD
mc mb local/encryptedbucket
mc encrypt set SSE-KMS encrypted-bucket-key ALIAS/encryptedbucket
使用 mc cp
或任何具有 PutObject
函数的与 S3 兼容的 SDK 将文件写入存储桶。然后,您可以对该文件运行 mc stat
以确认关联的加密元数据。