面向内部和外部应用的安全多租户对象存储

Secure Multi-tenant Object Storage for Internal and External Apps

常见的云原生架构是将数据存储在对象存储中,例如 MinIO,并使其可供各种内部和外部应用程序使用。数据在跨网络(尤其是不可信的外部网络)传输时,必须受到保护,防止被查看和篡改。对此的标准是使用传输层安全 (TLS) v1.2+ 进行加密。MinIO Operator 提供在租户部署过程中生成和分配 TLS 证书的功能。MinIO 支持为每个租户使用多个 TLS 证书,其中每个证书对应一个特定的域名。MinIO 使用服务器名称指示 (SNI) 为给定请求提供正确的证书。

从一开始,MinIO 就包含了加密功能,以保护静止状态和传输过程中的数据。当传输敏感数据(例如 STS 凭证、密码或对象本身)时,您可以放心,它们将以机密且安全的方式传递到 MinIO。

在这篇文章中,您将了解如何:

  • 安装 MinIO Operator
  • 部署 MinIO 租户
  • 将外部 TLS 证书添加到租户
  • 使用不同的域访问 MinIO 租户(SNI 支持)

安装 MinIO Operator

在您的 Kubernetes 集群中,通过 krew 安装MinIO Operator

kubectl krew install minio

Kubectl minio init

或者,您也可以手动安装操作员

kubectl apply -k github.com/minio/operator/\?ref\=v4.4.13

登录到操作员

如果您通过 krew 安装了操作员,则运行

kubectl minio proxy

复制 JWT(JSON Web 令牌),打开浏览器并访问https://:9090

如果您手动安装了操作员,则需要使用kubectl port-foward命令公开操作员服务,然后手动提取身份验证令牌

kubectl port-forward svc/console -n minio-operator 9090

kubectl -n minio-operator  get secret $(kubectl -n minio-operator get serviceaccount console-sa -o jsonpath="{.secrets[0].name}") -o jsonpath="{.data.token}" | base64 --decode

将 JWT 复制到登录表单,然后按登录。

部署新的 MinIO 租户

在我们开始之前,让我们花点时间描述一下我们的整体解决方案。假设您有以下要求

要实现这一点,您需要在 Kubernetes 集群中部署一个 MinIO 租户,该租户可供内部和外部客户端访问,不仅如此,他们将使用不同的域。让我们来做吧。

在您的浏览器中,在 MinIO Operator 中,单击创建租户按钮。您将看到以下屏幕。

您可以使用名称、命名空间、容量、节点数量等详细信息配置租户。您可以探索包含其他选项以调整租户的子菜单。单击安全菜单。

在安全菜单中,您可以看到 MinIO Operator 将自动生成证书以保护节点间通信,但您的内部和外部域证书怎么办呢?

单击自定义证书,您将看到其他选项以上传您自己的证书。这些通常是 public.crt 和 private.key 文件。

您可以根据需要上传尽可能多的证书密钥对 - 并且由于 SNI 支持,MinIO 将知道为每个客户端返回的正确证书。

准备好后,单击创建。

几分钟后,您的租户将上线。返回到安全选项卡,您将看到您的自定义证书已配置。从这个屏幕,您可以添加额外的证书,并在需要时删除或轮换现有证书。

现在您需要公开您的 Kubernetes 服务。使用您喜欢的方法:NodePort、LoadBalancer 或 Ingress 控制器。作为参考,我们有一个关于使用NGINX 与 MinIO的教程。

验证 TLS 证书

租户公开给内部和外部客户端后,使用openssl验证SNI是否正常工作非常容易

$ openssl s_client -connect external.corporate.domain.com:9000 -showcerts
...
...
-----BEGIN CERTIFICATE-----

MIIERTCCAq2gAwIBAgIRAOYlnnAjbFXVPszN+sup5qcwDQYJKoZIhvcNAQELBQAw

dzEeMBwGA1UEChMVbWtjZXJ0IGRldmVsb3BtZW50IENBMSYwJAYDVQQLDB1hbGV2

c2tAYWVyaXRoIChMZW5pbiBBbGV2c2tpKTEtMCsGA1UEAwwkbWtjZXJ0IGFsZXZz

