跳转到主要内容

使用客户端管理密钥的服务端加密(SSE-C)

MinIO Server-Side Encryption (SSE) 在写入操作过程中保护对象, 使客户端能够利用服务端处理能力在存储层实现对象保护 (静态加密,encryption-at-rest)。SSE 还提供满足安全锁定与擦除相关 监管和合规要求所需的关键能力。

本页中的步骤用于配置并启用使用客户端管理密钥的服务端加密 (SSE-C)。MinIO SSE-C 支持由客户端在对象写入磁盘 之前 驱动对象加密。客户端在执行读取操作时必须提供正确的密钥 才能解密对象。

MinIO SSE-C 在功能上兼容 Amazon Server-Side Encryption with Customer-Provided Keys.

安全擦除与锁定

SSE-C 在写入操作期间使用客户端指定的 EK 来保护对象。 前提是客户端侧的密钥管理支持禁用或删除这些密钥:

  • 禁用 EK 会通过使使用该 EK 加密的对象变得不可读,

    从而暂时锁定这些对象。之后您可以重新启用该 EK, 以恢复对这些对象的正常读取操作。

  • 删除 EK 会使所有使用该 EK 加密的对象

    永久 不可读。如果客户端侧 KMS 不支持 对 EK 进行备份,则该过程 不可逆

单个 EK 的影响范围取决于在请求 SSE-C 加密时 有多少次写入操作指定了该 EK

注意事项

复制场景中的 SSE-C

说明

变更: Server

RELEASE.2024-03-30T09-41-56Z

使用 SSE-C 加密的对象现在可以通过站点复制或存储桶复制进行复制。 早期版本的 MinIO Object Store 不会复制经过 SSE-C 加密的对象。

已发布的 Server 20260903 仍存在压缩 SSE-C 副本的继承限制。当前 main 在 #126 后,对 PUT、多段上传、COPY 和 Snowball 等所有新 SSE-C 写入禁用压缩,不受 SSE-S3/SSE-KMS 加密压缩选项影响。这会避免生成新的压缩 SSE-C 对象,但不会重写历史对象。应清点旧压缩 SSE-C 数据,保留原密钥并验证其恢复或复制,详见 SSE-C 副本完整性发布矩阵

SSE-C 会覆盖 SSE-S3 和 SSE-KMS

使用 SSE-C 加密对象后,MinIO 将不会再对该对象应用 SSE-KMSSSE-S3 加密。

快速开始

MinIO SSE-C 要求客户端执行所有密钥创建和存储操作。

本流程使用 mc 对源 MinIO 部署执行操作。 请在可访问该源部署网络的机器上安装 mc。 有关下载和安装 mc 的说明,请参见 mc Installation Quickstart

SSE-C 密钥 必须 是一个 256 位原始编码字符串或十六进制编码字符串。 客户端应用负责生成并存储该加密密钥。 MinIO 不会 存储 SSE-C 加密密钥,并且在没有客户端管理密钥的情况下无法解密 SSE-C 加密对象。

说明

说明

MinIO Client 从 RELEASE.2024-06-20T14-50-54Z 开始支持十六进制编码密钥。

1) 生成加密密钥

生成一个 256 位 base64 原始编码字符串或十六进制编码字符串作为加密密钥。

以下示例生成一个满足加密密钥要求的字符串。 生成的字符串适用于非生产环境:

cat /dev/urandom | head -c 32 | base64 -

请遵循您所在组织关于生成加密安全密钥的要求。

复制该加密密钥,以便在下一步中使用。

2) 使用 SSE-C 加密对象

MinIO 支持使用以下 AWS S3 请求头指定 SSE-C 加密:

  • X-Amz-Server-Side-Encryption-Customer-Algorithm 设置为 AES256
  • X-Amz-Server-Side-Encryption-Customer-Key 设置为加密密钥值。
  • X-Amz-Server-Side-Encryption-Customer-Key-MD5 设置为加密密钥的 128 位 MD5 摘要。

MinIO mc 命令行工具及兼容 S3 的 SDK 提供了设置这些请求头的特定语法。 某些 mc 命令(例如 mc cp)包含用于启用 SSE-C 加密的 专用参数:

