中文文档

配置 MinIO 以使用 Keycloak 进行身份验证

概述

此过程配置MinIO使用 Keycloak 作为外部身份提供者(IDP),通过OpenID Connect (OIDC)协议对用户进行身份验证。

此过程具体涵盖以下步骤:

  • 为MinIO验证和授权,配置Keycloak。

  • 配置新的或现有的 MinIO 租户以使用 Keycloak 作为 OIDC 提供程序。

  • 创建策略以控制 Keycloak 认证用户的访问权限。

  • 使用 SSO 和 Keycloak 管理的身份登录到 MinIO 租户控制台。

  • 使用 AssumeRoleWithWebIdentity 安全令牌服务 (STS) API 生成临时的 S3 访问凭证。

本操作步骤是针对 Keycloak 21.0.0 编写和测试的。 提供的说明可能适用于其他 Keycloak 版本。 此过程假设您之前有使用 Keycloak 的经验,并且已查看 他们的文档,以获取部署、配置和管理服务的指导和最佳实践。

先决条件

MinIO Kubernetes Operator

确保您的目标 Kubernetes 集群具有有效且可正常运行的 MinIO Kubernetes Operator 安装. 本文档假定 Operator 为最新稳定版本 7.1.1.

MinIO 租户

本操作步骤假设您的 Kubernetes 集群具有足够的资源来 部署新的 MinIO 租户

您还可以使用此过程作为修改现有 MinIO 租户以启用 Keycloak 身份管理的指导。

Keycloak 部署和领域配置

本操作步骤假设您可以访问一个现有的 Keycloak 部署并拥有管理员权限。 具体而言,您必须拥有在 Keycloak 部署中创建和配置领域、客户端、客户端范围、领域角色、用户和组的权限。

对于与 MinIO 租户位于同一 Kubernetes 集群中的 Keycloak 部署,本操作步骤假设 Keycloak 和 MinIO 的 pod/service 之间存在双向访问。

对于 Kubernetes 集群外部的 Keycloak 部署,本操作步骤假设存在一个现有的 Ingress、负载均衡器或类似的 Kubernetes 网络控制组件,用于管理与 MinIO 租户之间的网络访问。

安装和配置 mc ,以便访问 MinIO 集群

本操作步骤使用 mc 在 MinIO 集群上执行操作。 在具有对集群的网络访问权限的机器上安装 mc

您的本地主机必须能够访问 MinIO 租户,例如通过入口、负载均衡器或类似的 Kubernetes 网络控制组件。

请查看 mc 安装快速入门 获取有关下载和安装 mc 的说明。

本操作步骤假定已经配置了 MinIO 集群的 alias

为 Keycloak 身份管理配置 MinIO

1) 配置或创建用于访问Keycloak的客户端

在Keycloak的 管理控制台 中进行身份验证,并导航到 Clients

选择 Create client 并按照说明为MinIO创建一个新的Keycloak客户端。 按照以下方式填写指定的输入:

Client ID

设置为MinIO的唯一标识符( minio

Client type

设置为 OpenID Connect

Always display in console

切换为 On 状态

Client authentication

切换为 On 状态

Authentication flow

打开 Standard flow

(可选) Authentication flow

打开 Direct access grants (API 测试)

Keycloak部署客户端时使用默认的配置值集合。 根据您的Keycloak设置和所需的行为进行必要的值修改。 下表提供了配置设置和值的标准:

Root URL

设置为 ${authBaseUrl}

Home URL

设置为您想要MinIO使用的Realm( /realms/master/account/

Valid Redirect URI

设置为 *

Keys -> Use JWKS URL

切换为 On 状态

Advanced -> Advanced Settings -> Access Token Lifespan

设置为 1 Hour

2) 为 MinIO 客户端创建客户端范围

客户端范围允许Keycloak将用户属性映射为身份验证请求中返回的JSON Web Token(JWT)的一部分。这使得MinIO在向用户分配策略时能够引用这些属性。 此步骤创建必要的客户端范围,在成功进行Keycloak身份验证后支持MinIO授权。

导航到 Client scopes 视图并创建一个新的MinIO授权客户端范围:

Name

设置为策略的任何可识别名称( minio-authorization )。

Include in token scope

切换为 On 状态

创建后,从列表中选择该作用域并导航到 Mappers

选择 Configure a new mapper 以创建一个新映射:

User Attribute

选择映射器类型

Name

设置映射的任何可识别名称( minio-policy-mapper

User Attribute

设置为 policy

Token Claim Name

设置为 policy

Add to ID token

设置为 On

Claim JSON Type

设置为 String

Multivalued

设置为 On

这样可以在单个声明中设置多个 策略 值。

Aggregate attribute values

设置为 On

这样可以使用户继承其所在组中设置的任何 策略

创建后,将客户端作用域分配给MinIO客户端。

  1. 导航至 Clients 并选择MinIO客户端。

  2. 选择 Client scopes,然后选择 Add client scope

  3. 选择先前创建的作用域,并将 Assigned type 设置为 default

3) 为Keycloak用户/组应用必要的属性

您必须给Keycloak用户或组分配一个名为 policy 的属性。 将该值设置为MinIO部署中的任何 policy

对于用户,请导航至 Users 并选择或创建用户:

Credentials

如果尚未设置,请将用户密码设置为永久值。

Attributes

创建一个具有键 policy 和任何 策略consoleAdmin ) 的值的新属性。

