使用存储桶密钥的服务器端加密(SSE-KMS)
MinIO 服务器端加密 (SSE) 可在写入操作中保护对象, 允许客户端利用服务器的处理能力在存储层保护对象(静态加密). SSE 还提供关键功能,满足安全锁定和擦除方面的监管和合规要求.
MinIO SSE 使用 https://minio.org.cn/docs/kes/MinIO 密钥加密服务(KES)<> ` 和 :kes-docs: 支持的外部密钥管理服务 (KMS) <#supported-kms-targets> ` 来大规模执行安全的加密操作. MinIO 还支持客户端管理的密钥管理, 应用程序完全负责创建和管理与 MinIO SSE 一起使用的加密密钥.
MinIO SSE-KMS 使用密钥管理系统 (KMS) 管理的外部密钥 (EK) 对对象进行加密或解密. 每个桶和对象都可以有单独的 EK, 在部署中支持更细粒度的加密操作. MinIO 只有在能够访问 KMS 和 用于加密对象的 EK 时才能解密对象.
您可以使用 mc encrypt set 命令启用加密桶默认 SSE-KMS 加密功能:
mc encrypt set sse-kms EXTERNALKEY play/mybucket
- 将 - EXTERNALKEY替换为用于加密存储桶中对象的 EK 的名称。
- 将 - play/mybucket替换为您想要启用自动SSE-KMS加密的- 别名和存储桶。
MinIO SSE-KMS在功能上与AWS S3兼容 Server-Side Encryption with KMS keys stored in AWS,同时将支持扩展到以下KMS提供商:
快速开始
重要
在 MinIO 部署中启用 SSE 将会自动使用默认加密密钥加密该部署的后端数据。
MinIO  需要 访问 KES 和外部 KMS 以解密后端并正常启动。
KMS 必须 维护并提供对 MINIO_KMS_KES_KEY_NAME 的访问。
以下步骤使用 play MinIO KES 沙盒来支持 SSE 与SSE-KMS,
适用于评估和早期开发环境。
对于扩展开发或生产环境,请使用以下支持的 外部密钥管理服务(KMS)之一:
重要
MinIO KES的 Play 沙盒是公开的,并授予所有创建的外部密钥(EK)根访问权限。
存储在 Play 沙盒上的任何外部密钥(EK)都可能随时被访问或销毁,这会使得受保护的数据变得脆弱或永久不可读。
- 永远不要 使用 - Play沙盒来保护您无法承受丢失或泄露的数据。泄露的数据。
- 永远不要 使用能揭示您组织私人、机密或内部命名约定的名称来生成外部密钥(EK)。生成 EK 。 
- 永远不要 将 - Play沙盒用于生产环境。
此过程需要以下组件:
- 在可上网的机器上安装 MinIO 密钥加密服务 (KES) . 有关下载的说明,请参阅 - kesGetting Started 指南, 安装和配置 KES.
1) 创建一个用于SSE-KMS加密的加密密钥
使用 kes 命令行工具创建新的外部密钥 (EK),与 SSE-KMS 加密一起使用。
下面的命令将为 play KES 服务器检索根 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'
在终端或壳中设置以下环境变量:
export KES_CLIENT_KEY=root.key
export KES_CLIENT_CERT=root.cert
| 
 | KES 服务器上 identity 的私钥.
身份必须至少允许访问  | 
|---|---|
| 
 | KES 服务器上 identity 的相应证书.
