OpenID访问和连接管理
MinIO 支持使用 OpenID Connect (OIDC) 兼容的身份提供者(IDP) 如 Okta、KeyCloak、Dex、Google 或 Facebook 来外部管理 用户身份。
对于由外部 OpenID Connect (OIDC) 兼容提供者管理的身份,MinIO 可以使用两种方法之一来为认证用户分配策略。
使用OIDC身份验证流程中返回的 JSON Web Token claim 来确定应分配给已认证用户的 策略 。
使用授权请求中指定的
RoleArn
来分配附加到提供者RolePolicy上的策略。
MinIO默认拒绝所有未通过用户分配或继承的 策略 明确允许的动作或资源访问。 由OIDC提供者管理的用户必须将必要的策略作为JWT声明的一部分进行指定。如果用户的JWT声明中没有匹配的MinIO策略,那么该用户将没有权限访问MinIO部署上的任何动作或资源。
MinIO查找的具体声明是作为 使用OIDC身份管理部署集群 的一部分进行配置的。本页面重点介绍创建与配置的OIDC声明匹配的MinIO策略。
身份验证和授权流程
MinIO 支持两种 OIDC 身份验证和授权流程:
角色策略流(RolePolicy flow)在MinIO配置中为已验证用户设置分配的策略。
MinIO建议使用RolePolicy方法与OpenID提供者进行身份验证。
JWT流程作为OIDC配置的一部分,为已验证用户设置分配的策略。
MinIO支持多个OIDC提供者配置。 然而,每个部署中只能配置 一个 基于JWT声明的OIDC提供者。 所有其他提供者必须使用RolePolicy。
角色策略和角色Arn
使用 RolePolicy,所有使用给定 RoleArn 生成 STS 凭据的客户端都将接收与该 RoleArn 的 RolePolicy 配置关联的 policy or policies 。
您可以使用:ref:OpenID策略变量 <minio-policy-variables-oidc> 来创建策略,以编程方式管理每个用户可以访问的内容。
使用 OIDC 凭证和 RolePolicy 声明流程的应用程序的登录流程如下:
创建 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
,并检查要使用的 RolePolicy 。 任何带有RoleArn的认证请求都会接收到相同的策略访问权限。MinIO在STS API响应中返回临时的凭证,包括访问密钥、秘密密钥和会话令牌。 凭证具有与RolePolicy中指定的策略相匹配的权限。
应用程序使用STS端点返回的临时凭证来对MinIO执行经过认证的S3操作。
JSON Web 令牌声明
使用JSON Web Tokens允许您对策略进行单独分配。 然而,使用web tokens也伴随着管理多个策略以分离声明的增加成本。
使用 OIDC 凭证与JSON Web Token声明的应用 程序的登录流程通常包括以下步骤:
认证到配置的 OIDC 提供者并检索 JSON Web Token (JWT) 。
MinIO仅支持 OpenID授权码流程 。 使用隐式流程进行认证是不支持的。
向MinIO安全令牌服务(STS)的 AssumeRoleWithWebIdentity API端点指定 JWT 。
MinIO会根据配置的OIDC提供程序对 JWT 进行验证。
如果JWT有效,MinIO会检查是否有指定一组或多组 策略 的 声明 来分配给认证用户。 MinIO默认检查
policy
声明。MinIO在STS API响应中返回临时的凭证,包括访问密钥(access key)、 秘密密钥(secret key)和会话令牌(session token)。 这些凭证具有与JWT声明中指定的策略相匹配的权限。
应用程序使用STS端点返回的临时凭证来 对MinIO执行认证的S3操作。
MinIO提供了一个示例Go应用程序 web-identity.go ,该应用程序处理完整的登录流程。
OIDC用户可以选择创建一个MinIO的 访问密钥 。 访问密钥是长期有效的凭证,它们继承了其父用户的权限。 父用户在创建访问密钥时可以进一步限制这些权限。 要创建新的访问密钥,请使用OIDC管理用户凭证登录到 MinIO控制台。 从左侧导航栏的 身份 部分,选择 访问秘钥,然后点击 创建访问密钥 + 按钮。
识别 JWT 声明价值
MinIO 使用 OIDC 认证流程中返回的 JWT 令牌来确定要分配给认证用户的特定策略。
您可以使用 JWT 调试工具 来解码返回的 JWT 令牌,并验证用户属性是否包括所需的声明。
有关 JWT 声明的更多信息,请参阅 RFC 7519: JWT 声明 。
有关配置用户声明的指令,请参考您首选的 OIDC 提供商的文档。
创建与声明匹配的策略
您可以使用 MinIO 控制台 或者 mc admin policy
命令来创建与一个或多个声明值匹配的策略。
OIDC 策略变量
下表包含了一份用于授权 OIDC管理的用户 的支持策略变量列表。
每个变量都对应于认证用户JWT令牌中返回的一部分声明:
Variable |
描述 |
---|---|
|
返回用户的 |
|
从 ID 令牌返回颁发者标识符声明。 |
|
从ID令牌中返回Audience声明。 |
|
从客户端认证信息中返回JWT 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 和资源的访问权限。