MinIO 批量密钥轮换

MinIO 中的 批量框架 功能自 RELEASE.2022-10-08T20-11-00Z
开始提供,允许您使用 YAML 格式的批处理文件创建、管理和执行作业。批量框架的一个很酷的功能是,与在客户端运行的 `mc` 命令行工具不同,批量框架允许您使用部署 MinIO 的集群的服务器端资源。
每个批处理 YAML 文件包含一个开始处理作业的任务,MinIO 服务器会监控它直到完成。如果批处理作业在运行期间的任何时候失败,它将根据批处理文件中指定的次数重试 N 次。
目前,MinIO 批量框架支持以下两种作业类型
我们在之前的博客文章中详细介绍了 批量复制,所以一定要查看它。在这次迭代中,我们将讨论 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
上面大多数字段是不言自明的,但让我们重点介绍一下重要的字段。
有时作业可能会失败,因此批处理文件还应配置重试尝试次数以及这些尝试之间的延迟。
如何旋转密钥
本节说明如何旋转密钥本身,但在我们开始之前,请确保满足以下先决条件。
先决条件
- 启用了 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 上联系我们!