该步骤使用 MinIO  | 
下面的命令通过 KES 创建一个新的 EK。
kes key create my-minio-sse-kms-key
为便于参考, 本教程使用了 my-minio-sse-kms-key 名称示例.
指定唯一的密钥名称, 以防止与现有密钥冲突.
2) 配置MinIO以使用SSE-KMS对象加密
请在部署的每个MinIO服务器主机的shell或终端中指定 以下环境变量:
export MINIO_KMS_KES_ENDPOINT=https://play.minio.org.cn: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
备注
- API 密钥是与 KES 服务器进行身份验证的首选方式,因为它提供了一个简化、安全的 KES 服务器身份验证过程。 
- 或者,指定 - MINIO_KMS_KES_KEY_FILE和- MINIO_KMS_KES_CERT_FILE而不是- MINIO_KMS_KES_API_KEY。- API 密钥与基于证书的身份验证相互排斥。 指定 API 密钥变量 或 密钥文件和证书文件变量。 
- 本网站的文档使用 API 密钥。 
| MinIO  | |
| 用于 MinIO 部署的 API 密钥 :kes-docs:` 由 KES <tutorials/kes-for-minio/#kes-server-setup>` 生成。 API 密钥的身份必须授予创建、生成和解密密钥的权限。 API 密钥是与 KES 服务器进行身份验证的首选方式。
如果情况需要,请指定  | |
| 用于执行 SSE 加密操作的外部密钥 (EK) 名称. KES 从配置的密钥管理服务 (KMS) 中检索 EK. 指定上一步创建的密钥名称. | 
3) 重新启动MinIO部署以启用SSE-KMS
您必须重新启动MinIO部署以应用配置更改。
使用 mc admin service restart 命令来重新启动部署。
mc admin service restart ALIAS
用要重启的部署的 alias 替换 ALIAS .
4) 配置自动存储桶加密。
使用 mc encrypt set 命令启用对写入特定存储桶的所有对象的自动 SSE-KMS 保护.
mc encrypt set sse-kms my-minio-sse-kms-key ALIAS/BUCKET
写入指定存储桶的对象会自动使用指定的 EK 加密.
对要启用 SSE-KMS 自动加密的每个桶重复此步骤. 您可以为每个桶或桶前缀生成额外的密钥, 这样每个 EK 的范围仅限于对象的一个子集.
安全 Erasure 和锁定
SSE-KMS使用在Bucket自动加密设置的一部分 或 写操作的一部分中指定的 EK 来保护对象。 因此,MinIO 需要 访问该 EK 以解密该对象。
- 禁用该 EK 会暂时锁定使用该 EK 加密的对象, 使它们变得不可读。稍后您可以启用该 EK 以恢复这些对象上的正常读取操作。 
- 删除该 EK 会使所有使用该 EK 加密的对象 永久 不可读。 如果KMS没有或不支持 EK 的备份, 这个过程是 不可逆的。 
单个 EK 的范围取决于:
- 指定了该 EK 用于自动SSE-KMS加密的存储桶, 以及 
- 哪些写操作在请求 SSE-KMS 加密时指定了 EK . 
例如,考虑一个使用每个存储桶一个|EK|的MinIO部署。 禁用单个 EK 会导致关联存储桶中的所有对象变得不可读, 而不影响其他存储桶。 如果部署改为为所有对象 和存储桶使用一个 EK ,则禁用该 EK 会导致部署中的所有对象变得不可读。
加密过程
备注
本节介绍了MinIO的内部逻辑和功能。 此信息纯属教育性质,不是配置或 实现任何MinIO功能的先决条件。
SSE-KMS使用由配置的密钥管理系统(KMS)管理的 外部密钥(EK)来执行加密操作并保护对象。 下表描述了加密过程的每个阶段:
| Stage | 描述 | 
|---|---|
| 启用SSE的写入操作 | MinIO接收到请求SSE-KMS加密的写入操作。 写入操作 必须 具有一个相关的外部密钥(EK) 用于加密对象。 
 | 
| 生成数据加密密钥 (DEK) | MinIO 使用 EK 生成一个数据加密密钥(DEK)。 具体来说,MinIO 密钥加密服务 (KES) 使用 EK 作为 “根” 密钥,从 KMS 请求一个新的加密密钥。 KES返回明文 以及 一个 EK 加密的 DEK 表示形式。 MinIO 将加密表示形式作为对象元数据的一部分存储。 | 
| 生成密钥加密密钥 (KEK) | MinIO 使用一个确定性的算法来生成一个256位唯一的密钥加密密钥(KEK)。 密钥派生算法使用一个伪随机函数,该函数接受明文 DEK 、一个随机生成的初始化向量(IV),以及一个上下文,其中包含诸如存储桶和对象名称等值。 MinIO 在每次加密或解密操作时生成 KEK,并且 从不 将 KEK 存储在驱动器上。 | 
| 生成对象加密密钥 (OEK) | MinIO 生成一个随机的256位唯一对象加密密钥(OEK),并使用该密钥来加密对象。 MinIO 从未在驱动器上存储 OEK 的明文表示。 明文的 OEK 在加密操作期间存在于 RAM 中。 | 
| 加密对象 | MinIO在将对象存储到驱动器之前使用 OEK 加密对象。 然后,MinIO使用 KEK 加密 OEK 。 MinIO将 OEK 和 DEK 的加密表示形式作为元数据的一部分进行 存储。 | 
对于读取操作,MinIO通过检索 EK 以解密 DEK 来解密对象。 然后,MinIO重新生成 KEK , 解密 OEK 并解密 对象。
