MinIO操作员的安全令牌服务(STS)
概述
在 Operator 版本加入: v5.0.0
MinIO Operator 支持一组 API 调用,允许应用程序为 MinIO 租户获取 STS 凭据。
STS 为 MinIO Operator 带来的好处包括:
STS 凭据 允许应用程序访问 MinIO 租户上的对象,而不需要在租户上为应用程序创建凭据。
允许应用程序使用基于 Kubernetes 的身份验证机制访问 MinIO 租户中的对象。
服务账户或服务账户令牌是 Kubernetes 中基于 Role-Based Access Control (RBAC) authentication 的核心概念。
为 MinIO Operator 实现 STS 可以使您利用基础设施即代码的原则和配置,通过使用租户自定义资源定义(CRD)和 MinIO PolicyBinding CRD。
重要
从 Operator v5.0.11 开始,STS 默认是 启用的。
之前版本的 Operator 默认情况下 禁用 STS。 要使用 v5.0.10 或更旧版本的 Operator 中的 STS,您必须首先显式启用它。
本页面的程序包括如何在 MinIO Operator 中启用 STS API 的说明。
STS 授权在 Kubernetes 中的工作原理
应用程序可以使用包括 Kubernetes Service Account’s 服务账户的 JWT 的 AssumeRoleWithWebIdentity
调用,向 MinIO Operator 发送请求以获取临时凭证。
当链接到如通过部署的 .spec.spec.serviceAccountName
字段这样的 pod 时,Kubernetes 会从例如 /var/run/secrets/kubernetes.io/serviceaccount/token
等知名位置挂载服务账户的 JWT。
Pod 可以从该位置访问那些服务账户。
Operator 会检查请求的有效性,为应用程序检索策略,从租户处获取凭据,然后将凭据传递回应用程序。 应用程序使用发放的凭据与租户上的对象存储进行交互。

完整的流程包括以下步骤:
应用程序向 MinIO Operator 发送一个
AssumeRoleWithWebidentity
API request,其中包含租户命名空间和一个服务账户信息。这个 API 请求允许应用程序临时获取 MinIO 租户中的对象存储访问权限。MinIO Operator 使用 Kubernetes API 检查与应用程序请求中的 服务帐户 关联的 JSON Web 令牌 (JWT) 是否有效。
Kubernetes API 返回其有效性检查的结果。
MinIO Operator 检查与应用程序匹配的 策略绑定。
PolicyBinding CRD 返回与请求匹配的一个或多个策略(如果有)。
MinIO Operator 将应用程序的组合策略信息发送到 MinIO 租户。
租户根据请求中的政策或 policies 创建临时的凭证,并将这些凭证返回给 MinIO Operator。
MinIO Operator 将临时凭证转发回应用程序。
应用程序使用这些凭证向 MinIO 租户发送对象存储调用以进行数据操作。
要求
MinIO Operator 的 STS 需要以下内容:
MinIO Operator v5.0.0 或更高版本。
部署 必须 配置 TLS configured。
在 Operator v5.0.0 - 5.0.10 版本中,需要设置环境变量
OPERATOR_STS_ENABLED
为on
。
操作步骤
为部署启用 STS 功能
备注
对于 Operator 版本 5.0.11 或更高版本,此步骤是可选的。
kubectl -n minio-operator set env deployment/minio-operator OPERATOR_STS_ENABLED=on
将
minio-operator
替换为您的部署的命名空间。将
deployment/minio-operator
替换为您的 MinIO Operator 部署的实际值。您可以通过运行
kubectl get deployments -n <namespace>
来查找部署值,其中您需要将<namespace>
替换为 MinIO Operator 的命名空间。 您的 MinIO Operator 命名空间通常是minio-operator
,尽管在安装过程中这个值可能会改变。
确保在 MinIO 租户上存在合适的 policy,或者为应用程序使用应用程序的策略。
下一步使用 YAML 文档将一个或多个现有的租户策略映射到通过一个名为
PolicyBinding
的自定义资源中的服务帐户。为服务帐户和策略绑定创建 YAML 资源:
在 MinIO 租户中为应用程序创建一个 服务帐户(Service Account) 。
有关 Kubernetes 中服务帐户的更多信息,请参阅 Kubernetes 文档。
在目标租户的命名空间中创建一个 策略绑定,将应用程序链接到一个或多个 MinIO 租户的策略。
应用 YAML 文件在部署上创建资源
kubectl apply -k path/to/yaml/file.yaml
使用支持
AssumeRoleWithWebIdentity
行为的 SDK,从您的应用程序向部署发送一个调用。STS API 期望在 Kubernetes 环境中存在一个服务帐户的 JWT。 当与 pod 关联时,例如通过部署的
.spec.spec.serviceAccountName
字段,Kubernetes 会从众所周知的路径,如/var/run/secrets/kubernetes.io/serviceaccount/token
,为服务帐户挂载一个 JWT。或者,您可以将令牌路径定义为环境变量:
AWS_WEB_IDENTITY_TOKEN_FILE=/var/run/secrets/kubernetes.io/serviceaccount/token
以下 MinIO SDK 支持
AssumeRoleRoleWithWebIdentity
:Golang
Java
JavaScript
.NET
Python
有关使用 SDK 假设角色的示例,请参阅 MinIO 官方 GitHub 仓库中的 GitHub。
示例资源
服务帐号
服务帐户是 Kubernetes resource type 的一种资源类型,它允许外部应用程序与 Kubernetes 部署进行交互。
当与 pod 关联时,例如通过部署的 .spec.spec.serviceAccountName
字段,Kubernetes 会从众所周知的路径,如 /var/run/secrets/kubernetes.io/serviceaccount/token
,为服务帐户挂载一个 JWT。
以下 YAML 文件创建了一个名为 stsclient-sa
的服务帐户,用于 sts-client
命名空间。
apiVersion: v1
kind: ServiceAccount
metadata:
namespace: sts-client # The namespace to add the service account to. Usually a tenant, but can be any namespace in the deployment.
name: stsclient-sa # The name to use for the service account.
政策约束
PolicyBinding
是 MinIO 专为 Kubernetes 设计的一种自定义资源类型,用于将 应用
程序与一组策略相链接。
在租户的命名空间中创建策略绑定。
对于 MinIO Operator 而言,应用程序是指任何标识为一个特定服务帐户和租户命名空间的请求资源。
PolicyBinding
资源将应用程序链接到该命名空间上租户的一个或多个策略。
以下 YAML 创建了一个 PolicyBinding
,它将使用存在于 sts-client
命名空间中的服务帐户 stsclient-sa
的应用程序链接到位于 minio-tenant-1
命名空间中的目标租户中的策略 test-bucket-rw
。
YAML 定义中授予的政策 必须 已经存在于 MinIO 租户上。
apiVersion: sts.minio.org.cn/v1alpha1
kind: PolicyBinding
metadata:
name: binding-1
namespace: minio-tenant-1 # The namespace of the tenant this binding is for
spec:
application:
namespace: sts-client # The namespace that contains the service account for the application
serviceaccount: stsclient-sa # The service account to use for the application
policies:
- test-bucket-rw # A policy that already exists in the tenant
# - test-bucket-policy-2 # Add as many policies as needed