对于组,请导航至 Groups 并选择或创建组:

Attributes

创建一个具有键 policy 和任何 策略consoleAdmin ) 的值的新属性。

您可以将用户分配到组中,以便他们继承指定的 policy 属性。 如果您将Mapper设置为启用 Aggregate attribute values,则Keycloak将聚合的策略数组包括在经过身份验证的用户的JWT令牌中。 MinIO可以在授权用户时使用此策略列表。

您可以使用Keycloak API测试用户配置的策略:

curl -d "client_id=minio" \
     -d "client_secret=secretvalue" \
     -d "grant_type=password" \
     -d "username=minio-user-1" \
     -d "password=minio-user-1-password" \
     http://keycloak-service.keycloak-namespace.svc.cluster-domain.example/realms/REALM/protocol/openid-connect/token

如果成功, access_token 包含使用MinIO minio-sts-assumerolewithwebidentity STS API并生成S3凭据所需的JWT。

您可以使用JWT解码器来查看有效载荷并确保其中包含带有一个或多个MinIO策略的 policy 键。

4) 为 Keycloak 验证配置 MinIO

MinIO支持多种方法来配置Keycloak身份验证:

  • 使用MinIO租户控制台

  • 使用终端/Shell和 mc idp openid 命令

您可以使用MinIO租户控制台将Keycloak配置为MinIO租户的外部身份提供者。

使用NodePort、Ingress或Load Balancer终端节点访问控制台服务。 您可以使用以下命令来查看控制台配置:

kubectl describe svc/TENANT_NAME-console -n TENANT_NAMESPACE

TENANT_NAMETENANT_NAMESPACE 分别替换为MinIO租户和其命名空间的名称。

以具有 MinIO 部署的管理员权限的用户身份登录,例如具有 consoleAdmin 策略的用户。

从左侧导航栏中选择 Identity ,然后选择 OpenID。 选择 Create Configuration 以创建新配置。

在模态框中输入以下信息:

Name

为 Keycloak 实例输入一个唯一的名称

Config URL

指定 Keycloak OpenID 配置文档的地址 (keycloak-service.keycloak-namespace.svc.cluster-domain.example)

确保 REALM 与您要使用进行用户认证的 Keycloak 领域匹配,以用于 MinIO。

Client ID

指定在步骤 1 中创建的 Keycloak 客户端的名称。

Client Secret

指定步骤 1 中创建的 Keycloak 客户端的秘密凭据值。

Display Name

指定用户可见的名称,作为已配置的 Keycloak 服务在单点登录 (SSO) 工作流程中 MinIO 控制台显示的一部分。

Scopes

指定要在 JWT 中包含的 OpenID 范围,例如 preferred_usernameemail

您可以使用支持的 OpenID 策略变量引用这些范围,以便进行编程策略。

Redirect URI Dynamic

切换为 On 状态

替换客户端作为 Keycloak 重定向 URI 的一部分使用的 MinIO 控制台地址。 Keycloak 将经过身份验证的用户返回到使用提供的 URI 的控制台。

对于部署在反向代理、负载均衡器或类似网络控制平面后面的 MinIO 控制台,您可以使用 MINIO_BROWSER_REDIRECT_URL 变量来设置 Keycloak 要使用的重定向地址。

选择 保存 以应用配置。

选择 Save 以应用配置。

您可以使用 mc idp openid add 命令为 Keycloak 服务创建新配置。 该命令使用所有支持的 OpenID 配置设置

mc idp openid add ALIAS PRIMARY_IAM \
   client_id=MINIO_CLIENT \
   client_secret=MINIO_CLIENT_SECRET \
   config_url="https://keycloak-service.keycloak-namespace.svc.cluster-domain.example/realms/REALM/.well-known/openid-configuration" \
   display_name="SSO_IDENTIFIER"
   scopes="openid,email,preferred_username" \
   redirect_uri_dynamic="on"

