这是本节的多页打印视图。 .
数据加密(SSE)
MinIO Server-Side Encryption (SSE) 在对象写入过程中为其提供保护, 使客户端能够利用服务端的处理能力, 在存储层实现对象静态加密(encryption-at-rest)。 SSE 还为围绕安全锁定和擦除的监管与合规要求提供关键能力。
MinIO SSE 使用 MinIO Key Encryption Service (KES) 和外部 Key Management Service (KMS), 以大规模执行安全的密码学操作。 MinIO 还支持由客户端管理密钥的模式, 在这种模式下,应用程序完全负责创建和管理供 MinIO SSE 使用的加密密钥。
MinIO 支持将以下 KMS 作为中心密钥存储:
- HashiCorp KeyVault
- AWS SecretsManager
- Google Cloud SecretManager
- Azure Key Vault
- Fortanix SDKMS
- Thales Digital Identity and Security (formerly Gemalto)
MinIO SSE 需要启用 网络加密(TLS)。
支持的加密类型
MinIO SSE 在功能和 API 上兼容 AWS Server-Side Encryption, 并支持以下加密策略:
MinIO 支持使用存储在外部 KMS 中的特定 External Key (EK), 对写入某个存储桶的所有对象自动启用 SSE-KMS 加密。 客户端可以在写入操作中显式指定密钥, 以覆盖存储桶默认使用的 EK。
对于未启用自动 SSE-KMS 加密的存储桶, 客户端也可以在写入操作中指定 EK。
启用服务端加密时,MinIO 也会加密后端数据。 SSE-KMS 一旦启用便无法禁用。
相比 SSE-S3 和 SSE-C, SSE-KMS 提供更细粒度、可定制性更强的加密能力, 因此推荐优先使用。
关于如何在本地(非生产)MinIO 部署中启用 SSE-KMS, 请参见 快速开始。
MinIO 支持使用存储在外部 KMS 中的 EK, 对写入某个存储桶的所有对象自动启用 SSE-S3 加密。 MinIO SSE-S3 在整个部署范围内仅支持 一个 EK。
对于未启用自动 SSE-S3 加密的存储桶, 客户端也可以在写入操作中请求使用 SSE 加密。
启用服务端加密时,MinIO 也会加密后端数据。 SSE-KMS 一旦启用便无法禁用。
关于如何在本地(非生产)MinIO 部署中启用 SSE-S3, 请参见 快速开始。
客户端在对象写入操作中指定 EK。 MinIO 使用指定的 EK 执行 SSE-S3。
SSE-C 不支持存储桶默认加密设置, 并要求客户端自行执行全部密钥管理操作。
1 - 使用 KES 进行服务端对象加密
社区版 KES 及其文档均已弃用并归档。下方 Kubernetes 页签还引用了在 MinIO Operator 6.0.0 中移除的 Operator Console;该内容仅作为历史迁移参考保留,并不是适用于当前 v7.1.1 的部署流程。新部署在启用不可逆的服务端加密前,应选择仍受维护的 KMS 集成,并验证迁移或替代方案。
本流程假定你可以访问一个已经安装并启用了 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
重要
在 MinIO 部署上启用 SSE 后, 会自动使用默认加密密钥对该部署的后端数据进行加密。
MinIO 必须能够访问 KES 和外部 KMS, 才能解密后端并正常启动。 KMS 必须维护并提供对 MINIO_KMS_KES_KEY_NAME 的访问。 之后你不能再禁用 KES, 也不能在后续“撤销”该 SSE 配置。
前提条件
访问 MinIO 集群
你必须能够访问 Kubernetes 集群,并且 kubectl 上下文配置的权限至少具备管理员级别。
本流程假定你的权限集足以支持在 Kubernetes 集群中部署或修改与 MinIO 相关的资源,包括但不限于 pods、statefulsets、replicasets、deployments 和 secrets。
确保 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 文档 中的配置说明:
- AWS Secrets Manager
- Azure KeyVault
- Entrust KeyControl
- Fortanix SDKMS
- Google Cloud Secret Manager
- HashiCorp Vault
- Thales CipherTrust Manager (formerly Gemalto KeySecure)
流程
本流程说明如何在生产环境中使用你所选的 受支持 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 v7.1.1 Kustomize 示例。kes-configurationsecret 必须引用一个 Kubernetes Opaque Secret, 其中的stringData对象需要以server-config.yaml的形式包含完整 KES 配置。keystore字段必须包含你所选 Key Management System 的完整配置。更多说明请参阅 固定到
v7.1.1的 Kustomize 示例。 -
创建或修改 Tenant YAML,按需设置
TenantSpec.configuration的值。创建一个 Opaque Secret,在
config.env键中写入 Tenant 所需的环境变量,再让 Tenant 按名称引用该 Secret。不要把真实的 root 凭据提交到源码仓库。Secret 与 Tenant 必须位于同一个命名空间。上游对象结构见固定到
v7.1.1的 Tenant 配置示例。 -
生成新的加密密钥
说明创建密钥前先解封 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 中运行以下命令:
在新的 Terminal 或 Shell 窗口中执行以下操作:
- 将本地
mc客户端连接到 Tenant。 - 创建加密密钥。
关于如何在本地主机上安装
mc, 请参见 快速开始。 - 将本地
-
为存储桶启用 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 加密:对于 Kubernetes 集群外部客户端, 请指定通过 Ingress、Load Balancer 或类似 Kubernetes 网络控制组件暴露的服务主机名。
使用
mc cp或任何带有PutObject函数的 S3 兼容 SDK 将文件写入该存储桶。 然后你可以对该文件执行mc stat, 以确认其关联的加密元数据。
-
生成供 MinIO 使用的 KES API Key
使用 kes identity new 命令, 为 MinIO Server 生成新的 API key:
输出同时包含供 MinIO 使用的 API Key, 以及供 KES Policy 配置 使用的 Identity hash。
-
配置 MinIO 环境文件
为目标部署中的所有主机创建或修改 MinIO Server 环境文件, 使其包含以下环境变量:
将以下内容添加到每台 MinIO 主机上的 MinIO 环境文件中。 关于基础 MinIO 环境文件的更详细说明, 请参见 安装与管理、安装与管理 或 安装与管理 教程。
将
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: -
生成新的加密密钥
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 后端时使用。 -
为存储桶启用 SSE-KMS
使用 MinIO
mcCLI, 通过生成的密钥启用存储桶默认 SSE-KMS:以下命令会:
- 为 MinIO 部署创建一个新的 alias。
- 创建一个用于存储加密数据的新存储桶。
- 在该存储桶上启用 SSE-KMS 加密。
使用
mc cp或任何带有PutObject函数的 S3 兼容 SDK 将文件写入该存储桶。 然后你可以对该文件执行mc stat, 以确认其关联的加密元数据。