这是本节的多页打印视图。 .
外部身份管理
MinIO 支持通过以下 IDentity Providers (IDP) 对接多种外部身份管理器:
以下教程针对特定 IDP 软件提供了具体指导:
用户可以使用外部管理的凭证和相关的 Security Token Service (STS) API 对 MinIO 进行认证。 认证成功后,MinIO 会尝试将该用户与一个或多个已配置的 策略 关联。 未关联任何策略的用户,对 MinIO 部署不具备任何权限。
OpenID Connect (OIDC)
MinIO 支持使用兼容 OpenID Connect (OIDC) 的 IDentity Provider (IDP) 来管理外部用户身份,例如 Okta、KeyCloak、Dex、Google 或 Facebook。 配置外部 IDP 后,即可启用 Single-Sign On 工作流,应用程序会先向外部 IDP 完成认证,再访问 MinIO。
MinIO 使用 Policy Based Access Control (PBAC) 来定义认证用户可访问的操作和资源。 MinIO 支持创建和管理可供外部身份用户声明使用的 策略。
对于由外部兼容 OpenID Connect (OIDC) 的提供方管理的身份,MinIO 使用 JSON Web Token claim 来识别应分配给认证用户的 策略。
默认情况下,MinIO 会查找名为 policy 的 claim,并读取其中一个或多个策略名进行分配。 MinIO 会尝试将该 JWT claim 中列出的策略,与部署上已存在的策略进行匹配。 如果指定的策略在 MinIO 部署上一个都不存在,MinIO 会拒绝该用户发起的全部操作授权。 例如,考虑如下 claim 键值:
该策略 claim 指示 MinIO 将名称分别匹配 readwrite_data、read_analytics 和 read_logs 的策略附加到认证用户。
你可以通过 MINIO_IDENTITY_OPENID_CLAIM_NAME 环境变量设置自定义策略 claim, 或者 使用 mc admin config set 设置 identity_openid claim_name 配置项。
关于如何将 MinIO 策略映射到 OIDC 托管身份,请参见 OpenID Connect 访问管理。
你可以使用 JWT Debugging tool 对返回的 JWT token 进行解码,并验证用户属性中是否包含指定 claim。 关于 JWT claim 的更多信息,请参见 RFC 7519: JWT Claim。 关于如何配置用户 claim,请以所选 OIDC 提供方的文档为准。
Active Directory / LDAP
MinIO 支持使用 Active Directory 或 LDAP (AD/LDAP) 服务对用户身份进行外部管理。 配置外部 IDentity Provider (IDP) 后,即可启用 Single-Sign On (SSO) 工作流,应用程序会先向外部 IDP 认证,再访问 MinIO。
查询 Active Directory / LDAP 服务
MinIO 会查询已配置的 Active Directory / LDAP 服务器,以验证应用程序提供的凭证,并可选地返回该用户所属组列表。 该过程称为 Lookup-Bind 模式,它使用一个权限最小化的 AD/LDAP 用户,仅用于在 AD/LDAP 服务器上执行用户与组查询所需的认证。
以下标签页给出了启用 Lookup-Bind 模式所需环境变量和配置项的参考:
AD/LDAP 托管身份的访问控制
MinIO 使用 Policy Based Access Control (PBAC) 来定义认证用户可访问的操作和资源。 在使用 Active Directory/LDAP 服务器进行身份管理(认证)时,MinIO 仍通过 PBAC 来维护访问控制(授权)。
当用户使用其 AD/LDAP 凭证成功认证到 MinIO 后,MinIO 会搜索所有显式关联到该用户 Distinguished Name (DN) 的 策略。 具体来说,必须使用 mc idp ldap policy attach 命令,将策略分配给拥有匹配 DN 的用户。
MinIO 还支持查询用户的 AD/LDAP 组成员关系。 MinIO 会尝试将已存在的策略与用户所属各组的 DN 进行匹配。 认证用户的完整权限集合由显式分配策略和从组继承的策略共同组成。 更多信息请参见 组查询。
MinIO 默认采用 deny-by-default 行为,即未显式分配任何策略、也未从组继承任何策略的用户,无法访问 MinIO 部署中的任何资源。
MinIO 提供 内置策略 以满足基础访问控制需求。 你可以使用 mc admin policy create 命令创建新策略。
组查询
MinIO 支持向 Active Directory / LDAP 服务器查询认证用户所属组列表。 MinIO 会尝试将现有 策略 与各组 DN 进行匹配,并将所有匹配到的策略分配给认证用户。
以下标签页给出了启用组查询所需环境变量和配置项的参考:
关于这些变量的更多信息,请参见 Active Directory / LDAP 设置 参考文档。配置 MinIO 使用 Active Directory / LDAP 进行认证 教程中包含这些值的完整配置说明。
关于这些设置的更多信息,请参见 identity_ldap 参考文档。 配置 MinIO 使用 Active Directory / LDAP 进行认证 教程中包含这些变量的完整配置说明。
1 - 配置 Silo 使用 Active Directory / LDAP 进行认证
概览
MinIO 支持配置单个 Active Directory / LDAP 连接,用于对用户身份进行外部管理。
本页流程提供以下内容的操作说明:
对于使用 MinIO Kubernetes Operator 部署的 MinIO Tenant,本流程包括:
- 配置 MinIO Tenant 使用外部 AD/LDAP 提供方
- 使用 AD/LDAP 凭证访问 Tenant Console
- 使用 MinIO
AssumeRoleWithLDAPIdentitySecurity Token Service (STS) API 生成供应用程序使用的临时凭证
对于部署在裸金属基础设施上的 MinIO,本流程包括:
- 为 MinIO 集群配置外部 AD/LDAP 提供方
- 使用 AD/LDAP 凭证访问 MinIO Console
- 使用 MinIO
AssumeRoleWithLDAPIdentitySecurity Token Service (STS) API 生成供应用程序使用的临时凭证
本流程是面向 AD/LDAP 服务的通用配置流程。 有关用户身份配置的具体步骤,请参阅你所选 AD/LDAP 提供方的文档。
前提条件
访问 MinIO 集群
你必须能够访问 MinIO Operator Console Web UI。 你可以使用自己偏好的 Kubernetes 路由组件暴露 MinIO Operator Console service,也可以通过临时端口转发,在本地机器上暴露 Console service 端口。
兼容 Active Directory / LDAP 的身份提供方
本流程假定你已经拥有一个现成的 Active Directory 或 LDAP 服务。 AD/LDAP 本身的配置不在本流程范围内。
- 如果 AD/LDAP 部署与 MinIO Tenant 位于同一 Kubernetes 集群内,你可以使用 Kubernetes service 名称,让 MinIO Tenant 能够连接到 AD/LDAP 服务。
- 如果 AD/LDAP 部署位于 Kubernetes 集群外部,则必须确保该集群支持 Kubernetes services、pods 与外部网络之间的通信路由。 这可能需要配置或部署额外的 Kubernetes 网络组件,和/或启用访问公网的能力。
MinIO 部署必须与目标 AD / LDAP 服务保持双向网络连通。
MinIO 需要一组只读访问凭证,以便通过 bind 执行认证用户和组查询。 请确保每个打算与 MinIO 配合使用的 AD/LDAP 用户和组,都在 MinIO 部署上拥有对应的 策略。 如果某个 AD/LDAP 用户没有分配任何策略,并且 所属组也都没有分配任何策略,那么该用户无权访问 MinIO 集群中的任何操作或资源。
为 MinIO 配置 Active Directory 或 LDAP 外部身份管理
-
设置 Active Directory / LDAP 配置项
你可以使用以下任一方式配置 AD/LDAP 提供方:
- MinIO Client
- 环境变量
所有方式都需要启动或重启 MinIO 部署后才能生效。
以下选项卡给出了可用配置方式的速查:
MinIO 支持使用
mc idp ldap命令配置 AD/LDAP 提供方设置。对于分布式部署,
mc idp ldap命令会将配置应用到部署中的所有节点。以下示例代码设置了外部身份管理所需的全部 AD/LDAP 相关配置项。 至少需要以下设置:
对于 Kubernetes 部署,请确保 ALIAS 对应 MinIO Tenant 的外部可访问主机名。
这些设置的完整文档请参阅
mc idp ldap。说明建议使用
mc idp ldap相比
mc admin config set运行时配置,mc idp ldap提供了更多功能和更完善的校验能力。mc idp ldap支持与mc admin config以及identity_ldap配置键相同的设置项。identity_ldap配置键仍可用于现有脚本和工具。MinIO 支持使用 环境变量 指定 AD/LDAP 提供方设置。
minio server进程会在下一次启动时应用这些设置。 对于分布式部署,请在部署中的所有节点上使用 相同 的值设置这些变量。 节点之间的配置不一致会导致启动或配置失败。以下示例代码设置了外部身份管理所需的全部 AD/LDAP 相关环境变量。 至少需要以下变量:
MINIO_IDENTITY_LDAP_SERVER_ADDRMINIO_IDENTITY_LDAP_LOOKUP_BIND_DNMINIO_IDENTITY_LDAP_LOOKUP_BIND_PASSWORDMINIO_IDENTITY_LDAP_USER_DN_SEARCH_BASE_DNMINIO_IDENTITY_LDAP_USER_DN_SEARCH_FILTER
这些变量的完整文档请参阅 Active Directory / LDAP 设置。
-
重启 MinIO 部署
你必须重启 MinIO 部署,才能应用这些配置更改。
如果你是在 MinIO Console 中配置 AD/LDAP,则无需额外操作。 MinIO Console 会在保存新的 AD/LDAP 配置后自动重启部署。
对于 MinIO Client 和环境变量方式,请使用
mc admin service restart命令重启部署:将
ALIAS替换为要重启部署的 alias。 -
使用 AD/LDAP 凭证登录 MinIO Console
MinIO Console 支持完整工作流,包括向 AD/LDAP 提供方认证、 使用 MinIO AssumeRoleWithLDAPIdentity Security Token Service (STS) 端点生成临时凭证, 以及将用户登录到 MinIO 部署。
你可以通过访问 MinIO 集群的根 URL 打开 Console, 例如
https://minio.example.net:9000。登录后,你可以执行该认证用户 被授权 的任何操作。
你还可以为必须在 MinIO 上执行操作的支持型应用程序创建 access key。 Access Key 是长期有效的凭证,会继承父用户的权限。 父用户还可以在创建服务账户时进一步限制这些权限。
-
使用 AD/LDAP 凭证生成 S3 兼容临时凭证
MinIO 要求客户端使用 AWS Signature Version 4 协议 进行认证,同时兼容已弃用的 Signature Version 2 协议。 具体来说,客户端必须提供有效的 access key 和 secret key, 才能访问任意 S3 或 MinIO 管理 API,例如
PUT、GET和DELETE。应用程序可以按需使用 AssumeRoleWithLDAPIdentity Security Token Service (STS) API 端点 和 AD/LDAP 用户凭证生成临时访问凭证。 MinIO 提供了示例 Go 应用程序 ldap.go, 用于演示该工作流。
-
将
LDAPUsername替换为 AD/LDAP 用户名。 -
将
LDAPPassword替换为 AD/LDAP 用户密码。 -
将
Policy替换为内联、经过 URL 编码的 JSON policy, 以进一步限制这些临时凭证关联的权限。如果省略,则会使用名称与 AD/LDAP 用户 Distinguished Name (DN) 匹配的 policy。
API 响应为 XML 文档,其中包含 access key、secret key、session token 和过期时间。 应用程序可使用 access key 和 secret key 访问 MinIO 并执行操作。
参考文档请参阅 AssumeRoleWithLDAPIdentity。
-
禁用已配置的 Active Directory / LDAP 连接
新增: RELEASE.2023-03-20T20-16-18Z
你可以按需启用或禁用已配置的 AD/LDAP 连接。
使用 mc idp ldap disable 停用已配置连接。 使用 mc idp ldap enable 激活此前已配置的连接。
2 - 配置 Silo 使用 Keycloak 进行认证
概览
本流程将 MinIO 配置为通过 OpenID Connect (OIDC) 协议,使用 Keycloak 作为外部 Identity Provider (IDP) 来认证用户。
本页提供了在 Kubernetes 和裸金属 基础设施上的 MinIO 部署中配置 OIDC 的流程。
请选择与你基础设施对应的标签页,在不同说明集之间切换。
对于使用 MinIO Kubernetes Operator 部署的 MinIO Tenant,本流程包括:
- 配置 Keycloak 以配合 MinIO 认证与授权
- 配置新的或现有的 MinIO Tenant,使其使用 Keycloak 作为 OIDC 提供方
- 创建用于控制 Keycloak 认证用户访问权限的策略
- 使用 SSO 和 Keycloak 托管身份登录 MinIO Tenant Console
- 使用
AssumeRoleWithWebIdentitySecurity Token Service (STS) API 生成临时 S3 访问凭证
对于部署在裸金属基础设施上的 MinIO,本流程包括:
- 配置 Keycloak 以配合 MinIO 认证与授权
- 配置新的或现有的 MinIO 集群,使其使用 Keycloak 作为 OIDC 提供方
- 创建用于控制 Keycloak 认证用户访问权限的策略
- 使用 SSO 和 Keycloak 托管身份登录 MinIO Console
- 使用
AssumeRoleWithWebIdentitySecurity Token Service (STS) API 生成临时 S3 访问凭证
本流程基于 Keycloak 21.0.0 编写并完成测试。 这些说明也可能适用于其他 Keycloak 版本。 本流程假定你已经具备 Keycloak 的使用经验,并已阅读 其文档,以获取部署、配置和管理该服务的指导和最佳实践。
前提条件
Keycloak 部署与 Realm 配置
本流程假定你已经拥有一个现成的 Keycloak 部署,并且具备其管理访问权限。 具体来说,你必须拥有在该 Keycloak 部署上创建和配置 Realms、Clients、Client Scopes、Realm Roles、Users 和 Groups 的权限。
对于与 MinIO Tenant 位于同一 Kubernetes 集群内的 Keycloak 部署,本流程假定 Keycloak 与 MinIO 的 pods/services 之间具备双向访问能力。 对于位于 Kubernetes 集群外部的 Keycloak 部署,本流程假定已经存在用于管理 MinIO Tenant 入站和出站访问的 Ingress、Load Balancer 或类似 Kubernetes 网络控制组件。
MinIO 部署必须与目标 OIDC 服务保持双向访问。
请确保每个打算与 MinIO 配合使用的用户身份,都配置了合适的 claim,以便 MinIO 能将认证用户关联到某个 策略。 未分配任何策略的 OpenID 用户,无权访问 MinIO 集群中的任何操作或资源。
访问 MinIO 集群
你必须能够访问 MinIO Operator Console Web UI。 你可以使用自己偏好的 Kubernetes 路由组件暴露 MinIO Operator Console Service,也可以通过临时端口转发,在本地机器上暴露 Console Service 端口。
为 MinIO 配置 Keycloak 身份管理
-
配置或创建用于访问 Keycloak 的 Client
认证到 Keycloak Administrative Console,然后进入 Clients。
选择 Create client,按照提示为 MinIO 创建一个新的 Keycloak client。 按如下方式填写指定输入项:
Client ID
设置为 MinIO 的唯一标识符(
minio)Client type
设置为
OpenID ConnectAlways display in console
切换为
OnClient authentication
切换为
OnAuthentication flow
打开
Standard flow(可选)Authentication flow
打开
Direct access grants(API 测试)Keycloak 会以一组默认配置值部署该 client。 请根据你的 Keycloak 环境和期望行为按需修改这些值。 下表提供了一组可用于配置的基线设置和值:
Root URL
设置为
${authBaseUrl}Home URL
设置为 MinIO 要使用的 Realm(
/realms/master/account/)Valid Redirect URI
设置为
*Keys -> Use JWKS URL
切换为
OnAdvanced -> Advanced Settings -> Access Token Lifespan
设置为
1 Hour。 -
为 MinIO Client 创建 Client Scope
Client scope 允许 Keycloak 在认证请求返回的 JSON Web Token(JWT)中映射用户属性。 这样 MinIO 就可以在向用户分配策略时引用这些属性。 这一步会创建在 Keycloak 认证成功后支持 MinIO 授权所需的 client scope。
进入 Client scopes 视图,为 MinIO 授权创建一个新的 client scope:
Name
设置为任意易识别的策略名称(
minio-authorization)Include in token scope
切换为
On创建完成后,从列表中选中该 scope,并进入 Mappers。
选择 Configure a new mapper 创建新的映射:
User Attribute
选择 Mapper Type
Name
设置为任意易识别的映射名称(
minio-policy-mapper)User Attribute
设置为
policyToken Claim Name
设置为
policyAdd to ID token
设置为
OnClaim JSON Type
设置为
StringMultivalued
设置为
On这样可以在单个 claim 中设置多个
policy值。Aggregate attribute values
设置为
On这样用户就可以继承其所属 Group 中设置的任意
policy。创建完成后,将该 Client Scope 分配给 MinIO client。
- 进入 Clients 并选择 MinIO client。
- 选择 Client scopes,然后选择 Add client scope。
- 选择先前创建的 scope,并将 Assigned type 设置为
default。
-
将所需属性应用到 Keycloak Users/Groups
你必须为 Keycloak Users 或 Groups 分配一个名为
policy的属性。 将其值设置为 MinIO 部署上的任意 policy。对于 Users,进入 Users 并选择或创建 User:
Credentials
如果尚未设置,将用户密码设置为永久值
Attributes
创建一个新属性,键为
policy,值为 MinIO 部署上的任意 policy (consoleAdmin)对于 Groups,进入 Groups 并选择或创建 Group:
Attributes
创建一个新属性,键为
policy,值为 MinIO 部署上的任意 policy (consoleAdmin)你可以将用户加入组,使其继承指定的
policy属性。 如果 Mapper 设置中启用了 Aggregate attribute values, Keycloak 会在已认证用户的 JWT token 中包含聚合后的策略数组。 MinIO 可以在为用户授权时使用这份策略列表。你可以使用 Keycloak API 测试某个用户配置的策略:
如果成功,
access_token中会包含调用 MinIO AssumeRoleWithWebIdentity STS API 并生成 S3 凭证所需的 JWT。你可以使用 JWT 解码器检查其载荷,确认其中包含
policy键, 且列出了一个或多个 MinIO policy。 -
为 Keycloak 认证配置 MinIO
你可以使用 mc idp openid add 命令为 Keycloak 服务创建新配置。 该命令接受所有受支持的 OpenID Configuration Settings:
|
设置为该 Keycloak 服务的唯一标识符,例如 |
MINIO_CLIENTMINIO_CLIENT_SECRET |
设置为步骤 1 中配置的 Keycloak client ID 和 secret |
|
设置为 Keycloak OpenID 配置文档的地址(keycloak-service.keycloak-namespace.svc.cluster-domain.example) |
|
设置为 MinIO Console 在单点登录(SSO)流程中向用户显示的该 Keycloak 服务名称 |
|
设置为你希望包含在 JWT 中的 OpenID scope 列表,例如 |
|
设置为 这会将客户端所使用的 MinIO Console 地址替换到 Keycloak 重定向 URI 中。 Keycloak 会使用提供的 URI 将已认证用户返回到 Console。 对于位于反向代理、负载均衡器或类似网络控制平面之后的 MinIO Console 部署,
你也可以使用 |
重启 MinIO 部署以应用这些更改。
检查 MinIO 日志,确认启动成功,且没有与 OIDC 配置相关的错误。
-
使用 Security Token Service(STS)生成应用程序凭证
使用 S3 兼容 SDK 的应用程序必须以 Access Key 和 Secret Key 的形式提供凭证。 MinIO AssumeRoleWithWebIdentity API 会使用 Keycloak 在认证后返回的 JWT 返回所需的临时凭证, 其中包括必须提供的 session token。
你可以使用以下 HTTP 调用序列和
curl工具测试这一工作流:-
以 Keycloak 用户身份认证并获取 JWT token
- 将
USER和PASSWORD替换为REALM中某个 Keycloak 用户的凭证。 - 将
CLIENT和SECRET替换为该REALM中 MinIO 专用 Keycloak client 的 ID 和 secret。
你可以使用
jq或类似的 JSON 格式化工具处理返回结果。 提取access_token字段以获取所需的访问 token。 同时关注expires_in字段,以了解 token 过期前还剩多少秒。 - 将
-
使用
AssumeRoleWithWebIdentityAPI 生成 MinIO 凭证将
TOKEN替换为 Keycloak 返回的access_token值。API 成功时会返回一个 XML 文档,其中包含以下键:
Credentials.AccessKeyId- Keycloak 用户的 Access KeyCredentials.SecretAccessKey- Keycloak 用户的 Secret KeyCredentials.SessionToken- Keycloak 用户的 Session TokenCredentials.Expiration- 生成凭证的过期时间
-
测试这些凭证
使用你偏好的 S3 兼容 SDK,利用生成的凭证连接到 MinIO。
例如,下面的 Python 代码使用 MinIO Python SDK 连接到 MinIO 部署并返回存储桶列表:
-
-
后续步骤
应用程序应使用其选择的 SDK 实现 STS AssumeRoleWithWebIdentity 流程。 当 STS 凭证过期时,应用程序应具备在重试并继续操作之前重新生成 JWT token、 STS token 和 MinIO 凭证的逻辑。
或者,用户也可以通过 MinIO Console 使用其 Keycloak 凭证生成 access keys, 以创建类似长期 API key 的访问方式。
-
配置或创建用于访问 Keycloak 的 Client
认证到 Keycloak Administrative Console,然后进入 Clients。
选择 Create client,按照提示为 MinIO 创建一个新的 Keycloak client。 按如下方式填写指定输入项:
Client ID
设置为 MinIO 的唯一标识符(
minio)Client type
设置为
OpenID ConnectAlways display in console
切换为
OnClient authentication
切换为
OnAuthentication flow
打开
Standard flow(可选)Authentication flow
打开
Direct access grants(API 测试)Keycloak 会以一组默认配置值部署该 client。 请根据你的 Keycloak 环境和期望行为按需修改这些值。 下表提供了一组可用于配置的基线设置和值:
Root URL
设置为
${authBaseUrl}Home URL
设置为 MinIO 要使用的 Realm(
/realms/master/account/)Valid Redirect URI
设置为
*Keys -> Use JWKS URL
切换为
OnAdvanced -> Advanced Settings -> Access Token Lifespan
设置为
1 Hour。 -
为 MinIO Client 创建 Client Scope
Client Scope 允许 Keycloak 在认证请求返回的 JSON Web Token(JWT)中映射用户属性。 这样 MinIO 就可以在向用户分配策略时引用这些属性。 此步骤会创建在 Keycloak 认证成功后支持 MinIO 授权所需的 Client Scope。
进入 Client scopes 视图,为 MinIO 授权创建一个新的 client scope:
Name
设置为任意易识别的策略名称(
minio-authorization)Include in token scope
切换为
On创建完成后,从列表中选中该 scope,并进入 Mappers。
选择 Configure a new mapper 创建新的映射:
User Attribute
选择 Mapper Type
Name
设置为任意易识别的映射名称(
minio-policy-mapper)User Attribute
设置为
policyToken Claim Name
设置为
policyAdd to ID token
设置为
OnClaim JSON Type
设置为
StringMultivalued
设置为
On这样可以在单个 claim 中设置多个
policy值。Aggregate attribute values
设置为
On这样用户就可以继承其所属 Group 中设置的任意
policy。创建完成后,将该 Client Scope 分配给 MinIO client。
- 进入 Clients 并选择 MinIO client。
- 选择 Client scopes,然后选择 Add client scope。
- 选择先前创建的 scope,并将 Assigned type 设置为
default。
-
将所需属性应用到 Keycloak Users/Groups
必须为 Keycloak Users 或 Groups 分配一个名为
policy的属性。 将其值设置为 MinIO 部署上的任意 policy。对于 Users,进入 Users 并选择或创建 User:
Credentials
如果尚未设置,将用户密码设置为永久值
Attributes
创建一个新属性,键为
policy,值为 MinIO 部署上的任意 policy (consoleAdmin)对于 Groups,进入 Groups 并选择或创建 Group:
Attributes
创建一个新属性,键为
policy,值为 MinIO 部署上的任意 policy (consoleAdmin)你可以将用户加入组,使其继承指定的
policy属性。 如果 Mapper 设置中启用了 Aggregate attribute values, Keycloak 会在已认证用户的 JWT token 中包含聚合后的策略数组。 MinIO 可以在为用户授权时使用这份策略列表。你可以使用 Keycloak API 测试某个用户配置的策略:
如果成功,
access_token中会包含调用 MinIO AssumeRoleWithWebIdentity STS API 并生成 S3 凭证所需的 JWT。你可以使用 JWT 解码器检查其载荷,确认其中包含
policy键, 且列出了一个或多个 MinIO policy。 -
为 Keycloak 认证配置 MinIO
MinIO 支持多种配置 Keycloak 认证的方法:
- 使用终端/shell 以及
mc idp openid命令 - 使用在启动 MinIO 之前设置的环境变量
你可以使用
mc idp openid add命令为 Keycloak 服务创建新配置。 该命令接受所有受支持的 OpenID Configuration Settings:PRIMARY_IAM设置为该 Keycloak 服务的唯一标识符,例如
keycloak_primaryMINIO_CLIENTMINIO_CLIENT_SECRET设置为步骤 1 中配置的 Keycloak client ID 和 secret
config_url设置为 Keycloak OpenID 配置文档的地址(keycloak-url.example.net:8080)
display_name设置为 MinIO Console 在单点登录(SSO)流程中向用户显示的该 Keycloak 服务名称
scopes设置为你希望包含在 JWT 中的 OpenID scope 列表,例如
preferred_username或emailredirect_uri_dynamic设置为
on这会将客户端所使用的 MinIO Console 地址替换到 Keycloak 重定向 URI 中。 Keycloak 会使用提供的 URI 将已认证用户返回到 Console。
对于位于反向代理、负载均衡器或类似网络控制平面之后的 MinIO Console 部署, 你也可以使用
MINIO_BROWSER_REDIRECT_URL变量设置 Keycloak 应使用的重定向地址。在使用
-e ENVVAR=VALUE标志启动容器之前, 设置以下 环境变量。下面的示例代码设置了将 Keycloak 配置为外部身份管理提供者所需的最小环境变量集合。
_PRIMARY_IAM将后缀
_PRIMARY_IAM替换为该 Keycloak 配置的唯一标识符。 例如,MINIO_IDENTITY_OPENID_CONFIG_URL_KEYCLOAK_PRIMARY。如果你只打算为该部署配置单个 OIDC 提供者,也可以省略该后缀。
指定 Keycloak OpenID 配置文档的地址(keycloak-url.example.net:8080)
确保其中的
REALM与你希望用于 MinIO 用户认证的 Keycloak realm 一致CLIENT_IDCLIENT_SECRET指定步骤 1 中配置的 Keycloak client ID 和 secret
指定 MinIO Console 在单点登录(SSO)流程中向用户显示的该 Keycloak 服务名称
指定你希望包含在 JWT 中的 OpenID scope,例如
preferred_username或email设置为
on这会将客户端所使用的 MinIO Console 地址替换到 Keycloak 重定向 URI 中。 Keycloak 会使用提供的 URI 将已认证用户返回到 Console。
对于位于反向代理、负载均衡器或类似网络控制平面之后的 MinIO Console 部署, 你也可以使用
MINIO_BROWSER_REDIRECT_URL变量设置 Keycloak 应使用的重定向地址。有关这些变量的完整文档,请参见 OpenID 身份管理设置
重启 MinIO 部署以应用这些更改。
检查 MinIO 日志,确认启动成功,且没有与 OIDC 配置相关的错误。
如果尝试通过 Console 登录,现在应能看到一个使用已配置 Display Name 的(SSO)按钮。
指定一个已配置的用户并尝试登录。 MinIO 应自动将您重定向到 Keycloak 登录页面。 认证成功后,Keycloak 应使用原始 Console URL 或已配置的 Redirect URI 将您重定向回 MinIO Console。 5. 使用 Security Token Service(STS)生成应用程序凭证
使用 S3 兼容 SDK 的应用程序必须以 Access Key 和 Secret Key 的形式提供凭证。 MinIO AssumeRoleWithWebIdentity API 会使用 Keycloak 在认证后返回的 JWT 返回所需的临时凭证, 其中包括必须提供的 session token。
你可以使用以下 HTTP 调用序列和
curl工具测试这一工作流:-
以 Keycloak 用户身份认证并获取 JWT token
- 将
USER和PASSWORD替换为REALM中某个 Keycloak 用户的凭证。 - 将
CLIENT和SECRET替换为该REALM中 MinIO 专用 Keycloak client 的 ID 和 secret。
你可以使用
jq或类似的 JSON 格式化工具处理返回结果。 提取access_token字段以获取所需的访问 token。 同时关注expires_in字段,以了解 token 过期前还剩多少秒。 - 将
-
使用
AssumeRoleWithWebIdentityAPI 生成 MinIO 凭证将
TOKEN替换为 Keycloak 返回的access_token值。API 成功时会返回一个 XML 文档,其中包含以下键:
Credentials.AccessKeyId- Keycloak 用户的 Access KeyCredentials.SecretAccessKey- Keycloak 用户的 Secret KeyCredentials.SessionToken- Keycloak 用户的 Session TokenCredentials.Expiration- 生成凭证的过期时间
-
测试这些凭证
使用你偏好的 S3 兼容 SDK,利用生成的凭证连接到 MinIO。
例如,下面的 Python 代码使用 MinIO Python SDK 连接到 MinIO 部署并返回存储桶列表:
-
后续步骤
应用程序应使用所选 SDK 实现 STS AssumeRoleWithWebIdentity 流程。 当 STS 凭证过期时,应用程序应具备在重试并继续操作之前重新生成 JWT token、 STS token 和 MinIO 凭证的逻辑。
或者,用户也可以通过 MinIO Console 使用其 Keycloak 凭证生成 access keys, 以创建类似长期 API key 的访问方式。
- 使用终端/shell 以及
启用 Keycloak Admin REST API
MinIO 支持使用 Keycloak Admin REST API 检查认证用户是否存在,以及 该用户是否在 Keycloak realm 中处于启用状态。 这一功能使 MinIO 可以更快地撤销此前已经认证过的 Keycloak 用户访问权限。 如果没有这项功能,MinIO 对已禁用或已删除用户最早能够生效的访问撤销时间点,只能等到最后一次获取的认证 token 过期。
本流程假定你已经拥有一个现成的 MinIO 部署,并已将 Keycloak 配置为外部身份管理器。
1) 创建所需的 Client Scopes
进入 Client scopes 视图并创建一个新的 scope:
Name |
将 scope 名称设置为一个易于识别的名字( |
Mappers |
选择 Configure a new mapper |
Audience |
将 Name 设置为一个易于识别的映射名称( |
Included Client Audience |
设置为 |
进入 Clients,并选择 MinIO client
- 在 Service account roles 中,选择 Assign role 并分配
admin角色 - 在 Client scopes 中,选择 Add client scope 并添加前面创建的 scope
进入 Settings,并确保 Authentication flow 中包含 Service accounts roles。
2) 验证 Admin API 访问
你可以使用 MinIO client 凭证调用 Admin REST API,以获取 bearer token 和用户数据,从而验证该功能:
-
获取 bearer token:
-
使用返回结果中的
access_token访问 Admin API:将
UUID替换为你要查询用户的唯一 ID。 响应应类似如下:如果返回值中的 enabled 为 false 或 null(用户已从 Keycloak 中移除),MinIO 会撤销该认证用户的访问权限。
3) 在 MinIO 上启用 Keycloak Admin 支持
MinIO 支持多种方式来配置 Keycloak Admin API 支持:
- 使用终端 / shell 以及
mc idp openid命令 - 使用在启动 MinIO 之前设置的环境变量
你可以使用 mc idp openid update 命令修改现有 Keycloak 服务的配置项。 如果是首次配置 Keycloak,也可以直接在初始设置时包含以下配置项。 该命令接受所有受支持的 OpenID 配置项:
- 将
KEYCLOAK_IDENTIFIER替换为已配置 Keycloak IDP 的名称。 你可以使用mc idp openid ls查看 MinIO 部署上所有已配置的 IDP 项 - 在
keycloak_admin_url配置项中指定 Keycloak admin URL - 在
keycloak_realm中指定 Keycloak Realm 名称
在合适的配置位置(例如 /etc/default/minio)设置以下 环境变量。
以下示例代码设置了在现有 Keycloak 配置上启用 Keycloak Admin API 所需的最小环境变量集合。 请将后缀 _PRIMARY_IAM 替换为目标 Keycloak 配置的唯一标识符。
- 在
MINIO_IDENTITY_OPENID_KEYCLOAK_ADMIN_URL中指定 Keycloak admin URL - 在
MINIO_IDENTITY_OPENID_KEYCLOAK_REALM中指定 Keycloak Realm 名称
3 - 配置 Silo 使用 OpenID 进行认证
概览
MinIO 支持使用兼容 OpenID Connect (OIDC) 的 Identity Provider (IDP) 来管理外部用户身份,例如 Okta、KeyCloak、Dex、Google 或 Facebook。
本页提供了在 Kubernetes 和裸金属基础设施上的 MinIO 部署中配置 OIDC 的流程。
本流程包括:
- 为 MinIO 集群配置外部 OIDC 提供方
- 使用 MinIO
AssumeRoleWithWebIdentitySecurity Token Service (STS) API 生成供应用程序使用的临时凭证
本流程是面向兼容 OIDC 提供方的通用配置流程。 有关认证与 JWT 获取的具体说明,请以你所选 OIDC 提供方的文档为准。
前提条件
兼容 OpenID-Connect (OIDC) 的 Identity Provider
本流程假定你已经拥有一个现成的 OIDC 提供方,例如 Okta、KeyCloak、Dex、Google 或 Facebook。 这些服务本身的配置不在本流程范围内。
MinIO 集群必须与 OIDC 提供方保持双向连通。
检查访问管理行为
请确保每个打算与 MinIO 配合使用的用户身份,都配置了合适的 claim,以便 MinIO 能将认证用户关联到某个 策略。 未分配任何策略的 OpenID 用户,无权访问 MinIO 集群中的任何操作或资源。
对于基于 JWT claim 的认证,MinIO 仅支持使用 OpenID Authorization Code Flow 的 OIDC 流程。
访问 MinIO 集群
本流程使用 mc 对 MinIO 集群执行操作。 请在一台能够访问该集群网络的机器上安装 mc。 关于如何下载和安装 mc,请参见 mc 安装快速开始。 本流程假定已为 MinIO 集群配置 alias。
为 MinIO 配置 OpenID 外部身份管理
-
创建新的 OpenID 配置
使用
mc idp openid add命令为 MinIO 集群创建新的 OIDC 配置。 以下示例命令假定你使用 OIDC 提供方返回的 JWT claims,来实现 基于策略分配的授权。你也可以配置基于
RoleArn的功能,让所有认证用户都使用由role_policy设置指定的单一策略。 例如,将role_policy="readOnly"设置为所有认证用户分配内置只读策略。 -
检查 MinIO Server 日志
MinIO 进程会在应用新配置时重启。 请检查日志,确认 OIDC 配置已成功持久化。
如果你为一个或多个配置设置了
role_policy,输出中会包含一个可供 STS API 使用的 ARN。 -
使用 OIDC 凭证生成兼容 S3 的临时凭证
MinIO 要求客户端使用 AWS Signature Version 4 protocol 进行认证,同时保留对已弃用 Signature Version 2 协议的支持。 具体来说,客户端必须提供有效的 access key 和 secret key,才能访问任何 S3 或 MinIO 管理 API,例如
PUT、GET和DELETE操作。应用程序可以按需使用 AssumeRoleWithWebIdentity Security Token Service (STS) API 端点,以及 OIDC 提供方返回的 JSON Web Token (JWT),生成临时访问凭证。
应用程序必须提供一个工作流,用于登录 OIDC 提供方,并获取与该认证会话关联的 JSON Web Token (JWT)。 关于认证成功后如何获取和解析 JWT token,请以提供方文档为准。MinIO 提供了一个示例 Go 应用 web-identity.go,展示了如何管理这一工作流。
应用程序获取到 JWT token 后,使用
AssumeRoleWithWebIdentity端点生成临时凭证:-
将
TOKEN替换为上一步返回的 JWT token。 -
将
DurationSeconds替换为临时凭证过期前的秒数。上例指定了86400秒,即 24 小时。 -
将
Policy替换为内联、经过 URL 编码的 JSON 策略,用于进一步收紧临时凭证对应权限。如果省略,则使用该 OpenID 用户 policy claim 中关联的策略。
你也可以加入
RoleArn参数(可选),并填写目标单策略 OIDC 配置对应的 ARN 字符串。API 响应是一个 XML 文档,其中包含 access key、secret key、session token 和过期时间。 应用程序可以使用 access key 和 secret key 来访问并操作 MinIO。
参考文档请参见 AssumeRoleWithWebIdentity。
-