PRIMARY_IAM

将其设置为 Keycloak 服务的唯一标识符,例如 keycloak_primary

MINIO_CLIENT
MINIO_CLIENT_SECRET

将其设置为步骤 1 中配置的 Keycloak 客户端 ID 和密钥。

config_url

将其设置为 Keycloak OpenID 配置文档的地址(keycloak-service.keycloak-namespace.svc.cluster-domain.example)。

display_name

将其设置为 MinIO 控制台作为已配置的 Keycloak 服务的单点登录 (SSO) 工作流程的一部分显示给用户的名称。

scopes

将其设置为要包含在 JWT 中的 OpenID 范围列表,例如 preferred_usernameemail

redirect_uri_dynamic

设置为 on

替换客户端作为 Keycloak 重定向 URI 的 MinIO 控制台地址。 提供的 URI 用于 Keycloak 将经过身份验证的用户返回到控制台。

对于部署在反向代理、负载均衡器或类似网络控制平面后面的 MinIO 控制台,您可以使用 MINIO_BROWSER_REDIRECT_URL 变量来设置 Keycloak 要使用的重定向地址。

重新启动MinIO部署以使更改生效。

检查MinIO日志并验证启动是否成功,没有与OIDC配置相关的错误。

如果您尝试使用控制台登录,则应该看到一个(SSO)按钮,该按钮使用配置的 Display Name

指定已配置的用户并尝试登录。 MinIO应该会自动将您重定向到Keycloak登录入口。 身份验证成功后,Keycloak应将您重定向回MinIO控制台,使用原始的控制台URL 如果已配置,则使用 Redirect URI

5) 使用安全令牌服务(STS)生成应用程序凭据

使用 S3 兼容 SDK 的应用程序必须以访问密钥和密钥的形式指定凭证。 MinIO minio-sts-assumerolewithwebidentity API使用Keycloak身份验证后返回的JWT返回必要的临时凭据,包括所需的会话令牌。

您可以使用以下HTTP调用序列和 curl 实用程序测试此工作流程:

  1. 作为Keycloak用户进行身份验证并检索JWT令牌:

    curl -X POST "https://keycloak-service.keycloak-namespace.svc.cluster-domain.example/realms/REALM/protocol/openid-connect/token" \
         -H "Content-Type: application/x-www-form-urlencoded" \
         -d "username=USER" \
         -d "password=PASSWORD" \
         -d "grant_type=password" \
         -d "client_id=CLIENT" \
         -d "client_secret=SECRET"
    
    • USERPASSWORD 替换为 REALM 上的 Keycloak 用户的凭据。

    • CLIENTSECRET 替换为 REALM 上用于MinIO的Keycloak客户端的客户端ID和密钥。

    您可以使用 jq 或类似的JSON格式化实用程序处理结果。 提取 access_token 字段以检索必要的访问令牌。 请注意 expires_in 字段以记录令牌在过期之前的秒数。

  2. 使用 AssumeRoleWithWebIdentity API 生成 MinIO 凭据。

    curl -X POST "https://minio.minio-tenant.svc.cluster-domain.example" \
         -H "Content-Type: application/x-www-form-urlencoded" \
         -d "Action=AssumeRoleWithWebIdentity" \
         -d "Version=2011-06-15" \
         -d "DurationSeconds=86000" \
         -d "WebIdentityToken=TOKEN"
    

    TOKEN 替换为 Keycloak 返回的 access_token 值。

    API 成功返回一个包含以下键的 XML 文档:

    • Credentials.AccessKeyId - Keycloak 用户的访问密钥

    • Credentials.SecretAccessKey - Keycloak 用户的秘密密钥

    • Credentials.SessionToken - Keycloak 用户的会话令牌

    • Credentials.Expiration - 生成的凭据的过期日期

  3. 测试凭据

    使用您喜欢的 S3 兼容 SDK,使用生成的凭据连接到 MinIO。

    例如,使用 MinIO 的 Python SDK,以下 Python 代码连接到 MinIO 部署并返回存储桶列表:

    from minio import Minio
    
    client = MinIO(
       "minio.minio-tenant.svc.cluster-domain.example",
       access_key = "ACCESS_KEY",
       secret_key = "SECRET_KEY",
       session_token = "SESSION_TOKEN"
       secure = True
    )
    
    client.list_buckets()
    

下一步

应用程序应使用其所选择的 SDK 实现 STS AssumeRoleWithWebIdentity 流程。 当STS凭证过期时,应用程序应具备逻辑以在重试和继续操作之前重新生成JWT令牌、STS令牌和MinIO凭证。

