使用 MinIO Operator 简化证书管理
现代云原生架构是围绕现代对象存储构建的。MinIO 和 AWS S3 是高性能、可扩展、有弹性的数据存储的优秀示例,它们擅长为应用程序和用户提供数据服务。
安全是每个人的头等大事,必须保护敏感数据免受可能想要读取和/或更改它的攻击者的攻击,尤其是当它遍历外部网络时。传输层安全性 (TLS) v1.2+ 是云原生世界中最常用的加密传输中数据的方法。
然而,要在 Kubernetes 下成功配置和管理证书,必须克服许多挑战。最近的一项调查发现,超过 60% 的 CIO 报告说他们在过去 12 个月内经历过与证书相关的中断。生成证书需要系统结构的知识和对细节的敏锐关注。配置 TLS 是注重细节的,因此容易出错。配置完成后,必须正确应用证书并按时更新,以防止系统中断。
MinIO Operator 简化了为在 Kubernetes 上运行的 MinIO 组件生成和分配 TLS 证书的过程。MinIO 租户可以使用多个证书,其中每个证书对应一个映射到特定存储桶的域名。使用 MinIO Operator 管理证书,无论它们是使用 TLS 证书签名请求 ( CSR ) 和 Kubernetes certificates.k8s.io TLS 证书管理 API自动生成的,还是由外部第三方服务或软件生成的。
MinIO 扩展了 S3 安全规范,包括对通过网络传输的数据和静态保存到驱动器的数据进行加密。MinIO 依靠 TLS 来保护通过网络传输的敏感数据,例如凭据和对象。
在本文中,您将学习如何使用 MinIO Operator 和 Kubernetes 管理证书。
开始使用 MinIO Operator 管理证书
在开始本教程之前,您需要安装 Kubernetes v1.21 或更高版本。您还需要kubectl CLI 工具和krew 插件管理器。此外,Kubernetes TLS 证书 API 必须按照Deploy the MinIO Operator — MinIO Object Storage for Kubernetes中的描述进行配置。
这些说明适用于 MinIO v5 及更高版本。如果您还没有安装MinIO Operator,则必须安装它
这会将 MinIO Operator 部署到minio-operator命名空间中。部署包括 MinIO Operator 及其依赖项,包括 MinIO Operator 和存储为 Kubernetes 机密的 MinIO Console 所需的自动生成的证书。
您可以通过检查命名空间中 pod 的日志来验证这一点minio-operator。下面是来自 MinIO Operator pod 的日志,请注意,当 MinIO Operator 启动时,它会查找 TLS 证书和相关机密。如果没有找到,那么它将默认通过端口 9090 访问 http。
为了创建证书,MinIO 运营商将创建并提交 CSR。该服务指定 https 的端口 (4222)、秘密名称和与 TLS 相关的其他详细信息。我们可以查看这个服务

当我们描述秘密时,我们可以看到它包含证书和私钥
如果你想为 MinIO Operator 和 MinIO Console 使用你自己的证书而不是让它们为你生成,那么你将创建operator-console-tls包含operator-tls公共证书和私钥的秘密。租户机密的命名约定是tenantname-tls.

在上面的步骤中,我们使用 HTTP 连接到 MinIO Operator。如果除了 MinIO 操作员和 MinIO 租户之间的通信之外,我们还想在您的浏览器和操作员控制台之间启用 TLS,我们将替换kubectl minio init为
这为 MinIO Operator 部署添加了一个环境变量
当 MinIO Operator 部署开始时,它会为自己及其控制台启动 pod,并提交 CSR,如查看其日志所示:

当我们从 MinIO 控制台 pod 查看日志时,我们可以看到我们现在为 HTTPS 打开了一个端口。

要登录 MinIO Operator 并开始管理 MinIO,您必须首先进行端口转发。我们建议您不要将 MinIO Operator 暴露在公共互联网上,以保护您的 MinIO 部署。
复制命令行上显示的 JSON Web 令牌 (JWT)。然后,打开浏览器并导航到http://localhost:9090。将 JWT 粘贴到登录表单中,然后单击登录。

当MinIO Console pod需要TLS时,我们登录后可以在浏览器中查看证书。点击地址栏中的小锁可以查看证书信息,可以看到是Kubernetes自签名的。

部署和保护 MinIO 租户
我们将在 Kubernetes 集群中部署一个 MinIO 租户,出于教学目的,我们将为 TLS 配置它并使其可供客户端使用。
在浏览器的 MinIO Operator 界面中,单击创建租户。有关租户创建和配置过程的详细说明,请参阅使用 Kubernetes 和 MinIO Operator 简化多租户对象存储即服务。

配置租户的名称、命名空间、容量和分配的资源。左侧菜单下有更多选项,您当前位于“设置”菜单中。准备就绪后,单击安全菜单。

