使用 MinIO Operator 简化证书管理

Streamline Certificate Management with 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 插件管理器。此外,必须按照部署 MinIO Operator — MinIO 对象存储到 Kubernetes 中所述配置 Kubernetes TLS 证书 API。 

这些说明适用于使用 MinIO v5 及更高版本。如果您尚未安装MinIO Operator,则需要安装它。

kubectl krew install minio
kubectl minio init

这会将 MinIO Operator 部署到 minio-operator 命名空间中。部署包括 MinIO Operator 及其依赖项,包括 MinIO Operator 和 MinIO Console 所需的自动生成的证书,这些证书存储为 Kubernetes 密钥。

您可以通过检查 minio-operator 命名空间中 Pod 的日志来验证这一点。以下是 MinIO Operator Pod 的日志,请注意,当 MinIO Operator 启动时,它会查找 TLS 证书和相关的密钥。如果找不到任何证书,则它将默认使用端口 9090 上的 http。

为了创建证书,MinIO Operator 将创建并提交 CSR。服务指定 https 的端口 (4222)、密钥名称以及与 TLS 相关的其他详细信息。我们可以查看此服务

当我们描述密钥时,可以看到它包含证书和私钥

kubectl describe secret secure-tls -n secure
Name:         secure-tls
Namespace:    secure
Labels:       v1.min.io/tenant=secure
Annotations:  <none>

Type:  Opaque

Data
====
private.key:  241 bytes
public.crt:   1172 bytes

如果您想使用您自己的证书用于 MinIO Operator 和 MinIO Console,而不是由系统为您生成,则需要创建包含公钥证书和私钥的密钥 operator-console-tlsoperator-tls。租户密钥的命名约定为 tenantname-tls

在上面的步骤中,我们使用 HTTP 连接到 MinIO Operator。如果除了 MinIO Operator 和 MinIO 租户之间的通信外,我们还希望在浏览器和 Operator 控制台之间启用 TLS,则需要将 kubectl minio init 替换为

kubectl minio init --console-tls 

这会为 MinIO Operator 部署添加一个环境变量

MINIO_CONSOLE_TLS_ENABLE=yes

当 MinIO Operator 部署启动时,它会为自己及其控制台启动 Pod,并提交 CSR,可以通过查看其日志看到

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

要登录 MinIO Operator 并开始管理 MinIO,您必须首先进行端口转发。我们建议您不要将 MinIO Operator 公开到公共互联网,以保护您的 MinIO 部署。

kubectl minio proxy -n minio-operator

复制命令行上显示的 JSON Web Token (JWT)。然后,打开浏览器并导航到 http://localhost:9090。将 JWT 粘贴到登录表单中,然后点击登录。

当 MinIO 控制台 Pod 需要 TLS 时,我们可以在登录后在浏览器中查看证书。点击地址栏中的锁以查看有关证书的信息,我们可以看到它是由 Kubernetes 自签名的。

部署和保护 MinIO 租户

我们将部署一个 MinIO 租户到 Kubernetes 集群中,出于教学目的,我们将为其配置 TLS 并使其可供客户端访问。

在浏览器中,在 MinIO Operator 界面内,点击“创建租户”。有关租户创建和配置过程的详细说明,请参阅 使用 Kubernetes 和 MinIO Operator 简化多租户对象存储即服务

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

您可以在“安全”菜单中看到,此租户已启用 TLS,并且 MinIO Operator 配置为自动生成和更新证书以保护节点之间的网络流量。为租户开启 AutoCert 将导致与上面看到的相同的证书自动化。这将向 Kubernetes API 提交 CSR,创建证书,将该证书挂载到我们有状态集的相应 Pod 中,并且我们的租户现在受 TLS 保护,并且可以通过 HTTPs 访问。 

使用 MinIO Operator 管理证书可以节省时间并降低人为错误的风险。也许更重要的是,您可以使用适合您现有流程的任何方法分配证书 - MinIO Operator GUI、租户规范或通过提交 CSR。具有严格安全要求的组织可以选择自签名其证书,并简单地提交 CSR。那些将 MinIO 公开到公共互联网的组织需要由公共信任的 CA 签名的证书,然后通过 Operator GUI 或租户规范添加到 MinIO。您甚至可以选择一个在内部使用自签名证书而在外部访问时使用公共证书的过程。您可以根据现有的安全要求做出选择,无论您选择哪种方式,MinIO Operator 都会为您处理细节。

