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 及更高版本,此步骤是可选的。
-
将
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 文件应用到部署以创建资源
-
使用支持
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 路径定义为环境变量:
以下 MinIO SDK 支持
AssumeRoleRoleWithWebIdentity:关于使用 SDK Assume role 的示例,请参见 Operator v7.1.1 示例。
示例资源
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。
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 上。