MinIO 批量密钥轮换

MinIO Batch Keyrotate

MinIO 中的 批量框架 功能自  RELEASE.2022-10-08T20-11-00Z 开始提供,允许您使用 YAML 格式的批处理文件创建、管理和执行作业。批量框架的一个很酷的功能是,与在客户端运行的 `mc` 命令行工具不同,批量框架允许您使用部署 MinIO 的集群的服务器端资源。

每个批处理 YAML 文件包含一个开始处理作业的任务,MinIO 服务器会监控它直到完成。如果批处理作业在运行期间的任何时候失败,它将根据批处理文件中指定的次数重试 N 次。

目前,MinIO 批量框架支持以下两种作业类型

作业类型

描述

replicate

执行从一个 MinIO 位置到另一个 MinIO 位置的一次性复制过程。

keyrotate

执行一次性过程,循环 SSE-S3 或 SSE-KMS 对象上的加密密钥。

我们在之前的博客文章中详细介绍了 批量复制,所以一定要查看它。在这次迭代中,我们将讨论 keyrotate 以及如何使用它。

为什么要旋转密钥?

充当外部 KMS 和应用程序之间桥梁的 MinIO 组件是 MinIO 的 密钥加密服务 (KES)。KES 是一种无状态服务,在 Kubernetes 集群中运行,并将密钥分发给应用程序。由于服务本身是无状态的,因此可以对其进行扩展,并且还可以充当缓存,因此内部应用程序不必每次都与外部 KMS 通信。这减少了 KMS 上的整体负载,并使应用程序响应速度更快,因为它在本地与 MinIO 的 KES 交互。

SSE-S3 和 SSE-KMS 密钥用于在 加密 MinIO 存储桶中的对象 时对其进行加密,这些对象处于静止状态。这为安全性、治理和合规性提供了关键功能。MinIO 目前的建议是使用您自己的外部 KMS(密钥管理服务)例如 Hashicorp 的 Vault 来管理您的 SSE 密钥。但是,在接下来的几周内,我们将发布有状态 KES,它就像在 MinIO 中构建的高性能 KMS 一样,使加密的创建、删除和管理变得快速而无缝。

原因是在基础设施环境中不可避免地存在其他应用程序和服务,需要以安全的方式存储和管理密钥。因此,戴上我们的 DevOps 帽子,让每个服务的密钥都单独管理,这将是额外的技术债务,如果像这样的边缘情况没有得到考虑,可能会成为安全风险。为了简化操作,我们建议以无状态方式使用 SSE,它在 MinIO 加密层和 KMS 之间进行交互,但实际上并未存储任何数据(即密钥)。

批处理密钥旋转的内部机制

批量 keyrotate 与 MinIO 版本 RELEASE.2023-04-07T05-28-58Z 一起发布。为了旋转密钥,我们需要启动 keyrotate 批处理作业。但在我们这样做之前,我们需要将 keyrotate 批处理作业指向一个包含所需参数的批处理 YAML 文件,如下所示。

可以使用以下命令生成此文件

mc batch generate alias keyrotate

这将生成一个类似于下面的批处理 keyrotate.yaml 文件

keyrotate:
apiVersion: v1
bucket: vbucket
prefix:
encryption:
type: sse-kms # valid values are sse-s3 and sse-kms
key: my-new-keys2 # valid only for sse-kms
# context: <new-kms-key-context> # valid only for sse-kms
# optional flags based filtering criteria
# for all objects
# flags:
#   filter:
#     newerThan: "84h" # match objects newer than this value (e.g. 7d10h31s)
#     olderThan: "80h" # match objects older than this value (e.g. 7d10h31s)
#     # createdAfter: "2023-03-02T15:04:05Z07:00" # match objects created after "date"
#     # createdBefore: "2023-03-02T15:04:05Z07:00" # match objects created before "date"
#     tags:
#       - key: "name"
#         value: "pick*" # match objects with tag 'name', with all values starting with 'pick'
#     metadata:
#       - key: "content-type"
#         value: "image/*" # match objects with 'content-type', with all values starting with 'image/'
#     kmskey: "key-id" # match objects with KMS key-id (applicable only for sse-kms)
#   notify:
#     endpoint: "https://notify.endpoint" # notification endpoint to receive job status events
#     token: "Bearer xxxxx" # optional authentication token for the notification endpoint
#   retry:
#     attempts: 10 # number of retries for the job before giving up
#     delay: "500ms" # least amount of delay between each retry

上面大多数字段是不言自明的,但让我们重点介绍一下重要的字段。

type

sse-s3 还是 sse-kms

key

仅适用于 sse-kms 类型。用于解封密钥库的密钥。

context

仅适用于 sse-kms 类型。执行操作的上下文。

有时作业可能会失败,因此批处理文件还应配置重试尝试次数以及这些尝试之间的延迟。

attempts

在放弃之前完成批处理作业的尝试次数。

delay

每次尝试之间等待的时间。

如何旋转密钥

本节说明如何旋转密钥本身,但在我们开始之前,请确保满足以下先决条件。

先决条件

  • 启用了 SSE-KMS 的 MinIO 服务器。
  • mc 管理员别名设置为启用了 SSE-KMS 的 MinIO 服务器。

满足上述先决条件后,使用以下命令启动在前面 YAML 文件中配置的批处理过程

mc batch start alias/ ./keyrotate.yaml

您可以列出当前提交的批处理作业

mc batch list alias/
ID                      TYPE            USER            STARTED
Qsk1r9YBkAuwZtMB5Sq4  keyrotate       minioadmin      4 minute ago

您还可以检查作业的状态

mc batch status alias/ Qsk1r9YBkAuwZtMB5Sq4

检查批处理作业的配置

mc batch describe alias/ Qsk1r9YBkAuwZtMB5Sq4

简化和自动化的密钥旋转

如您所见,加密是 MinIO 架构的重要组成部分。MinIO 应用加密以确保对象在静止状态下是安全的,并符合法规。MinIO 的团队一直都在考虑架构的非 0 天(设计)和非 1 天(实施)阶段,也考虑了非 2 天,即维护和持续运营方面。批处理密钥旋转允许您减轻 SSE-KMS 密钥的非 2 天操作负担,并减少软件定义基础设施中的技术债务。

基准测试反复表明,启用加密后,吞吐量性能下降非常小(<1%),因此我们建议所有 MinIO 部署都使用静止加密。虽然我们正在给出建议,但所有 MinIO 部署还应使用 TLS 保护网络通信

如果您对如何使用 keyrotate 有任何疑问,请随时在 Slack 上联系我们!