或者,用户可以通过MinIO控制台生成 访问密钥 ,以使用其Keycloak凭据创建类似于长期API-key的访问。

启用 Keycloak 管理 REST API

MinIO 支持使用 Keycloak 管理 REST API 来检查经过身份验证的用户是否存在于 Keycloak 领域中 并且 已启用。 此功能允许 MinIO 更快地从先前经过身份验证的 Keycloak 用户中删除访问权限。 如果没有这个功能,MinIO 只能在最后检索的身份验证令牌过期时禁用已禁用或已删除用户的访问权限。

此过程假定已配置了 Keycloak 作为外部身份管理器的现有 MinIO 部署。

1) 创建必要的客户端作用域。

导航到 客户端作用域 视图,然后创建一个新范围:

Name

将其设置为可识别的范围名称( minio-admin-API-access

Mappers

选择 配置新映射器

Audience

名称 设置为任何可识别的映射名称( minio-admin-api-access-mapper

Included Client Audience

将其设置为 security-admin-console

导航到 客户端 并选择MinIO客户端。

  1. 服务账户角色 中选择 分配角色,然后分配 admin 角色

  2. 客户端范围 中选择 添加客户端范围,然后添加先前创建的范围

导航到 设置 并确保 身份验证流 包括 服务账户角色

2) 验证管理员API访问

您可以使用MinIO客户端凭据使用管理员REST API来检验其功能以检索令牌和用户数据:

  1. 检索令牌::

    curl -d "client_id=minio" \
         -d "client_secret=secretvalue" \
         -d "grant_type=password" \
         http://keycloak-url:port/admin/realms/REALM/protocol/openid-connect/token
    
  2. 使用返回的 access_token 值来访问管理员API:

    curl -H "Authentication: Bearer ACCESS_TOKEN_VALUE" \
         http://keycloak-url:port/admin/realms/REALM/users/UUID
    

    UUID 替换为要检索的用户的唯一标识符。 响应应类似于以下内容:

    {
       "id": "954de141-781b-4eaf-81bf-bf3751cdc5f2",
       "createdTimestamp": 1675866684976,
       "username": "minio-user-1",
       "enabled": true,
       "totp": false,
       "emailVerified": false,
       "firstName": "",
       "lastName": "",
       "attributes": {
          "policy": [
             "readWrite"
          ]
       },
       "disableableCredentialTypes": [],
       "requiredActions": [],
       "notBefore": 0,
       "access": {
          "manageGroupMembership": true,
          "view": true,
          "mapRoles": true,
          "impersonate": true,
          "manage": true
       }
    }
    

    如果返回的值为 enabled: falsenull (用户已从Keycloak中删除),MinIO将撤销已经验证的用户的访问权限。

3) 在MinIO上启用Keycloak管理员支持

MinIO支持多种配置Keycloak管理API支持的方法:

  • 使用终端/Shell和 mc idp openid 命令

  • 在启动MinIO之前设置环境变量

您可以使用 mc idp openid update 命令来修改现有Keycloak服务的配置设置。 或者,您可以在首次设置Keycloak时包括以下配置设置。 该命令接受所有支持的 OpenID配置设置:

mc idp openid update ALIAS KEYCLOAK_IDENTIFIER \
   vendor="keycloak" \
   keycloak_admin_url="https://keycloak-url:port/admin"
   keycloak_realm="REALM"
  • 请将 KEYCLOAK_IDENTIFIER 替换为配置的Keycloak IDP的名称。 您可以使用 mc idp openid ls 命令查看MinIO部署上所有配置的IDP配置。

  • keycloak_admin_url 配置设置中指定Keycloak管理员URL。

  • keycloak_realm 配置设置中指定Keycloak Realm名称。

在适当的配置位置(例如 /etc/default/minio )中设置以下 环境变量

以下示例代码设置了启用现有Keycloak配置的Keycloak Admin API所需的最低环境变量。 将后缀 _PRIMARY_IAM 替换为目标Keycloak配置的唯一标识符。

MINIO_IDENTITY_OPENID_VENDOR_PRIMARY_IAM="keycloak"
MINIO_IDENTITY_OPENID_KEYCLOAK_ADMIN_URL_PRIMARY_IAM="https://keycloak-url:port/admin"
MINIO_IDENTITY_OPENID_KEYCLOAK_REALM_PRIMARY_IAM="REALM"
  • MINIO_IDENTITY_OPENID_KEYCLOAK_ADMIN_URL 中指定Keycloak管理员URL。

  • MINIO_IDENTITY_OPENID_KEYCLOAK_REALM 中指定Keycloak Realm名称。

Join Slack 商业支持购买咨询