服务器端加密每部署密钥 (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
的说明,请参阅mc
Installation 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
将
ALIAS
替换为 启用了SSE-S3的MinIO部署的alias
。将
BUCKET
替换为 要启用自动SSE-S3的存储桶或存储桶前缀的完整路径。
安全 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 。 |