OpenID Connect 访问管理
MinIO 支持使用 OpenID Connect (OIDC) 兼容的身份提供商 (IDP)
(例如 Okta、KeyCloak、Dex、Google 或 Facebook)来外部管理用户
身份。
对于由外部 OpenID Connect (OIDC) 兼容提供商管理的身份,MinIO 可以使用以下两种方法之一为经过身份验证的用户分配策略。
使用JSON Web Token 声明作为 OIDC 认证流程的一部分返回,用于识别策略分配给已认证用户。
使用RoleArn授权请求中指定的内容,用于分配附加到提供者RolePolicy的策略。
MinIO 默认拒绝访问用户未通过分配或继承明确允许的所有操作或资源。策略由 OIDC 提供商管理的用户必须在 JWT 声明中指定必要的策略。如果用户 JWT 声明没有匹配的 MinIO 策略,该用户将无权访问 MinIO 部署上的任何操作或资源。
MinIO 查找的特定声明配置为使用 OIDC 身份管理部署集群本页重点介绍如何创建与配置的 OIDC 声明相匹配的 MinIO 策略。
MinIO 支持两种 OIDC 身份验证和授权流程:
RolePolicy 流程在 MinIO 配置中为经过身份验证的用户设置已分配的策略。
MinIO 建议使用 RolePolicy 方法与 OpenID 提供商进行身份验证。
JWT流程在OIDC配置中为已认证用户设置分配的策略。
MinIO支持多个OIDC提供商配置。
但是,您只能配置一每个部署的基于JWT声明的OIDC提供商。
所有其他提供商必须使用RolePolicy。
使用 RolePolicy,所有通过给定 RoleArn 生成 STS 凭证的客户端都会收到政策或政策集与该 RoleArn 的角色策略配置相关联。
您可以使用OpenID 策略变量创建策略,以编程方式管理每个用户可访问的内容。
使用应用程序的登录流程OIDC带有 RolePolicy 声明的凭据流程如下:
创建 OIDC 配置。
记录在创建时或MinIO启动时分配给配置的RoleArn。
将此RoleArn与AssumeRoleWithWebIdentitySTS API。
创建一个用于RoleArn的RolePolicy。
使用以下任一方式:MINIO_IDENTITY_OPENID_ROLE_POLICY环境变量或identity_openid role_policy用于定义提供程序要使用的策略列表的配置设置
用户在登录 MinIO 时选择配置的 OIDC 提供者。
用户完成对已配置的认证OIDC提供者并重定向回 MinIO。
MinIO 仅支持OpenID 授权码流程使用隐式流程进行身份验证不受支持。
MinIO 验证RoleArn在API调用中并检查RolePolicy使用。
任何带有 RoleArn 的身份验证请求都会获得相同的策略访问权限。
MinIO 在 STS API 响应中返回临时凭证,包括访问密钥、密钥和会话令牌。
这些凭证具有与 RolePolicy 中指定的策略相匹配的权限。
应用程序使用STS端点返回的临时凭证在MinIO上执行经过身份验证的S3操作。
使用JSON Web令牌可以实现策略的独立分配。
然而,使用Web令牌也会带来管理多个独立声明策略的成本增加。
使用应用程序的登录流程OIDC使用 JSON Web Token 声明流程的凭据如下:
验证到已配置的OIDC提供和检索一个JSON Web Token (JWT).
MinIO 仅支持OpenID 授权码流程使用隐式流程进行身份验证不受支持。
指定JWT到 MinIO 安全令牌服务
(STS)AssumeRoleWithWebIdentityAPI端点。
MinIO 验证JWT针对已配置的 OIDC 提供程序。
如果 JWT 有效,MinIO 会检查索赔指定一个或多个项目的列表策略分配给
已认证用户。MinIO 默认检查policy索赔。
MinIO 在 STS API 响应中返回临时凭证,包括访问密钥、密钥和会话令牌。这些凭证具有与 JWT 声明中指定策略相匹配的权限。
应用程序使用STS端点返回的临时凭证在MinIO上执行经过身份验证的S3操作。
MinIO 提供了一个 Go 应用程序示例web-identity.go处理完整的登录流程。
识别 JWT 声明值
MinIO使用OIDC身份验证流程中返回的JWT令牌来识别要分配给已认证用户的具体策略。
您可以使用一个JWT调试工具解码返回的 JWT 令牌并验证用户属性包含必需的声明。
看RFC 7519: JWT 声明有关 JWT 声明的更多信息。
请参考您首选的 OIDC 提供商的文档来配置用户声明。
以下表格包含可用于授权的受支持策略变量列表OIDC管理的用户.
每个变量对应一个声明,这些声明作为已认证用户的JWT令牌的一部分返回:
变量 |
描述 |
jwt:sub
|
返回sub为用户提出的索赔。 |
jwt:iss
|
返回 ID 令牌中的签发者标识符声明。 |
jwt:aud
|
返回 ID 令牌中的 Audience 声明。 |
jwt:jti
|
返回客户端认证信息中的 JWT ID 声明。 |
jwt:upn
|
从客户端认证信息中返回用户主体名称声明。 |
jwt:name
|
返回name为用户提出的索赔。 |
jwt:groups
|
返回groups为用户提出的索赔。 |
jwt:given_name
|
返回given_name为用户提出的索赔。 |
jwt:family_name
|
返回family_name为用户提出的索赔。 |
jwt:middle_name
|
返回middle_name为用户提出的索赔。 |
jwt:nickname
|
返回nickname为用户提出的索赔。 |
jwt:preferred_username
|
返回preferred_username为用户提出的索赔。 |
jwt:profile
|
返回profile为用户提出的索赔。 |
jwt:picture
|
返回picture为用户提出的索赔。 |
jwt:website
|
返回website为用户提出的索赔。 |
jwt:email
|
返回email为用户提出的索赔。 |
jwt:gender
|
返回gender为用户提出的索赔。 |
jwt:birthdate
|
返回birthdate为用户提出的索赔。 |
jwt:phone_number
|
返回phone_number为用户提出的索赔。 |
jwt:address
|
返回address为用户提出的索赔。 |
jwt:scope
|
返回scope为用户提出的索赔。 |
jwt:client_id
|
返回client_id为用户提出的索赔。 |
查看OpenID Connect Core 1.0有关这些范围的更多信息,请参阅文档。
您选择的 OIDC 提供商可能有更具体的文档。
例如,以下策略使用变量来替代经过身份验证的用户preferred_username作为...的一部分Resource字段,使得用户只能访问与其用户名匹配的前缀:
{
"Version": "2012-10-17",
"Statement": [
{
"Action": ["s3:ListBucket"],
"Effect": "Allow",
"Resource": ["arn:aws:s3:::mybucket"],
"Condition": {"StringLike": {"s3:prefix": ["${jwt:preferred_username}/*"]}}
},
{
"Action": [
"s3:GetObject",
"s3:PutObject"
],
"Effect": "Allow",
"Resource": ["arn:aws:s3:::mybucket/${jwt:preferred_username}/*"]
}
]
}
MinIO 取代了${jwt:preferred_username}变量在Resource值为该字段的preferred_username在 JWT 令牌中。
MinIO 随后评估策略并授予或撤销对请求的 API 和资源的访问权限。