MinIO Operator 的 Security Token Service (STS)
概述
新增: Operator
v5.0.0
MinIO Operator 支持一组 API 调用,使应用程序能够为 MinIO Tenant 获取 STS 凭证。
MinIO Operator 的 STS 具有以下优势:
STS 凭证 允许应用程序访问 MinIO Tenant 上的对象,而无需在租户上为该应用创建凭证。
允许应用程序使用 Kubernetes 原生认证机制访问 MinIO 租户中的对象。
Service Account 或 Service Account Token 是 Kubernetes 中 Role-Based Access Control (RBAC) authentication 的核心概念。
为 MinIO Operator 实现 STS 后,你可以通过租户 custom resource definition (CRD) 和 MinIO PolicyBinding CRD,利用基础设施即代码的原则与配置方式。
重要
从 Operator v5.0.11 开始,STS 默认 启用。
较早版本的 Operator 默认 禁用 STS。 若要在 v5.0.10 或更早版本的 Operator 中使用 STS,必须先显式启用。
本页流程包含在 MinIO Operator 中启用 STS API 的说明。
Kubernetes 中 STS 授权的工作方式
应用程序可以使用包含 Kubernetes Service Account JWT 的 AssumeRoleWithWebIdentity 调用,向 MinIO Operator 请求临时凭证。 当该 Service Account 关联到 Pod 时(例如通过 deployment 的 .spec.spec.serviceAccountName 字段),Kubernetes 会从已知位置挂载该 Service Account 的 JWT,例如 /var/run/secrets/kubernetes.io/serviceaccount/token。 Pod 可以从该位置访问这些 Service Account。
Operator 会检查请求有效性,检索该应用的策略,从租户获取凭证,然后将凭证返回给应用程序。 应用程序使用签发的凭证在该租户上执行对象存储操作。

完整流程包括以下步骤:
- 应用程序向 MinIO Operator 发送
AssumeRoleWithWebidentityAPI 请求,其中包含租户命名空间和要使用的 Service Account。 - MinIO Operator 使用 Kubernetes API 检查应用请求中与 service account 关联的 JSON Web Token (JWT) 是否有效。
- Kubernetes API 返回其有效性检查结果。
- MinIO Operator 检查与应用程序匹配的 Policy Bindings。
- PolicyBinding CRD 返回与请求匹配的策略(如果有)。
- MinIO Operator 将该应用程序的合并策略信息发送给 MinIO Tenant。
- 租户为该请求创建与策略匹配的临时凭证,并将其返回给 MinIO Operator。
- MinIO Operator 将临时凭证转发回应用程序。
- 应用程序使用该凭证向 MinIO Tenant 发起对象存储调用。
要求
MinIO Operator 的 STS 需要满足以下条件:
- MinIO Operator v5.0.0 或更高版本。
- 部署 必须 配置 TLS。
- (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>查找 deployment 值,其中<namespace>需替换为 MinIO Operator 的命名空间。 你的 MinIO Operator 命名空间通常是minio-operator,但该值在安装过程中可能发生变化。
确保 MinIO Tenant 上存在适用于该应用程序的 policy (一个或多个)
下一步会使用 YAML 文档,通过名为
PolicyBinding的 custom resource 将一个或多个现有租户策略映射到 Service Account。为 Service Account 和 Policy Binding 创建 YAML 资源:
在 MinIO Tenant 中创建供应用程序使用的 Service Account。
关于 Kubernetes 中 Service Account 的更多信息,请参见 Kubernetes 文档。
在目标租户命名空间中创建 Policy Binding,将应用程序关联到 MinIO Tenant 的一个或多个策略。
将 YAML 文件应用到部署以创建资源
kubectl apply -k path/to/yaml/file.yaml使用支持
AssumeRoleWithWebIdentity类行为的 SDK,从你的应用程序向部署发送调用STS API 要求 Kubernetes 环境中存在该 Service Account 的 JWT。 当该 Service Account 关联到 Pod 时(例如通过 deployment 的
.spec.spec.serviceAccountName字段),Kubernetes 会从已知位置挂载该 Service Account 的 JWT,例如/var/run/secrets/kubernetes.io/serviceaccount/token。或者,你也可以将 token 路径定义为环境变量:
AWS_WEB_IDENTITY_TOKEN_FILE=/var/run/secrets/kubernetes.io/serviceaccount/token以下 MinIO SDK 支持
AssumeRoleRoleWithWebIdentity:关于使用 SDK Assume role 的示例,请参见 GitHub。
示例资源
Service Account(服务账户)
Service Account 是一种 Kubernetes 资源类型,允许外部应用程序与 Kubernetes 部署交互。 当该 Service Account 关联到 Pod 时(例如通过 deployment 的 .spec.spec.serviceAccountName 字段),Kubernetes 会从已知位置挂载该 Service Account 的 JWT,例如 /var/run/secrets/kubernetes.io/serviceaccount/token。
以下 YAML 会在 sts-client 命名空间中创建名为 stsclient-sa 的 Service Account。
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.
Policy Binding(策略绑定)
PolicyBinding 是 Kubernetes 中 MinIO 特有的 custom resource 类型,用于将 application 关联到一组策略。
在其所属租户的命名空间中创建 Policy Binding。
在 MinIO Operator 的语境下,application 是指任何使用特定 Service Account 和租户命名空间进行标识的请求资源。 PolicyBinding 资源将该 application 关联到该命名空间中租户的一个或多个策略。
下面的 YAML 创建了一个 PolicyBinding,将位于 sts-client 命名空间中、使用 Service Account stsclient-sa 的 application,关联到位于 minio-tenant-1 命名空间的目标租户中的策略 test-bucket-rw。 YAML 定义中授予的策略 必须 已存在于 MinIO Tenant 上。
apiVersion: sts.min.io/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
参考
本页部分内容改编自 MinIO 对象存储文档,© 2020–至今 MinIO, Inc.,依据 CC BY 4.0 授权,由 Silo 项目转换与维护。归属与署名
本页为非官方中文翻译。如与英文原文有出入,以英文原文为准。