文档

MinIO Operator 的安全令牌服务 (STS)

概述

Operator 版本新增功能: v5.0.0

MinIO Operator 支持一组 API 调用,允许应用程序获取 MinIO 租户的 STS 凭证。

MinIO Operator 使用 STS 的优势包括

  • STS 凭证 允许应用程序访问 MinIO 租户上的对象,而无需在租户上为应用程序创建凭证。

  • 允许应用程序使用 Kubernetes 原生身份验证机制访问 MinIO 租户中的对象。

    服务账户或服务账户令牌是 基于角色的访问控制 (RBAC) 身份验证 在 Kubernetes 中的核心概念。

  • 为 MinIO Operator 实现 STS 允许您通过使用租户自定义资源定义 (CRD) 和 MinIO PolicyBinding CRD 来利用基础设施即代码原则和配置。

重要

从 Operator v5.0.11 开始,默认情况下 启用 STS。

早期版本的 Operator 默认情况下 禁用 STS。要在 Operator v5.0.10 或更早版本中使用 STS,您必须首先显式启用它。

此页面上的步骤包含在 MinIO Operator 中启用 STS API 的说明。

STS 授权在 Kubernetes 中的工作原理

应用程序可以使用 AssumeRoleWithWebIdentity 调用,包括 Kubernetes 服务账户JWT,向 MinIO Operator 发送临时凭证请求。当链接到 Pod(例如,通过部署的 .spec.spec.serviceAccountName 字段)时,Kubernetes 会从众所周知的地址(例如 /var/run/secrets/kubernetes.io/serviceaccount/token)挂载服务账户的 JWT。Pod 可以从该位置访问这些服务账户。

Operator 检查请求的有效性,检索应用程序的策略,从租户获取凭证,然后将凭证传回应用程序。应用程序使用颁发的凭证来处理租户上的对象存储。

A diagram showing STS token process flow on a Kubernetes MinIO deployment between the requesting application, MinIO Operator, Kubernetes API, PolicyBinding custom resource definition, and the MinIO tenant.

完整过程包括以下步骤

  1. 应用程序向 MinIO Operator 发送 AssumeRoleWithWebidentity API 请求,其中包含租户命名空间和要使用的服务账户。

  2. MinIO Operator 使用 Kubernetes API 检查与应用程序请求中的 服务账户 关联的 JSON Web 令牌 (JWT) 是否有效。

  3. Kubernetes API 返回其有效性检查的结果。

  4. MinIO Operator 检查与应用程序匹配的 策略绑定

  5. PolicyBinding CRD 返回与请求匹配的策略(如果有)。

  6. MinIO Operator 将应用程序的组合策略信息发送到 MinIO 租户。

  7. 租户根据请求的策略创建临时凭证,并将这些凭证返回给 MinIO Operator。

  8. MinIO Operator 将临时凭证转发回应用程序。

  9. 应用程序使用这些凭证向 MinIO 租户发送对象存储调用。

需求

MinIO Operator 的 STS 需要以下内容

  • MinIO Operator v5.0.0 或更高版本。

  • 部署**必须**配置TLS

  • (Operator v5.0.0 - 5.0.10 版本需要) OPERATOR_STS_ENABLED 环境变量设置为 on

步骤

  1. 为部署启用 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,但此值在安装过程中可能会更改。

  2. 确保 MinIO 租户上存在合适的策略供应用程序使用。

    下一步使用 YAML 文档通过名为 PolicyBinding 的自定义资源将一个或多个现有租户策略映射到服务帐户。

  3. 创建服务帐户和策略绑定的 YAML 资源

    • 在 MinIO 租户中创建服务帐户供应用程序使用。

      有关 Kubernetes 中服务帐户的更多信息,请参阅Kubernetes 文档

    • 在目标租户的命名空间中创建策略绑定,将应用程序链接到一个或多个 MinIO 租户的策略。

  4. 应用 YAML 文件以在部署上创建资源

    kubectl apply -k path/to/yaml/file.yaml
    
  5. 使用支持 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

    有关使用 SDK 承担角色的示例,请参阅GitHub

示例资源

服务帐户

服务帐户是Kubernetes 资源类型,允许外部应用程序与 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 是 Kubernetes 的 MinIO 特定自定义资源类型,用于将应用程序链接到一组策略。

在租户所在的命名空间中创建策略绑定。

就 MinIO Operator 而言,应用程序是任何使用特定服务帐户和租户命名空间进行身份识别的请求资源。PolicyBinding 资源将应用程序链接到该命名空间上租户的一个或多个策略。

以下 yaml 创建了一个 PolicyBinding,将使用位于 sts-client 命名空间中的服务帐户 stsclient-sa 的应用程序链接到位于 minio-tenant-1 命名空间中的目标租户中的策略 test-bucket-rw。yaml 定义中授予的策略**必须**已存在于 MinIO 租户上。

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

参考