服务器端加密每部署密钥 (SSE-S3)
MinIO服务器端加密(SSE)作为写操作的一部分保护对象,使客户端能够利用服务器处理能力在存储层对对象进行安全保护(加密在静止状态)。 SSE还为合规性要求和安全锁定和删除提供了关键功能。
MinIO SSE使用 MinIO Key Encryption Service (KES) 和外部密钥管理服务(KMS)来执行大规模的安全加密操作。 MinIO还支持客户端管理的密钥管理,其中应用程序完全负责创建和管理用于与MinIO SSE一起使用的加密密钥。
MinIO使用由密钥管理系统(KMS)管理的外部密钥(EK)对
对象进行加密和解密。 在启动MinIO服务器时,
您必须使用 MINIO_KMS_KES_KEY_NAME 环境变量指定 EK 。
MinIO对于 所有 SSE-S3加密操作使用相同的EK。
您可以使用 mc encrypt set 命令启用桶默认 SSE-S3 加密:
mc encrypt set sse-s3 play/mybucket
- 请将 - play/mybucket替换为您想要启用自动SSE-KMS加密的- alias和存储桶。
MinIO SSE-S3 在功能上与 AWS S3 :s3-docs:`Server-Side Encryption with Amazon S3-Managed Keys <UsingServerSideEncryption.html>`兼容,同时将支持范围扩大到包括以下 KMS 提供商:
快速开始
重要
在 MinIO 部署中启用 SSE 将会自动使用默认加密密钥加密该部署的后端数据。
MinIO  需要 访问 KES 和外部 KMS 以解密后端并正常启动。
KMS 必须 维护并提供对 MINIO_KMS_KES_KEY_NAME 的访问。
以下过程使用 play MinIO KES 沙箱支持
在 SSE 评估和早期开发环境中使用SSE-S3加密。
对于扩展的开发或生产环境, 请使用以下支持的外部密钥管理服务(KMS)之一:
重要
MinIO KES的 Play 沙盒是公开的,并授予所有创建的外部密钥(EK)根访问权限。
存储在 Play 沙盒上的任何外部密钥(EK)都可能随时被访问或销毁,这会使得受保护的数据变得脆弱或永久不可读。
- 永远不要 使用 - Play沙盒来保护您无法承受丢失或泄露的数据。泄露的数据。
- 永远不要 使用能揭示您组织私人、机密或内部命名约定的名称来生成外部密钥(EK)。生成 EK 。 
- 永远不要 将 - Play沙盒用于生产环境。
此过程需要以下组件:
- 在可通过网络访问源部署的机器上安装 - mc. 有关下载和安装- mc的说明,请参阅- mcInstallation Quickstart .
- 在可上网的机器上安装 MinIO 密钥加密服务 (KES). 请参阅 KES Getting Started 指南,了解有关下载、安装、调试和调试的说明, 和配置 KES. 
1) 为 SSE-S3 加密创建一个加密密钥。
使用 kes 命令行工具创建新的外部密钥 (EK),与 SSE-S3 加密一起使用.
以下命令将检索连接到 KES 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 CLI 创建新的 EK :
kes key create my-minio-sse-s3-key
为便于参考,本教程使用了 my-minio-sse-s3-key 名称示例.
指定唯一的密钥名称以防止与现有密钥冲突.
2) 为 SSE-S3 对象加密配置 MinIO
在部署的每个 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  | |
| 与KES服务上的
身份验证
对应的私钥文件。 身份验证必须授予创建、
生成和解密密钥的权限。在上一步中,
将相同的身份验证密钥文件指定为  | |
| 与KES服务上的
身份验证
对应的公共证书文件。 身份验证必须授予创建、
生成和解密密钥的权限。在上一步中,
将相同的身份验证证书指定为  | |
| 用于执行SSE加密操作的外部 密钥(EK)的名称。 KES从配置的 密钥管理系统(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
安全 Erasure 和锁定
SSE-S3使用在服务器启动时使用 MINIO_KMS_KES_KEY_NAME
环境变量指定的 EK 来保护对象。 因此,
MinIO 需要 访问该 EK 来解密该对象。
- 暂时禁用 EK 会将SSE-S3加密的对象锁定在部署中, 使其无法读取。 稍后您可以启用 EK 以恢复 正常的读操作。 
- 删除 EK 会使部署中的所有SSE-S3加密对象 永久性地 无法读取。 如果KMS没有或不支持备份 EK , 则此过程是 不可逆转的。 
EK 的范围取决于:
- 指定了自动SSE-S3加密的存储桶,以及 
- 请求SSE-S3加密的写入操作。 
加密过程
备注
以下部分描述了MinIO的内部逻辑和功能。 这些信息纯粹是为了教育目的, 对于配置或实现任何MinIO功能并不必要。
SSE-S3使用由配置的密钥管理系统(KMS)管理的 外部密钥(EK)来执行加密操作并保护对象。 下表描述了加密过程中的每个阶段:
| Stage | 描述 | 
|---|---|
| SSE-Enabled Write Operation | MinIO接收到一个写入操作请求SSE-S3加密。
MinIO 使用指定的键名
 | 
| Generate the Data Encryption Key (DEK) | MinIO 使用 EK 生成一个数据加密密钥(DEK)。 具体来说,MinIO 密钥加密服务 (KES) 使用 EK 作为 “根” 密钥,从 KMS 请求一个新的加密密钥。 KES返回明文 以及 一个 EK 加密的 DEK 表示形式。 MinIO 将加密表示形式作为对象元数据的一部分存储。 | 
| Generate the Key Encryption Key (KEK) | MinIO 使用一个确定性的算法来生成一个256位唯一的密钥加密密钥(KEK)。 密钥派生算法使用一个伪随机函数,该函数接受明文 DEK 、一个随机生成的初始化向量(IV),以及一个上下文,其中包含诸如存储桶和对象名称等值。 MinIO 在每次加密或解密操作时生成 KEK,并且 从不 将 KEK 存储在驱动器上。 | 
| Generate the Object Encryption Key (OEK) | MinIO 生成一个随机的256位唯一对象加密密钥(OEK),并使用该密钥来加密对象。 MinIO 从未在驱动器上存储 OEK 的明文表示。 明文的 OEK 在加密操作期间存在于 RAM 中。 | 
| Encrypt the Object | MinIO 在将对象存储到驱动器 之前 使用 OEK 对对象进行加密, 随后再使用 KEK 加密 OEK 。 MinIO 将 OEK 和 DEK 的加密表示存储为元数据的 一部分。 随后再使用 KEK 加密 OEK 。 | 