a0BhZXJpdGggKExlbmluIEFsZXZza2kpMB4XDTIyMDMyOTAzNTA1NloXDTI0MDYy

OTAzNTA1NlowUTEnMCUGA1UEChMebWtjZXJ0IGRldmVsb3BtZW50IGNlcnRpZmlj

YXRlMSYwJAYDVQQLDB1hbGV2c2tAYWVyaXRoIChMZW5pbiBBbGV2c2tpKTCCASIw

DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM+tUEbdvMXK5u+G6TRFVSJFKBVd

m16c9ISah7K+zXTgWDjMCVRJyI7EAcTM5S/pcEMbhKq78aEG6rky7oWmuU/d5RmZ

4kY2r02lH1QlmpIpxSoeRdg49dHBnKb/bVw6yLUODrmJmAZHIccgo8dHRN2fyaVO

KTABFDWRe5ySWIwjh1316Zh1STpRxAZZF7itA800VMcSTRgYvR2+l73FwVe71zhc

51lheYzyZc6Q9KPWraN/dzvjnakRJ+zo6LUDHoYRuxXSH4LcZUJHF8MJmQF9b29i

rCQWNkJNAFdgE9CwMh6E36Xs9L8+g/h5mrZXywbTymCv13BBCPwlpDWriqkCAwEA

AaNyMHAwDgYDVR0PAQH/BAQDAgWgMBMGA1UdJQQMMAoGCCsGAQUFBwMBMB8GA1Ud

IwQYMBaAFGcBDY05hBWXbpbB/B7ecLxUqB9EMCgGA1UdEQQhMB+CHWV4dGVybmFs

LmNvcnBvcmF0ZS5kb21haW4uY29tMA0GCSqGSIb3DQEBCwUAA4IBgQBf3CnBkPPZ

G8jSfWBcnvMx/MZ2rQe+k3HlEkspX6eUH2H0pUI7b0FzLOuV0n4eRYQ8o8MeeStq

jYG6qS9YI38+YpZ49U28+ZUJ286VOSSWvjgzug1DzTUmuHN2rXVYpIqHXlECE54g

hsLaLOBlbtQLJzeuECb3N2YRtqTDD19wvIPYjYuwL+kHsj2x2BhJXIHtporxrouo

AD1CxxTjGtIlYb5E4vKHTAjNud6ODn637m09DXMheJIpcY1WmY9Ke3FxRwZOAai5

zv2ZutMpuCpMfSYqZtWYcYEbYhs5r5yuDMVWaiI5NngVpOd7OghZ9kmi7fbwbhdC

eK2TeTyaXvb+tsghf+L9WCpRbNjLR6q3JKip0GHxPq0hB0YpZV6olaWm/DiTs7S3

ry76rhguoZsfzeGTpaIvQd0G/akBcNKWjDTAlUyevoi9HYRviGSWAaNGW8yn+NMl

PDZH6VbrDcY0dlZkVTlHt4mel3q1GhgXlGM5go5un8K8bh8afUFEwL8=

-----END CERTIFICATE-----



$ openssl s_client -connect internal.corporate.domain.com:9000 -showcerts
...
...
-----BEGIN CERTIFICATE-----

MIIERDCCAqygAwIBAgIQJhMrQ72DRT0tnW5PQupkWTANBgkqhkiG9w0BAQsFADB3

MR4wHAYDVQQKExVta2NlcnQgZGV2ZWxvcG1lbnQgQ0ExJjAkBgNVBAsMHWFsZXZz

a0BhZXJpdGggKExlbmluIEFsZXZza2kpMS0wKwYDVQQDDCRta2NlcnQgYWxldnNr

QGFlcml0aCAoTGVuaW4gQWxldnNraSkwHhcNMjIwMzI5MDM1MTA2WhcNMjQwNjI5

MDM1MTA2WjBRMScwJQYDVQQKEx5ta2NlcnQgZGV2ZWxvcG1lbnQgY2VydGlmaWNh

dGUxJjAkBgNVBAsMHWFsZXZza0BhZXJpdGggKExlbmluIEFsZXZza2kpMIIBIjAN

BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwN0GRTnYyxi3mzFDFBUaYt56tVe4

J6DBzKj99IxJualzvu81rnoHoyZVj5NCxTKTko/rfG6Bcz5dyCSQJ8tZJnhNOHwk

v40i0xs+x41AE2v5P4tAD4ouiBceDQvUbilEM6gfQANXTLb3p1HzIVKzxaqWWn5V

xumPWlnhnPBnt4HosKW5ett4w2+hG4X4w5sE23VLkIceQjCjI4Ym+tzXSjf81Uxk

j7cj4dyEdZnnesQehS0DRhiBOsQz+pl0SMzVYby1Jlk1utpwz5XkQLQ96CfRLvn/

X0RxgnmL/pbqAYrN8WuFwn02e1bluL/vkTew8X8YldGm2lDRlNGiTnX1HQIDAQAB

o3IwcDAOBgNVHQ8BAf8EBAMCBaAwEwYDVR0lBAwwCgYIKwYBBQUHAwEwHwYDVR0j

BBgwFoAUZwENjTmEFZdulsH8Ht5wvFSoH0QwKAYDVR0RBCEwH4IdaW50ZXJuYWwu

Y29ycG9yYXRlLmRvbWFpbi5jb20wDQYJKoZIhvcNAQELBQADggGBAFotl1RzbHhH

359vl2eMkYztnsx+L0BxfXeS+5nPInMQBC0/iCo2ZH3GZHTLFjR4QwtdbDYlXwm0

vbNFBWdwTkzn3EP4wsbID2Xd6LbWsU5gHv1ErUARZhI21+cUWiInn0hSU4DSWY3v

EPbdYg2eAZNUBVvnsAMDJDjGz0xS5qh7rtqBQcb3mC5Svc1+qDZPmtDtdSDc28rW

Pp0K+eV0oGHliKVhpCgk0NBRbYy4vUqt+NFP3s3FjRwKWl2Jybz4MUT0B4wO5sko

GdXabKrlogtAU6Gz5Q0puoMCi0Tm8mTjxWO8r4ATWy3Twpqeok4VaPLyxi2Rcnv6

mGNwPH0dwrIbGubMzfmu6pkaAv0uIyULzPE6NfjJN06XnmbKwbnvHpzwz7np4C0q

VGb9n6vxNoWdxI3Cyt+4qwM8s+4wCjg8eQEie3wr9mVWn2KP2cdUZ6QMaPnUmXUf

f2p1yUTjVkYonxQRygsiyw1woloPrYfXcyIfKIekXdrFWoyLIsdHJQ==

-----END CERTIFICATE-----


复制编码后的证书并访问https://www.sslchecker.com/certdecoder以确认您的域是否正确。您可以使用openssl x509 -text -in 文件名通过 openssl 解码证书。

重要注意事项

为 MinIO 租户配置多个证书(例如内部证书和外部证书)可能看起来很繁琐,但其带来的好处远远超过了付出的努力。 当证书过期时,您需要轮换两个证书而不是一个。但是,从安全角度来看,最好将您的内部和外部域证书分开,因为它们的信息是公开的,您已经看到了它们是多么容易被解码!

TLS 证书对于攻击者在计划和执行侦察时来说是一个很好的信息来源。它们包含的信息可能会泄露您内部基础设施的详细信息。在设计多租户证书策略时,需要仔细计划,才能在安全性与功能之间找到平衡。

结论

MinIO 在将数据存储到磁盘上和传输过程中对其进行加密。CPU 指令级优化使加密和解密能够以微不足道的性能开销进行。MinIO 客户利用安全的多个租户 Kubernetes 部署,为云原生应用程序(如数据湖分析和流式 AI/ML 程序)提供与 S3 兼容的对象存储。多租户提高了硬件效率,降低了成本。MinIO 单独保护每个租户,并对保存在驱动器上的数据和通过网络传输的数据进行加密。MinIO 与 S3 加密语义完全兼容,因此您可以确信您的应用程序将无缝安全地运行。MinIO 还支持其他密钥管理服务,例如 Hashicorp Vault 和 Gemalto KeySecure。

如果您有任何疑问,请发送邮件至 hello@min.io 或加入 Slack 社区