中文文档

服务器端加密每部署密钥 (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_CLIENT_KEY

KES 服务器上 identity 的私钥. 身份必须至少允许访问 /v1/create , /v1/generate , 和 /v1/list API endpoints. 此步骤使用 MinIO play KES 的 root 身份,该身份可访问 KES 服务器上的所有操作.

KES_CLIENT_CERT

KES 服务器上 identity 的相应证书. 该步骤使用 MinIO play KES sandbox 的``root``身份, 可访问 KES 服务器上的所有操作.

以下命令通过 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_FILEMINIO_KMS_KES_CERT_FILE 而不是 MINIO_KMS_KES_API_KEY

    API 密钥与基于证书的身份验证相互排斥。 指定 API 密钥变量 密钥文件和证书文件变量。

  • 本网站的文档使用 API 密钥。

MINIO_KMS_KES_ENDPOINT

MinIO Play KES服务的端点。

MINIO_KMS_KES_KEY_FILE

与KES服务上的 身份验证 对应的私钥文件。 身份验证必须授予创建、 生成和解密密钥的权限。在上一步中, 将相同的身份验证密钥文件指定为 KES_KEY_FILE 环境变量。

MINIO_KMS_KES_CERT_FILE

与KES服务上的 身份验证 对应的公共证书文件。 身份验证必须授予创建、 生成和解密密钥的权限。在上一步中, 将相同的身份验证证书指定为 KES_CERT_FILE 环境变量。

MINIO_KMS_KES_KEY_NAME

用于执行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 使用指定的键名 MINIO_KMS_KES_KEY_NAME as the External Key (EK).

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 将 OEKDEK 的加密表示存储为元数据的 一部分。 随后再使用 KEK 加密 OEK

Join Slack 商业支持购买咨询