文档

部署级服务端加密密钥(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 都可能随时被访问或销毁, 从而使受保护数据暴露风险或永久不可读。

  • 切勿 使用 Play sandbox 保护你无法承受丢失或泄露的数据。

  • 切勿 使用会暴露组织私有、机密或内部命名约定的名称来生成 EK

  • 切勿 在生产环境中使用 Play sandbox。

此流程需要以下组件:

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_CLIENT_KEY

KES 服务器上某个 identity 的私钥。 该 identity 至少必须被授予对 /v1/create/v1/generate/v1/list API endpoints 的访问权限。 此步骤使用 MinIO play KES 沙箱的 root identity,它可访问 KES 服务器上的所有操作。

KES_CLIENT_CERT

KES 服务器上该 identity 对应的证书。 此步骤使用 MinIO play KES 沙箱的 root identity,它可访问 KES 服务器上的所有操作。

以下命令通过 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_FILEMINIO_KMS_KES_CERT_FILE 替代 MINIO_KMS_KES_API_KEY

    API key 与基于证书的身份验证互斥。 请在 API key 变量与 Key File 和 Cert File 变量之间 二选一

  • 本站文档使用 API key。

MINIO_KMS_KES_ENDPOINT

MinIO Play KES 服务的端点。

MINIO_KMS_KES_KEY_FILE

与 KES 服务上的某个 identity 对应的私钥文件。该 identity 必须具备创建、生成和解密密钥的权限。 请指定与上一步中 KES_KEY_FILE 环境变量相同的 identity 私钥文件。

MINIO_KMS_KES_CERT_FILE

与 KES 服务上的某个 identity 对应的公钥证书文件。该 identity 必须具备创建、生成和解密密钥的权限。 请指定与上一步中 KES_CERT_FILE 环境变量相同的 identity 证书文件。

MINIO_KMS_KES_KEY_NAME

用于执行 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
  • ALIAS 替换为已启用 SSE-S3 的 MinIO 部署的 alias

  • BUCKET 替换为你要启用自动 SSE-S3 的 存储桶或存储桶前缀的完整路径。

安全擦除与锁定

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 将 MINIO_KMS_KES_KEY_NAME 中指定的密钥名称用作 EK

生成数据加密密钥(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 使用 KEKOEK 进行加密。

MinIO 将 OEKDEK 的加密表示形式作为元数据的一部分进行存储。