如果您不想使用本地自签名证书怎么办?您可以为 MinIO 服务器和客户端添加自定义 TLS 密钥对,以及每个 MinIO 租户的自定义 CA 证书。如果您已经拥有之前由您的组织生成的证书,则可以在此处上传它们。或者您可以按照我的操作,按照这些说明创建 本地主机证书,然后上传它们。

自定义证书有一些要求。您提供的证书必须包含集群域的 FQDN,以及 MinIO 租户名称和命名空间。MinIO Operator 向每个 MinIO 租户和其他集群服务发送数据并接收数据,因此您需要服务器和客户端的证书和私钥。 

如果您维护自己的证书颁发机构 (CA),则这也需要自定义证书。否则,其他服务不知道它们是否可以信任 MinIO 的证书。您可以根据需要附加多个 CA 证书。作为密钥存储保存的 MinIO 租户的自定义证书在租户规范 YAML 中引用。   

您可以查看我们所有的密钥,以确保它们存在

MinIO 租户支持服务器名称指示 (SNI),使 MinIO 服务器能够为客户端指定的主机名提供正确的证书。当您将主机名映射到存储桶并通过 TLS 保护时,这很有用。MinIO Operator 将根据需要将多个证书密钥对附加到 MinIO 租户。此工作流程极大地简化了证书的部署和持续管理,使员工免于此类容易出错的繁琐工作,并能够进行大规模操作。

在下面的示例中,您可以看到我在上一步中上传的自定义证书

完成自定义证书的配置后,点击右上角的 YAML 按钮查看租户规范,并验证它们(及其密钥存储)是否已正确引用。然后,点击“创建”,MinIO Operator 将部署您的新租户。几分钟后,租户启动并运行,其通信受 TLS 保护。

更新和续订证书

证书仅在特定时间段内颁发,因此需要在过期前续订。否则将无法使用 TLS 保护通信 - 这可能是导致证书相关停机时间的常见原因。手动跟踪过期日期和续订证书既费时又容易出错。

当您使用 AutoGen 生成证书时,MinIO Operator 会为您续订即将过期的证书。当证书有效期的 80% 时间过去时,MinIO Operator 会使用 Kubernetes API 自动续订证书。例如,如果我们解析并解码保存 MinIO Operator 证书的密钥存储,我们会看到开始和结束日期。这些包含在 MinIO Operator 对 Kubernetes 发出的原始 API 调用中(默认值为 1 年)。

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

kubectl describe tenant -n secure secure

您也可以在 MinIO 部署完成后向其配置中添加证书。以仅服务于内部流量的 MinIO 部署为例。自签名证书对于内部用户来说是可以的,但现在您想使存储桶可通过互联网访问,因此您需要公共证书。我们之前一直使用 AutoGen 生成证书,但现在我们将使用 MinIO Operator GUI 上传自定义证书,提交 CSR 或编写新的密钥存储,然后使用以下命令重新启动该特定租户的有状态集

kubectl rollout restart sts -n myminio myminio-pool-0

如果您使用的是自定义证书,则 MinIO Operator GUI 会清楚地显示每个证书剩余多少时间。剩余天数根据紧急程度进行颜色编码,当证书过期时,过期日期将替换为“已过期”。

我们已经完成了使用 MinIO Operator 和 Kubernetes Cert Manager 处理证书的演练。

如果您想公开租户或控制台以供 Kubernetes 集群外部访问,则自签名证书将不起作用。如果是这种情况,则您需要阅读下一篇博文,因为它将介绍如何集成 MinIO Operator、Kubernetes Cert Manager、certbot 和 Let's Encrypt。

结论

安全性是在部署大型对象存储系统时需要考虑的重要因素,MinIO 受益于数百个多 PB 部署带来的知识。MinIO 对静态和传输中的数据进行加密。由于我们对 CPU 指令优化给予了关注,因此加密和解密对 MinIO 产生的开销极小。

您现在拥有运行安全的多租户、多云 Kubernetes 部署的工具,以便为所有云原生应用程序提供 MinIO 对象存储。

如果您有任何疑问,请通过 hello@min.io 联系我们或加入我们的 Slack 社区