配置 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 部署
此过程假设现有 MinIO 集群运行 最新稳定的 MinIO 版本。 有关新 MinIO 部署的更完整文档,请参阅 安装和部署MinIO。
本操作步骤 可能 会按预期适用于较旧版本的 MinIO。
Keycloak 部署和领域配置
本操作步骤假设您可以访问一个现有的 Keycloak 部署并拥有管理员权限。 具体而言,您必须拥有在 Keycloak 部署中创建和配置领域、客户端、客户端范围、领域角色、用户和组的权限。
本操作步骤假设 Keycloak 和 MinIO 部署之间存在双向访问。
安装和配置 mc
,以便访问 MinIO 集群
本操作步骤使用 mc
在 MinIO 集群上执行操作。
在具有对集群的网络访问权限的机器上安装 mc
。
请查看 mc
安装快速入门 获取有关下载和安装 mc
的说明。
本操作步骤假定已经配置了 MinIO 集群的 alias
。
为 Keycloak 身份管理配置 MinIO
1) 配置或创建用于访问Keycloak的客户端
在Keycloak的 管理控制台 中进行身份验证,并导航到 Clients 。
选择 Create client 并按照说明为MinIO创建一个新的Keycloak客户端。 按照以下方式填写指定的输入:
Client ID |
设置为MinIO的唯一标识符( |
---|---|
Client type |
设置为 |
Always display in console |
切换为 |
Client authentication |
切换为 |
Authentication flow |
打开 |
(可选) Authentication flow |
打开 |
Keycloak部署客户端时使用默认的配置值集合。 根据您的Keycloak设置和所需的行为进行必要的值修改。 下表提供了配置设置和值的标准:
Root URL |
设置为 |
---|---|
Home URL |
设置为您想要MinIO使用的Realm( |
Valid Redirect URI |
设置为 |
Keys -> Use JWKS URL |
切换为 |
Advanced -> Advanced Settings -> Access Token Lifespan |
设置为 |
2) 为 MinIO 客户端创建客户端范围
客户端范围允许Keycloak将用户属性映射为身份验证请求中返回的JSON Web Token(JWT)的一部分。这使得MinIO在向用户分配策略时能够引用这些属性。 此步骤创建必要的客户端范围,在成功进行Keycloak身份验证后支持MinIO授权。
导航到 Client scopes 视图并创建一个新的MinIO授权客户端范围:
Name |
设置为策略的任何可识别名称( |
---|---|
Include in token scope |
切换为 |
创建后,从列表中选择该作用域并导航到 Mappers。
选择 Configure a new mapper 以创建一个新映射:
User Attribute |
选择映射器类型 |
---|---|
Name |
设置映射的任何可识别名称( |
User Attribute |
设置为 |
Token Claim Name |
设置为 |
Add to ID token |
设置为 |
Claim JSON Type |
设置为 |
Multivalued |
设置为 这样可以在单个声明中设置多个 |
Aggregate attribute values |
设置为 这样可以使用户继承其所在组中设置的任何 |
创建后,将客户端作用域分配给MinIO客户端。
导航至 Clients 并选择MinIO客户端。
选择 Client scopes,然后选择 Add client scope。
选择先前创建的作用域,并将 Assigned type 设置为
default
。
3) 为Keycloak用户/组应用必要的属性
您必须给Keycloak用户或组分配一个名为 policy
的属性。
将该值设置为MinIO部署中的任何 policy 。
对于用户,请导航至 Users 并选择或创建用户:
Credentials |
如果尚未设置,请将用户密码设置为永久值。 |
---|---|
Attributes |
创建一个具有键 |
对于组,请导航至 Groups 并选择或创建组:
Attributes |
创建一个具有键 |
---|
您可以将用户分配到组中,以便他们继承指定的 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-url.example.net:8080/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之前设置环境变量
以具有 MinIO 部署的管理员权限的用户身份登录,例如具有 consoleAdmin
策略的用户。
从左侧导航栏中选择 Identity ,然后选择 OpenID。 选择 Create Configuration 以创建新配置。
在模态框中输入以下信息:
Name |
为 Keycloak 实例输入一个唯一的名称 |
---|---|
Config URL |
指定 Keycloak OpenID 配置文档的地址 (keycloak-url.example.net:8080) 确保 |
Client ID |
指定在步骤 1 中创建的 Keycloak 客户端的名称。 |
Client Secret |
指定步骤 1 中创建的 Keycloak 客户端的秘密凭据值。 |
Display Name |
指定用户可见的名称,作为已配置的 Keycloak 服务在单点登录 (SSO) 工作流程中 MinIO 控制台显示的一部分。 |
Scopes |
指定要在 JWT 中包含的 OpenID 范围,例如 您可以使用支持的 OpenID 策略变量引用这些范围,以便进行编程策略。 |
Redirect URI Dynamic |
切换为 替换客户端作为 Keycloak 重定向 URI 的一部分使用的 MinIO 控制台地址。 Keycloak 将经过身份验证的用户返回到使用提供的 URI 的控制台。 对于部署在反向代理、负载均衡器或类似网络控制平面后面的 MinIO 控制台,您可以使用 |
选择 保存 以应用配置。
您可以使用 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-url.example.net:8080/realms/REALM/.well-known/openid-configuration" \
display_name="SSO_IDENTIFIER"
scopes="openid,email,preferred_username" \
redirect_uri_dynamic="on"
|
将其设置为 Keycloak 服务的唯一标识符,例如 |
---|---|
MINIO_CLIENT MINIO_CLIENT_SECRET |
将其设置为步骤 1 中配置的 Keycloak 客户端 ID 和密钥。 |
|
将其设置为 Keycloak OpenID 配置文档的地址(keycloak-url.example.net:8080)。 |
|
将其设置为 MinIO 控制台作为已配置的 Keycloak 服务的单点登录 (SSO) 工作流程的一部分显示给用户的名称。 |
|
将其设置为要包含在 JWT 中的 OpenID 范围列表,例如 |
|
设置为 替换客户端作为 Keycloak 重定向 URI 的 MinIO 控制台地址。 提供的 URI 用于 Keycloak 将经过身份验证的用户返回到控制台。 对于部署在反向代理、负载均衡器或类似网络控制平面后面的 MinIO 控制台,您可以使用 |
在使用 -e ENVVAR=VALUE
标志启动容器之前,请设置以下 环境变量。
以下示例代码设置了与将 Keycloak 配置为外部身份管理提供程序相关的最低环境变量要求。
MINIO_IDENTITY_OPENID_CONFIG_URL_PRIMARY_IAM="https://keycloak-url.example.net:8080/.well-known/openid-configuration"
MINIO_IDENTITY_OPENID_CLIENT_ID_PRIMARY_IAM="MINIO_CLIENT"
MINIO_IDENTITY_OPENID_CLIENT_SECRET_PRIMARY_IAM="MINIO_CLIENT_SECRET"
MINIO_IDENTITY_OPENID_DISPLAY_NAME_PRIMARY_IAM="SSO_IDENTIFIER"
MINIO_IDENTITY_OPENID_SCOPES_PRIMARY_IAM="openid,email,preferred_username"
MINIO_IDENTITY_OPENID_REDIRECT_URI_DYNAMIC_PRIMARY_IAM="on"
|
将后缀 如果您只打算为部署配置单个 OIDC 提供程序,则可以省略后缀。 |
---|---|
|
请指定 Keycloak OpenID 配置文档的地址(keycloak-url.example.net:8080) 请确保 |
CLIENT_ID CLIENT_SECRET |
请指定在步骤 1 中配置的 Keycloak 客户端 ID 和密钥 |
|
请指定 MinIO 控制台所显示的用户可见名称,作为已配置的 Keycloak 服务 Single-Sign On (SSO) 工作流程的一部分 |
|
请指定您想要在 JWT 中包括的 OpenID 范围,例如 |
|
设置为 替换客户端用作 Keycloak 重定向 URI 的 MinIO 控制台地址。 Keycloak 将经过身份验证的用户返回到提供的 URI 上使用的控制台。 对于部署在反向代理、负载均衡器或类似网络控制面之后的 MinIO 控制台,您可以使用 |
有关这些变量的完整文档,请参阅 minio-server-envvar-external-identity-management-openid
重新启动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
实用程序测试此工作流程:
作为Keycloak用户进行身份验证并检索JWT令牌:
curl -X POST "https://keycloak-url.example.net:8080/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"
将
USER
和PASSWORD
替换为REALM
上的 Keycloak 用户的凭据。将
CLIENT
和SECRET
替换为REALM
上用于MinIO的Keycloak客户端的客户端ID和密钥。
您可以使用
jq
或类似的JSON格式化实用程序处理结果。 提取access_token
字段以检索必要的访问令牌。 请注意expires_in
字段以记录令牌在过期之前的秒数。使用
AssumeRoleWithWebIdentity
API 生成 MinIO 凭据。curl -X POST "https://minio-url.example.net:9000" \ -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
- 生成的凭据的过期日期
测试凭据
使用您喜欢的 S3 兼容 SDK,使用生成的凭据连接到 MinIO。
例如,使用 MinIO 的 Python SDK,以下 Python 代码连接到 MinIO 部署并返回存储桶列表:
from minio import Minio client = MinIO( "minio-url.example.net:9000", 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 |
将其设置为可识别的范围名称( |
---|---|
Mappers |
选择 配置新映射器 |
Audience |
将 名称 设置为任何可识别的映射名称( |
Included Client Audience |
将其设置为 |
导航到 客户端 并选择MinIO客户端。
从 服务账户角色 中选择 分配角色,然后分配
admin
角色从 客户端范围 中选择 添加客户端范围,然后添加先前创建的范围
导航到 设置 并确保 身份验证流 包括 服务账户角色
。
2) 验证管理员API访问
您可以使用MinIO客户端凭据使用管理员REST API来检验其功能以检索令牌和用户数据:
检索令牌::
curl -d "client_id=minio" \ -d "client_secret=secretvalue" \ -d "grant_type=password" \ http://keycloak-url:port/admin/realms/REALM/protocol/openid-connect/token
使用返回的
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: false
或null
(用户已从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名称。