您可以在 Security 菜单中看到 TLS 已为此租户打开,并且 MinIO Operator 配置为自动生成和更新证书以保护节点之间的网络流量。为租户启用 AutoCert 将导致我们在上面看到的相同类型的证书自动化。这将向 Kubernetes API 提交 CSR,创建证书,将该证书安装到我们有状态集的适当 pod 中,我们的租户现在受 TLS 保护并可通过 HTTPs 访问。
使用 MinIO Operator 管理证书可以节省时间并降低人为错误的风险。也许更重要的是,您可以使用适合您现有流程的任何方法分配证书——MinIO Operator GUI、租户规范或通过提交 CSR。具有严格安全要求的组织可能会选择自行签署证书并简单地提交 CSR。将 MinIO 暴露给公共互联网的那些需要由公共信任的 CA 签名的证书,然后通过操作员 GUI 或租户规范添加到 MinIO。您甚至可以选择在内部使用自签名证书并在外部访问时使用公共证书的过程。您可以根据现有的安全要求做出选择,无论您选择哪种方式,MinIO Operator 都会为您处理细节。
如果您不想使用本地自签名证书怎么办?您可以为 MinIO 服务器和客户端添加自定义 TLS 密钥对,以及为每个 MinIO 租户添加自定义 CA 证书。如果您已经拥有您的组织之前生成的证书,您可以在此处上传它们。或者您可以像我一样按照这些说明为本地主机创建证书,然后上传这些证书。
自定义证书有一些要求。您提供的证书必须包括集群域的 FQDN,以及 MinIO 租户名称和命名空间。MinIO Operator 向集群上的每个 MinIO 租户和其他服务发送和接收数据,因此您需要服务器和客户端的证书和私钥。
如果您维护自己的证书颁发机构 (CA),那么这也需要自定义证书。否则,其他服务不知道他们是否可以信任 MinIO 的证书。您可以根据需要附加任意数量的 CA 证书。为 MinIO 租户保存为秘密的自定义证书在租户规范 YAML 中被引用。
您可以看到我们所有的秘密,让您确信它们就在那里

MinIO 租户支持服务器名称指示 (SNI),使 MinIO 服务器能够为客户端指定的主机名提供正确的证书。当您将主机名映射到存储桶并通过 TLS 进行保护时,这很有用。MinIO 运营商将根据需要将尽可能多的证书密钥对附加到 MinIO 租户。此工作流程极大地简化了证书的部署和持续管理,将员工从这种容易出错的苦差事中解放出来,并支持大规模操作。
在下面的示例中,您可以看到我在上一步中上传的自定义证书

完成自定义证书的配置后,单击右上角的 YAML 按钮以查看租户规范并验证它们(及其机密)是否被正确引用。然后,单击创建,MinIO 操作员将部署您的新租户。几分钟后,租户启动并运行,其通信由 TLS 保护。
续订和更新证书
证书仅在特定时间段内颁发,因此需要在到期前更新。如果不这样做,您将无法保护与 TLS 的通信——这可能是证书相关停机的最常见原因。手动跟踪到期日期和更新证书既费时又容易出错。
当您将 AutoGen 用于证书时,MinIO Operator 会为您续订即将过期的证书。当证书有效时间的 80% 过去时,MinIO Operator 会使用 Kubernetes API 自动更新证书。例如,如果我们解析和解码保存 MinIO Operator 证书的秘密,我们会看到开始和结束日期。这些包含在 MinIO Operator 对 Kubernetes 进行的原始 API 调用中(默认为 1 年)。

MinIO Operator 即将更新以简化检查租户证书信息。在不久的将来,描述租户将返回大量信息,包括证书过期。这将简化故障排除,以便您可以快速解决证书问题。

即使在部署之后,您也可以将证书添加到您的 MinIO 配置中。以仅服务于内部流量的 MinIO 部署为例。自签名证书适用于内部用户,但现在您希望通过 Internet 提供一个存储桶,因此您将需要公共证书。我们之前使用 AutoGen 作为我们的证书,但现在我们将通过使用 MinIO Operator GUI 上传自定义证书,提交 CSR 或编写新的秘密,然后使用重新启动该特定租户的状态集
如果您使用自定义证书运行,MinIO Operator GUI 会清楚地显示每个证书还剩多少时间。剩余天数根据紧急程度用颜色编码,当证书到期时,到期日期将替换为 EXPIRED。

我们已经完成了使用 MinIO Operator 和 Kubernetes Cert Manager 处理证书的演练。
如果您想公开租户或控制台以供 Kubernetes 集群外部访问,那么自签名证书将不起作用。如果是这种情况,那么您将需要阅读下一篇博文,因为它将介绍如何集成 MinIO Operator、Kubernetes Cert Manager、certbot 和 Let's Encrypt。
结论
在部署大型对象存储系统时,安全性是一个重要的考虑因素,而 MinIO 受益于数百个多 PB 部署所附带的知识。MinIO 加密静态和飞行中的数据。由于我们对 CPU 指令优化的关注,加密和解密为 MinIO 带来了最小的开销。
您现在拥有运行安全的多租户、多云 Kubernetes 部署的工具,可以为所有云原生应用程序提供 MinIO 对象存储。
如果您有任何疑问,请通过sales@minio.org.cn联系我们或加入我们的Slack 社区。