mc cp ~/data/mydata.json ALIAS/BUCKET/mydata.json \
   --encrypt-key "ALIAS/BUCKET/=c2VjcmV0ZW5jcnlwdGlvbmtleWNoYW5nZW1lMTIzNAo="
  • ALIAS 替换为您要写入 SSE-C 加密对象的 MinIO 部署的 alias
  • BUCKET 替换为您要写入 SSE-C 加密对象的存储桶或存储桶前缀的完整路径。

3) 复制 SSE-C 加密对象

MinIO 支持使用以下 AWS S3 请求头,将 SSE-C 加密对象复制到另一个兼容 S3 的服务:

  • X-Amz-Copy-Source-Server-Side-Encryption-Customer-Algorithm 设置为 AES256
  • X-Amz-Copy-Source-Server-Side-Encryption-Customer-Key 设置为加密密钥值。 如果指定的密钥与用于对该对象执行 SSE-C 加密的密钥不匹配, 复制操作将失败。
  • X-Amz-Copy-Source-Server-Side-Encryption-Customer-Key-MD5 设置为加密密钥的 128 位 MD5 摘要。

源对象与目标对象使用不同 SSE-C key 时,需要同时提供两组 header:Copy-Source-* 表示源 key,普通 Server-Side-Encryption-Customer-* 表示目标 key。SILO 会在提交后严格分开两个上下文,因此 CopyObject XML 与 HTTP header 中的 checksum 字段使用目标 key 解密。详见两把 SSE-C 密钥,一份 CopyObject 响应

MinIO mc 命令行工具及兼容 S3 的 SDK 提供了设置这些请求头的特定语法。 某些 mc 命令(例如 mc cp)包含用于启用 SSE-C 加密的 专用参数:

mc cp SOURCE/BUCKET/mydata.json TARGET/BUCKET/mydata.json  \
--encrypt-key "SOURCE/BUCKET/=c2VjcmV0ZW5jcnlwdGlvbmtleWNoYW5nZW1lMTIzNAo=,TARGET/BUCKET/=c2VjcmV0ZW5jcnlwdGlvbmtleWNoYW5nZW1lMTIzNAo="
  • SOURCE/BUCKET 替换为您要读取 加密对象所在的 MinIO 部署的 alias, 以及您要读取 SSE-C 加密对象的存储桶或存储桶前缀的完整路径。
  • TARGET/BUCKET 替换为您要写入 加密对象的 MinIO 部署的 alias, 以及您要写入 SSE-C 加密对象的存储桶或存储桶前缀的完整路径。

4) 轮换对象的 SSE-C 密钥

S3 客户端可以在不重新上传对象的情况下更换其客户端密钥:发起一次复制源与复制目标为同一对象的 S3 COPY 操作,并在请求头中同时提供两把密钥:

  • X-Amz-Server-Side-Encryption-Customer-Key:Base64 编码的密钥(操作完成后对象所用的密钥)。
  • X-Amz-Copy-Source-Server-Side-Encryption-Customer-Key:Base64 编码的当前密钥(对象现在加密所用的密钥)。

源与目标还各需配套的 Customer-Algorithm: AES256Customer-Key-MD5 请求头,通常由 S3 SDK 设置。

这种自 COPY 称为 SSE-C 密钥轮换。满足仅更新元数据的条件时,服务器用旧客户端密钥解封对象加密密钥,再用新密钥重新封装,对象数据不重写。需要写入新对象数据的复制(例如某些版本化或 checksum 变更)则走普通解密、重新加密路径。客户端提供的密钥不会持久化到对象元数据中。普通 COPY 权限与版本化规则仍适用,它不是通用的原位版本编辑接口。

当前 main 的 #123 会让普通客户端自 COPY 在请求了任何 checksum 算法时走完整解密、重新加密路径,即使请求的算法与原值相同。这类重写可能改变 ETag,把多段源变为单段对象,并按完整对象数据复制,而非仅复制元数据。不带该头且满足原位条件时,密钥轮换保留既有 checksum 状态,包括原本没有 checksum 的情况。版本化与旧格式限制也可能独立触发重写。