OpenID Connect 访问管理
MinIO 支持使用与 OpenID Connect (OIDC) 兼容的身份提供商 (IDP),例如 Okta、KeyCloak、Dex、Google 或 Facebook,来外部管理用户身份。
对于由外部 OpenID Connect (OIDC) 兼容提供商管理的身份,MinIO 可以使用以下两种方法之一将策略分配给经过身份验证的用户。
使用作为 OIDC 身份验证流程一部分返回的JSON Web 令牌声明来识别要分配给经过身份验证用户的策略。
使用授权请求中指定的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 的 RolePolicy 配置关联的策略。
您可以使用OpenID 策略变量来创建以编程方式管理每个用户访问权限的策略。
使用带有 RolePolicy 声明流程的 OIDC 凭据的应用程序的登录流程如下所示
创建 OIDC 配置。
在创建时或 MinIO 启动时记录分配给配置的 RoleArn。将此 RoleArn 与AssumeRoleWithWebIdentity STS API 一起使用。
创建要与 RoleArn 一起使用的 RolePolicy。使用MINIO_IDENTITY_OPENID_ROLE_POLICY
环境变量或identity_openid role_policy
配置设置来定义要用于提供商的策略列表。
用户在登录 MinIO 时选择配置的 OIDC 提供商。
用户完成对配置的 OIDC 提供商的身份验证,并重定向回 MinIO。
MinIO 仅支持OpenID 授权码流程。不支持使用隐式流进行身份验证。
MinIO 会验证 API 调用中的RoleArn
,并检查要使用的角色策略。任何使用 RoleArn 的身份验证请求都将获得相同的策略访问权限。
MinIO 在 STS API 响应中以访问密钥、密钥和会话令牌的形式返回临时凭证。凭证具有与 RolePolicy 中指定的策略相匹配的权限。
应用程序使用 STS 端点返回的临时凭证对 MinIO 执行经过身份验证的 S3 操作。
使用 JSON Web 令牌允许您单独分配策略。但是,使用 Web 令牌也会增加管理多个单独声明策略的成本。
使用带有 JSON Web 令牌声明流程的 OIDC 凭证的应用程序的登录流程如下所示
向已配置的 OIDC 提供程序进行身份验证并检索JSON Web 令牌 (JWT)。
MinIO 仅支持OpenID 授权码流程。不支持使用隐式流进行身份验证。
将 JWT 指定给 MinIO 安全令牌服务 (STS) AssumeRoleWithWebIdentity API 端点。
MinIO 会针对已配置的 OIDC 提供程序验证 JWT。
如果 JWT 有效,MinIO 会检查一个声明,该声明指定一个或多个策略列表,以分配给经过身份验证的用户。MinIO 默认检查policy
声明。
MinIO 在 STS API 响应中以访问密钥、密钥和会话令牌的形式返回临时凭证。凭证具有与 JWT 声明中指定的策略相匹配的权限。
应用程序使用 STS 端点返回的临时凭证对 MinIO 执行经过身份验证的 S3 操作。
MinIO 提供了一个示例 Go 应用程序web-identity.go,它处理完整的登录流程。
OIDC 用户可以选择创建访问密钥。访问密钥是长期有效的凭证,继承其父用户的权限。父用户可以在创建访问密钥时进一步限制这些权限。要创建新的访问密钥,请使用 OIDC 管理的用户凭证登录到MinIO 控制台。在左侧导航的“身份”部分,选择“访问密钥”,然后选择“创建访问密钥 +”按钮。
识别 JWT 声明值
MinIO 使用作为 OIDC 身份验证流程的一部分返回的 JWT 令牌来识别要分配给经过身份验证用户的特定策略。
您可以使用JWT 调试工具解码返回的 JWT 令牌并验证用户属性是否包含所需的声明。
有关 JWT 声明的更多信息,请参阅RFC 7519:JWT 声明。
有关配置用户声明的说明,请参阅您首选的 OIDC 提供程序的文档。
下表包含支持的策略变量列表,用于授权OIDC 管理的用户。
每个变量对应于作为经过身份验证的用户 JWT 令牌的一部分返回的声明
变量 |
描述 |
jwt:sub
|
返回用户的sub 声明。 |
jwt:iss
|
返回 ID 令牌中的颁发者标识符声明。 |
jwt:aud
|
返回 ID 令牌中的受众声明。 |
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 将Resource
字段中的${jwt:preferred_username}
变量替换为 JWT 令牌中preferred_username
的值。然后,MinIO 会评估策略并授予或撤销对请求的 API 和资源的访问权限。