部署级服务端加密密钥(SSE-S3)
MinIO 服务端加密(SSE)在写入操作期间保护对象,使客户端能够利用服务端的处理能力, 在存储层保护对象(静态加密)。SSE 还为围绕安全锁定和擦除的监管与合规要求提供关键能力。
MinIO SSE 使用 MinIO Key Encryption Service (KES) 和外部 Key Management Service (KMS) 以安全方式大规模执行加密操作。MinIO 还支持 客户端自主管理密钥,即由应用全权负责创建和管理供 MinIO SSE 使用的加密密钥。
MinIO SSE-S3 使用由 Key Management System (KMS) 管理的 EK 对对象进行加/解密。
你必须在启动 MinIO 服务器时通过 MINIO_KMS_KES_KEY_NAME 环境变量指定
该 EK。对于 所有 SSE-S3 加密操作,MinIO 都使用同一个 EK。
你可以使用 mc encrypt set 命令启用存储桶默认 SSE-S3 加密:
mc encrypt set sse-s3 play/mybucket
将
play/mybucket替换为你要启用自动 SSE-KMS 加密的alias和存储桶。
MinIO SSE-S3 在功能上兼容 AWS S3 Server-Side Encryption with Amazon S3-Managed Keys, 同时将支持扩展到以下 KMS 提供商:
快速开始
Important
在 MinIO 部署上启用 SSE 后, 会自动使用默认加密密钥对该部署的后端数据进行加密。
MinIO 必须能够访问 KES 和外部 KMS,
才能解密后端并正常启动。
KMS 必须维护并提供对 MINIO_KMS_KES_KEY_NAME 的访问。
之后你不能再禁用 KES,
也不能在后续“撤销”该 SSE 配置。
以下流程使用 play MinIO KES 沙箱,在评估和早期开发环境中为 SSE-S3 提供
SSE 支持。
对于较长期的开发环境或生产环境,请使用以下受支持的外部 Key Management Services (KMS) 之一:
Important
MinIO KES Play sandbox 是公开环境,
并会为所有创建的 External Keys(EK)授予 root 级访问权限。
任何存储在 Play sandbox 上的 EK
都可能随时被访问或销毁,
从而使受保护数据暴露风险或永久不可读。
切勿 使用
Playsandbox 保护你无法承受丢失或泄露的数据。切勿 使用会暴露组织私有、机密或内部命名约定的名称来生成 EK。
切勿 在生产环境中使用
Playsandbox。
此流程需要以下组件:
在一台能够通过网络访问源部署的机器上安装
mc。 有关下载和安装mc的说明,请参阅mcInstallation Quickstart。在一台可访问互联网的机器上安装 MinIO Key Encryption Service (KES)。 有关下载、安装和配置 KES 的说明,请参阅 KES Getting Started 指南。
1) 为 SSE-S3 加密创建加密密钥
使用 kes 命令行工具创建一个新的 EK,供 SSE-S3 加密使用。
以下命令获取已连接到 KES play 沙箱的 KES 服务器的 root
identity:
curl -sSL --tlsv1.2 \
-O 'https://raw.githubusercontent.com/minio/kes/master/root.key' \
-O 'https://raw.githubusercontent.com/minio/kes/master/root.cert'
在终端或 shell 中设置以下环境变量:
export KES_CLIENT_KEY=root.key
export KES_CLIENT_CERT=root.cert
|
KES 服务器上某个 identity 的私钥。
该 identity 至少必须被授予对 |
|---|---|
|
KES 服务器上该 identity 对应的证书。
此步骤使用 MinIO |
以下命令通过 KES CLI 创建一个新的 EK:
kes key create my-minio-sse-s3-key
本教程使用示例名称 my-minio-sse-s3-key 以便引用。
请指定唯一的密钥名称,以避免与现有密钥冲突。
2) 配置 MinIO 以启用 SSE-S3 对象加密
在部署中每个 MinIO 服务器主机的 shell 或终端中设置以下环境变量:
export MINIO_KMS_KES_ENDPOINT=https://play.min.io:7373
export MINIO_KMS_KES_API_KEY=<API-key-identity-string-from-KES> # Replace with the key string for your credentials
export MINIO_KMS_KES_KEY_NAME=my-minio-sse-s3-key
Note
API key 是与 KES 服务器进行身份验证的首选方式,因为它为 KES 服务器提供了 更精简且安全的认证流程。
或者,使用
MINIO_KMS_KES_KEY_FILE和MINIO_KMS_KES_CERT_FILE替代MINIO_KMS_KES_API_KEY。API key 与基于证书的身份验证互斥。 请在 API key 变量与 Key File 和 Cert File 变量之间 二选一。
本站文档使用 API key。
MinIO |
|
与 KES 服务上的某个
identity
对应的私钥文件。该 identity 必须具备创建、生成和解密密钥的权限。
请指定与上一步中 |
|
与 KES 服务上的某个
identity
对应的公钥证书文件。该 identity 必须具备创建、生成和解密密钥的权限。
请指定与上一步中 |
|
用于执行 SSE 加密操作的 EK 名称。 KES 从已配置的 Key Management System (KMS) 中获取该 EK。 请指定上一步创建的密钥名称。 |
3) 重启 MinIO 部署以启用 SSE-S3
必须重启 MinIO 部署以应用配置变更。
使用 mc admin service restart 命令重启部署。
mc admin service restart ALIAS
将 ALIAS 替换为要重启的部署的 alias。
4) 配置存储桶自动加密
可选
如果你只打算使用客户端驱动的 SSE-S3,可以跳过此步骤。
使用 mc encrypt set 命令,为写入特定存储桶的所有对象启用自动
SSE-S3 保护。
mc encrypt set sse-s3 ALIAS/BUCKET
安全擦除与锁定
SSE-S3 使用服务器启动时通过 MINIO_KMS_KES_KEY_NAME 环境变量指定的
EK 来保护对象。因此,MinIO 必须 访问该 EK 才能解密该对象。
禁用该 EK 会使部署中经 SSE-S3 加密的对象暂时无法读取,从而被临时锁定。 你之后可以重新启用该 EK,以恢复正常读取操作。
删除该 EK 会使部署中所有经 SSE-S3 加密的对象 永久 无法读取。 如果 KMS 没有该 EK 的备份或不支持其备份,此过程 不可逆。
该 EK 的作用范围取决于:
哪些存储桶指定了自动 SSE-S3 加密,以及
哪些写入操作请求了 SSE-S3 加密。
加密过程
Note
以下部分描述 MinIO 的内部逻辑和功能。 这些信息仅用于帮助理解,并非配置或实现任何 MinIO 功能所必需。
SSE-S3 使用由已配置的 Key Management System (KMS) 管理的 EK 来执行加密操作并 保护对象。下表描述了加密过程的各个阶段:
阶段 |
说明 |
|---|---|
启用 SSE 的写入操作 |
MinIO 接收到一个请求执行 SSE-S3 加密的写入操作。
MinIO 将 |
生成数据加密密钥(DEK) |
MinIO 使用 EK 生成数据加密密钥(DEK)。 具体来说,MinIO Key Encryption Service (KES) 会以 EK 作为“根”密钥,向 KMS 请求新的加密密钥。 KES 会返回 DEK 的明文形式 以及 其经过 EK 加密后的表示。 MinIO 将加密后的表示作为对象元数据的一部分进行存储。 |
生成密钥加密密钥(KEK) |
MinIO 使用确定性算法生成唯一的 256 位密钥加密密钥(KEK)。 该密钥派生算法使用伪随机函数,并以明文 DEK、随机生成的初始化向量以及由 存储桶名称、对象名称等值构成的上下文作为输入。 MinIO 会在每次加密或解密操作时生成 KEK,并且 绝不会 将 KEK 存储到磁盘上。 |
生成对象加密密钥(OEK) |
MinIO 会生成随机且唯一的 256 位对象加密密钥(OEK),并使用该密钥加密对象。 MinIO 不会将 OEK 的明文形式存储到磁盘上。 在加密或解密操作期间,OEK 的明文仅驻留在 RAM 中。 |
加密对象 |
MinIO 在将对象写入磁盘 之前 使用 OEK 对对象进行加密。 随后,MinIO 使用 KEK 对 OEK 进行加密。 MinIO 将 OEK 和 DEK 的加密表示形式作为元数据的一部分进行存储。 |