文档

OpenID Connect 访问管理

MinIO 支持使用与 OpenID Connect (OIDC) 兼容的身份提供者 (IDP),例如 Okta、KeyCloak、Dex、Google 或 Facebook,用于外部管理用户身份。

对于由外部 OpenID Connect (OIDC) 兼容提供商管理的身份,MinIO 可以使用两种方法之一将策略分配给经过身份验证的用户。

  1. 使用 JSON Web 令牌声明 作为 OIDC 身份验证流程的一部分返回,以识别要分配给经过身份验证用户的 策略

  2. 使用 RoleArn 在授权请求中指定,将附加到提供商 RolePolicy 的策略分配给经过身份验证的用户。

默认情况下,MinIO 拒绝对用户未明确允许执行的所有操作或资源的访问 策略。由 OIDC 提供商管理的用户必须在 JWT 声明中指定必要的策略。如果用户 JWT 声明没有与 MinIO 策略匹配,则该用户无权访问 MinIO 部署上的任何操作或资源。

MinIO 要查找的特定声明是在 使用 OIDC 身份管理部署集群 的一部分配置的。此页面重点介绍如何创建与已配置的 OIDC 声明匹配的 MinIO 策略。

身份验证和授权流程

MinIO 支持两种 OIDC 身份验证和授权流程

  1. RolePolicy 流程在 MinIO 配置中设置经过身份验证用户的分配策略。

    MinIO 建议使用 RolePolicy 方法进行 OpenID 提供商的身份验证。

  2. JWT 流程将经过身份验证用户的分配策略设置为 OIDC 配置的一部分。

MinIO 支持多个 OIDC 提供商配置。但是,每个部署只能配置 **一个** 基于 JWT 声明的 OIDC 提供商。所有其他提供商必须使用 RolePolicy。

RolePolicy 和 RoleArn

使用 RolePolicy,所有使用给定 RoleArn 生成 STS 凭据的客户端都会收到 策略 与该 RoleArn 的 RolePolicy 配置相关联。

您可以使用 OpenID 策略变量 创建策略,以编程方式管理每个用户的访问权限。

使用 OIDC 凭据和 RolePolicy 声明流登录应用程序的流程如下

  1. 创建 OIDC 配置。

  2. 记录分配给配置的 RoleArn,无论是在创建时还是在 MinIO 启动时。将此 RoleArn 与 AssumeRoleWithWebIdentity STS API。

  3. 创建要与 RoleArn 一起使用的 RolePolicy。使用 MINIO_IDENTITY_OPENID_ROLE_POLICY 环境变量或 identity_openid role_policy 配置设置来定义要用于提供商的策略列表

  4. 用户在登录 MinIO 时选择已配置的 OIDC 提供商。

  5. 用户完成对已配置的 OIDC 提供商的身份验证,并重定向回 MinIO。

    MinIO 仅支持 OpenID 授权码流。不支持使用隐式流的身份验证。

  6. MinIO 会验证 API 调用中的 RoleArn,并检查要使用的 RolePolicy。任何使用 RoleArn 的身份验证请求都会获得相同的策略访问权限。

  7. MinIO 会在 STS API 响应中以访问密钥、密钥和会话令牌的形式返回临时凭据。凭据的权限与 RolePolicy 中指定的策略相匹配。

  8. 应用程序使用 STS 端点返回的临时凭据来对 MinIO 执行经过身份验证的 S3 操作。

JSON Web 令牌声明

使用 JSON Web 令牌可以对策略进行单独分配。但是,使用 Web 令牌还会增加为单独的声明管理多个策略的成本。

使用 OIDC 凭据和 JSON Web 令牌声明流程的应用程序的登录流程如下。

  1. 对已配置的 OIDC 提供程序进行身份验证并检索 JSON Web 令牌 (JWT)

    MinIO 仅支持 OpenID 授权码流。不支持使用隐式流的身份验证。

  2. JWT 指定给 MinIO 安全令牌服务 (STS) AssumeRoleWithWebIdentity API 端点。

    MinIO 会针对已配置的 OIDC 提供程序验证 JWT

    如果 JWT 有效,MinIO 会检查用于指定一个或多个 声明策略列表,以分配给经过身份验证的用户。MinIO 默认检查 policy 声明。

  3. MinIO 会在 STS API 响应中以访问密钥、密钥和会话令牌的形式返回临时凭据。凭据的权限与 JWT 声明中指定的策略相匹配。

  4. 应用程序使用 STS 端点返回的临时凭据来对 MinIO 执行经过身份验证的 S3 操作。

MinIO 提供一个示例 Go 应用程序 web-identity.go,该应用程序处理完整的登录流程。

OIDC 用户可以选择创建 访问密钥。访问密钥是长期有效的凭据,它们从父用户那里继承其权限。父用户在创建访问密钥时可以进一步限制这些权限。要创建新的访问密钥,请使用 OIDC 管理的用户凭据登录到 MinIO 控制台。从左侧导航的“身份”部分,选择“访问密钥”,然后选择“创建访问密钥 +”按钮。

标识 JWT 声明值

MinIO 使用作为 OIDC 身份验证流程的一部分返回的 JWT 令牌来标识要分配给经过身份验证用户的特定策略。

可以使用 JWT 调试工具 对返回的 JWT 令牌进行解码,并验证用户属性是否包含必需的声明。

有关 JWT 声明的更多信息,请参见 RFC 7519:JWT 声明

请参阅您首选的 OIDC 提供程序的文档,了解有关配置用户声明的说明。

创建与声明匹配的策略

使用 MinIO 控制台或 mc admin policy 命令来创建与一个或多个声明值匹配的策略。

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 提供程序可能提供更详细的文档。

例如,以下策略使用变量在 Resource 字段中替换经过身份验证用户的 preferred_username,这样用户只能访问与其用户名匹配的前缀。

{
"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 和资源的访问权限。