使用 KES 进行服务端对象加密
本流程假定你可以访问一个已经安装并启用了 MinIO Operator 的 Kubernetes 集群。 关于如何运行 KES,请参见 KES 文档。
在本流程中,你将完成:
创建或修改一个通过 KES 支持 SSE 的 MinIO 部署。 关于生产可用 MinIO 部署的指导,请参见 部署分布式 MinIO 教程。
使用 MinIO Operator Console 创建或管理一个 MinIO 租户。
进入该租户的 Encryption 设置,并通过 受支持的 Key Management System 配置 SSE。
创建一个新的 EK 供 SSE 使用。
配置自动化的存储桶默认 SSE-KMS。
本流程说明如何部署已配置 KES 并启用 服务端加密 的 MinIO。 关于如何运行 KES,请参见 KES 文档。
在本流程中,你将完成:
创建一个新的 EK 供 SSE 使用。
创建或修改一个通过 KES 支持 SSE 的 MinIO 部署。 关于生产可用 MinIO 部署的指导,请参见 部署分布式 MinIO 教程。
配置自动化的存储桶默认 SSE-KMS
Important
在 MinIO 部署上启用 SSE 后, 会自动使用默认加密密钥对该部署的后端数据进行加密。
MinIO 必须能够访问 KES 和外部 KMS,
才能解密后端并正常启动。
KMS 必须维护并提供对 MINIO_KMS_KES_KEY_NAME 的访问。
之后你不能再禁用 KES,
也不能在后续“撤销”该 SSE 配置。
前提条件
访问 MinIO 集群
确保 KES 可访问受支持的 KMS 目标
本流程假定已经存在一个可从 Kubernetes 集群访问的 受支持 KMS 安装。
对于与 MinIO 租户位于同一 Kubernetes 集群的部署,你可以使用 Kubernetes service 名称,让 MinIO 租户连接到目标 KMS 服务。
对于位于 Kubernetes 集群外部的部署,你必须确保该集群支持 Kubernetes services、pods 与外部网络之间的通信路由。 这可能需要配置或部署额外的 Kubernetes 网络组件,和/或启用访问公网的能力。
关于部署和配置的指导,请以你所选 KMS 方案的文档为准。
本流程假定已经存在一个 KES 安装,并已连接到受支持的 KMS 安装,且二者都可从本地主机访问。 请参照你所选 受支持 KMS 目标 的安装说明,部署 KES 并将其连接到对应 KMS 方案。
KES 操作要求目标处于 Unsealed 状态
某些受支持的 KMS 目标允许你对 Vault 实例执行 seal 或 unseal。 如果已配置的 KMS 服务处于 sealed 状态,KES 会返回错误。
如果你重启或以其他方式 seal 了 Vault 实例,KES 将无法针对该 Vault 执行任何密码学操作。 你必须对 Vault 执行 unseal,才能确保其正常运行。
关于是否需要执行 unseal 的更多信息,请参见你所选 KMS 方案的文档。
对于你所选的受支持 KMS,请参照 KES 文档 中的配置说明:
流程
本流程说明如何在生产环境中使用你所选的 受支持 KMS 方案 配置并启用服务端加密。 具体来说,本流程假定满足以下条件:
已有一个生产级 KMS 目标
一个或多个已连接到该 KMS 目标的 KES 服务器
一个或多个用于新建或现有 MinIO 部署的主机
查看 Tenant CRD
查看 Tenant CRD 中的
TenantSpec.kes对象、TenantSpec.configuration对象,以及 KES Configuration 参考。在继续之前,你必须先准备好所选外部 Key Management Service 所需的全部配置。
创建或修改 Tenant YAML,按需设置
KesConfig的值:你必须修改 Tenant YAML 或
Kustomize模板,以反映所需的 KES 配置。 以下示例摘自 MinIO Operator Kustomize 示例kes: image: "" # minio/kes:2024-06-17T15-47-05Z env: [ ] replicas: 2 kesSecret: name: kes-configuration imagePullPolicy: "IfNotPresent"
kes-configurationsecret 必须引用一个 Kubernetes Opaque Secret, 其中的stringData对象需要以server-config.yaml的形式包含完整 KES 配置。keystore字段必须包含你所选 Key Management System 的完整配置。更多说明请参阅 该 Kustomize 示例。
创建或修改 Tenant YAML,按需设置
TenantSpec.configuration的值。TODO
生成新的加密密钥
创建密钥前先解封 Vault
如果你所选的提供方有此要求, 则必须先解封底层 Vault 实例, 然后才能创建新的加密密钥。 更多信息请参考你所选 KMS 方案的文档。
MinIO 要求某个存储桶或对象使用的 EK 在执行 SSE 操作之前, 必须已经存在于根 KMS 中。 你可以针对 MinIO Tenant 使用
mc admin kms key create命令。在使用
mc管理 Tenant 之前, 你必须确保本地主机能够访问 MinIO Tenant 的 pods 和 services。 对于 Kubernetes 集群内部主机, 你可以使用 service DNS name。 对于 Kubernetes 集群外部主机, 请指定通过 Ingress、Load Balancer 或类似 Kubernetes 网络控制组件暴露的服务主机名。在单独的 Terminal 或 Shell 中运行以下命令:
# Replace '-n minio' with the namespace of the MinIO deployment # If you deployed the Tenant without TLS you may need to change the port range # You can validate the ports in use by running # kubectl get svc/minio -n minio kubectl port forward svc/minio 443:443 -n minio
在新的 Terminal 或 Shell 窗口中执行以下操作:
将本地
mc客户端连接到 Tenant。创建加密密钥。
关于如何在本地主机上安装
mc, 请参见 快速开始。# Replace USERNAME and PASSWORD with a user on the tenant with administrative permissions # such as the root user mc alias add k8s https://localhost:443 ROOTUSER ROOTPASSWORD # Replace my-new-key with the name of the key you want to use for SSE-KMS mc admin kms key create k8s encrypted-bucket-key
为存储桶启用 SSE-KMS
你可以使用 MinIO Tenant Console 或 MinIO
mcCLI, 通过生成的密钥启用存储桶默认 SSE-KMS:连接到 MinIO Tenant Console service 并登录。 对于 Kubernetes 集群内部客户端, 你可以指定 service DNS name。 对于 Kubernetes 集群外部客户端, 请指定通过 Ingress、Load Balancer 或类似 Kubernetes 网络控制组件暴露的服务主机名。
登录后,新建一个 Bucket,并按你的偏好命名。 选择齿轮 图标打开管理视图。
选择 Encryption 字段旁的铅笔 图标, 打开配置存储桶默认 SSE 方案的弹窗。
选择 SSE-KMS,然后输入上一步创建的密钥名称。
保存更改后,尝试向该存储桶上传一个文件。 在对象浏览器中查看该文件时, 请注意侧边栏中的元数据包含了 SSE 加密方案 以及用于加密该对象的密钥信息。 这表明该对象已成功加密。
使用 MinIO API Service 为 MinIO 部署创建新的 alias。 之后即可使用
mc encrypt set为存储桶启用 SSE-KMS 加密:mc alias set k8s https://minio.minio-tenant-1.svc.cluster-domain.example:443 ROOTUSER ROOTPASSWORD mc mb k8s/encryptedbucket mc encrypt set SSE-KMS encrypted-bucket-key k8s/encryptedbucket
对于 Kubernetes 集群外部客户端, 请指定通过 Ingress、Load Balancer 或类似 Kubernetes 网络控制组件暴露的服务主机名。
使用
mc cp或任何带有PutObject函数的 S3 兼容 SDK 将文件写入该存储桶。 然后你可以对该文件执行mc stat, 以确认其关联的加密元数据。
生成供 MinIO 使用的 KES API Key
使用 kes identity new 命令, 为 MinIO Server 生成新的 API key:
kes identity new
输出同时包含供 MinIO 使用的 API Key, 以及供 KES Policy 配置 使用的 Identity hash。
配置 MinIO 环境文件
为目标部署中的所有主机创建或修改 MinIO Server 环境文件, 使其包含以下环境变量:
将以下内容添加到每台 MinIO 主机上的 MinIO 环境文件中。 关于基础 MinIO 环境文件的更详细说明, 请参见 安装与管理、安装与管理 或 安装与管理 教程。
# Add these environment variables to the existing environment file MINIO_KMS_KES_ENDPOINT=https://HOSTNAME:7373 MINIO_KMS_KES_API_KEY="kes:v1:ACTpAsNoaGf2Ow9o5gU8OmcaG6Af/VcZ1Mt7ysuKoBjv" # Allows validation of the KES Server Certificate (Self-Signed or Third-Party CA) # Change this path to the location of the KES CA Path MINIO_KMS_KES_CAPATH=|kescertpath|/kes-server.cert # Sets the default KMS key for the backend and SSE-KMS/SSE-S3 Operations) MINIO_KMS_KES_KEY_NAME=minio-backend-default-key
将
HOSTNAME替换为 KES server 的 IP 地址或主机名。 如果 MinIO server 所在主机无法解析或访问指定的HOSTNAME, 该部署可能会返回错误,或启动失败。如果只使用一台 KES server 主机,请指定该主机的 IP 或主机名。
如果使用多台 KES server 主机,请指定各主机 IP 或主机名的逗号分隔列表。
MinIO 会将
MINIO_KMS_KES_KEY_NAME这个密钥 用于以下加密操作:MinIO 默认在
/etc/default/minio查找此文件。 如果你的部署将环境文件放在其他位置,请修改对应位置的文件。启动 MinIO
KES 操作要求 Vault 已解封
根据你选择的 KMS 方案, 你可能需要先将密钥实例解封,才能执行正常的加密操作,包括密钥创建或读取。 KES 需要已解封的密钥目标才能执行这些操作。
关于该实例在运行时是否需要 sealed/unsealed, 请参阅你所选 KMS 方案文档。
你必须先启动 KES,再启动 MinIO。 MinIO 部署在启动过程中需要访问 KES。
你可以使用
mc admin service restart命令重启 MinIO:mc admin service restart ALIAS
生成新的加密密钥
MinIO 要求在使用某个 EK 执行 SSE 操作之前, 该 EK 必须已存在于 KMS 中。 使用
kes key create或mc admin kms key create为 SSE 添加新的 EK。以下命令使用
mc admin kms key create在 KMS server 上添加一个新的 External Key(EK), 供加密 MinIO 后端时使用。mc admin kms key create ALIAS KEYNAME
为存储桶启用 SSE-KMS
使用 MinIO
mcCLI, 通过生成的密钥启用存储桶默认 SSE-KMS:以下命令会:
为 MinIO 部署创建一个新的 alias。
创建一个用于存储加密数据的新存储桶。
在该存储桶上启用 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, 以确认其关联的加密元数据。