8.2. 为直接身份验证配置外部 OIDC 身份提供程序


您可以将 OpenShift Container Platform 配置为直接使用外部 OIDC 身份提供程序来发布令牌以进行身份验证。

重要

使用 OIDC 身份提供程序直接验证只是一个技术预览功能。技术预览功能不受红帽产品服务等级协议(SLA)支持,且功能可能并不完整。红帽不推荐在生产环境中使用它们。这些技术预览功能可以使用户提早试用新的功能,并有机会在开发阶段提供反馈意见。

有关红帽技术预览功能支持范围的更多信息,请参阅技术预览功能支持范围

先决条件

  • 您已启用了 TechPreviewNoUpgrade 功能集。
  • 您已配置了外部身份验证供应商。

    此流程使用 Keycloak 作为身份提供程序,并假设您配置了以下客户端:

    • 名为 console-test 的 Web 控制台的机密客户端,有效的重定向 URI 设置为 https://<openshift_console_route>/auth/callback
    • OpenShift CLI (oc)的公共客户端,名为 oc-cli-test,有效重定向 URI 设置为 http://localhost:8080
  • 您可以访问安装程序为集群生成的 kubeconfig 文件。
  • 您已备份了任何现有的身份验证配置,以防您需要使用内置的 OAuth 服务器进行身份验证。

流程

  1. 确保您使用安装程序生成的 kubeconfig 文件,或者另一个长期以集群管理员身份登录的方法。
  2. 运行以下命令,创建允许您通过 Web 控制台进行身份验证的 secret:

    $ oc create secret generic console-secret \
        --from-literal=clientSecret=<secret_value> \
    1
    
        -n openshift-config
    Copy to Clipboard Toggle word wrap
    1
    <secret_value> 替换为身份提供程序中 console-test 客户端的 secret 值。
  3. 可选:通过运行以下命令,创建包含供应商的证书颁发机构捆绑包的配置映射:

    $ oc create configmap keycloak-oidc-ca --from-file=ca-bundle.crt=my-directory/ca-bundle.crt \
    1
    
        -n openshift-config
    Copy to Clipboard Toggle word wrap
    1
    指定供应商的 ca-bundle.crt 文件的路径。
  4. 运行以下命令来编辑身份验证配置:

    $ oc edit authentication.config/cluster
    Copy to Clipboard Toggle word wrap
  5. 通过将 type 字段设置为 OIDC,为供应商配置 oidcProviders 字段,并将 webhookTokenAuthenticator 字段设置为 null 来更新身份验证配置:

    apiVersion: config.openshift.io/v1
    kind: Authentication
    metadata:
    # ...
    spec:
      oidcProviders: 
    1
    
      - claimMappings:
          groups:
            claim: groups 
    2
    
            prefix: 'oidc-groups-test:'
          username:
            claim: email 
    3
    
            prefixPolicy: Prefix
            prefix:
              prefixString: 'oidc-user-test:'
        issuer:
          audiences: 
    4
    
          - console-test
          - oc-cli-test
          issuerCertificateAuthority:
            name: keycloak-oidc-ca 
    5
    
          issuerURL: https://keycloak-keycloak.apps.example.com/realms/master 
    6
    
        name: 'keycloak-oidc-server' 
    7
    
        oidcClients:
        - clientID: oc-cli-test 
    8
    
          componentName: cli
          componentNamespace: openshift-console
        - clientID: console-test 
    9
    
          clientSecret:
            name: console-secret 
    10
    
          componentName: console
          componentNamespace: openshift-console
      type: OIDC 
    11
    
      webhookTokenAuthenticator: null 
    12
    Copy to Clipboard Toggle word wrap
    1
    OIDC 供应商配置。目前,只允许一个 OIDC 供应商配置。
    2
    为集群身份构建组名称的声明名称。
    3
    为集群身份构建用户名的声明名称。
    4
    此身份验证提供程序发布令牌的受众列表。
    5
    包含 ca-bundle.crt 键的配置映射名称。如果未设置,则使用系统信任。
    6
    令牌签发者的 URL。
    7
    外部 OIDC 供应商的名称。
    8
    供应商用于 OpenShift CLI (oc)的客户端 ID。
    9
    您的供应商用于 OpenShift Container Platform Web 控制台的客户端 ID。
    10
    存储控制台客户端的 secret 值的 secret 名称。
    11
    必须设置为 OIDC 以指示使用外部 OIDC 身份提供程序。
    12
    type 设为 OIDC 时,必须设置为 null

    有关所有可用参数的详情,请参阅"OIDC 供应商配置参数"。

  6. 退出并保存更改以应用新配置。
  7. 等待集群向所有节点推出新修订版本。

    1. 运行以下命令,检查 Kubernetes API 服务器 Operator 状态:

      $ oc get co kube-apiserver
      Copy to Clipboard Toggle word wrap

      输出示例

      NAME             VERSION   AVAILABLE   PROGRESSING   DEGRADED   SINCE   MESSAGE
      kube-apiserver   4.19.0    True        True          False      85m     NodeInstallerProgressing: 2 node are at revision 8; 1 node is at revision 10
      Copy to Clipboard Toggle word wrap

      上例中的消息显示一个节点已进入新修订版本,两个节点还没有更新。根据集群大小,可能需要 20 分钟或更长时间向所有节点推出新修订版本。

    2. 要排除任何问题,您还可以检查 Cluster Authentication Operator 和 kube-apiserver pod 日志中的错误。

验证

  1. 通过与您的身份提供程序进行身份验证,验证您可以登录到 OpenShift CLI (oc):

    1. 运行以下命令登录:

      $ oc login --exec-plugin=oc-oidc \
      1
      
          --issuer-url=https://keycloak-keycloak.apps.example.com/realms/master \
      2
      
          --client-id=oc-cli-test \
      3
      
          --extra-scopes=email --callback-port=8080 \
          --oidc-certificate-authority my-directory/ca-bundle.crt 
      4
      Copy to Clipboard Toggle word wrap
      1
      指定 oc-oidc 作为 exec 插件类型。只允许 oc-oidc 值。
      2
      指定身份提供程序的签发者 URL。
      3
      指定 OpenShift CLI 的客户端 ID (oc)。
      4
      指定本地机器中的 ca-bundle.crt 文件的路径。

      输出示例

      Please visit the following URL in your browser: http://localhost:8080
      Copy to Clipboard Toggle word wrap

    2. 在浏览器中打开 http://localhost:8080
    3. 使用身份提供程序中的凭证进行身份验证。

      身份验证成功后,您应该在终端中看到类似以下输出的消息:

      Logged into "https://api.my-cluster.example.com:6443" as "oidc-user-test:user1@example.com" from an external oidc issuer.
      Copy to Clipboard Toggle word wrap
  2. 通过与身份提供程序进行身份验证来验证您可以登录到 OpenShift Container Platform Web 控制台:

    1. 在浏览器中打开集群的 Web 控制台 URL。

      您将被重定向到您的身份提供程序以登录。

    2. 使用身份提供程序中的凭证进行身份验证。

      验证您是否成功登录,并重定向到 OpenShift Container Platform Web 控制台。

8.2.1. OIDC 供应商配置参数

下表列出了用于直接身份验证的所有可用 OIDC 供应商参数:

Expand
表 8.1. oidcProviders 配置
参数描述

claimMappings

配置 Kubernetes API 服务器将身份提供程序发布的 JWT 令牌中分离声明的规则到集群身份。

claimMappings.groups

配置身份提供程序发布的 JWT 令牌中的声明应如何构建集群身份组。引用声明时,如果 JWT 令牌中存在声明,则其值必须是以逗号分隔的组列表。

claimMappings.groups.claim

配置 JWT 令牌声明,其值分配给与此映射关联的 cluster identity 字段。

claimMappings.groups.prefix

配置在将 JWT 声明映射到集群身份属性的过程中应用于集群身份属性的前缀。

claimMappings.username

配置身份提供程序发布的 JWT 令牌中的声明应如何构建集群身份的用户名。

claimMappings.username.claim

配置 JWT 令牌声明,其值分配给与此映射关联的 cluster identity 字段。

claimMappings.username.prefix

配置应添加到 JWT 声明值的前缀。当 prefixPolicy 设置为 Prefix 时,必须设置此项,否则必须取消设置。

claimMappings.username.prefix.prefixString

配置在将 JWT 声明映射到集群身份属性期间应用到集群身份用户名属性的前缀。不能是空字符串 ("")。

claimMappings.username.prefixPolicy

配置如何将前缀应用到在 claim 字段中指定的 JWT 声明的值。允许的值是 PrefixNoPrefix 和 omitted (未提供或空字符串)。

当设置为 Prefix 时,prefix 字段中指定的值将添加到 JWT 声明的值的前面。当 prefixPolicyPrefix 时,prefix 字段必须设置。

当设置为 NoPrefix 时,不会将前缀添加到 JWT 声明的值前面。

如果省略,则表示没有意见,平台将选择任何要应用的前缀,它可能会随着时间有所变化。

目前,当声明不是 email 时,平台会在 JWT 声明的值前添加 {issuerURL}#

claimValidationRules

配置 Kubernetes API 服务器使用的规则来验证身份提供程序发布的 JWT 令牌中的声明。验证规则通过 AND 操作加入。

claimValidationRules.requiredClaim

配置 Kubernetes API 服务器用来验证传入的 JWT 是否有效时所需的声明和值。

claimValidationRules.requiredClaim.claim

配置所需声明的名称。从 JWT 声明获取时,声明必须是字符串值。不能是空字符串 ("")。

claimValidationRules.requiredClaim.requiredValue

配置在从传入 JWT 声明中获取时,claim 必须具有的值。如果 JWT 声明中的值不匹配,则令牌将被拒绝用于身份验证。不能是空字符串 ("")。

claimValidationRules.type

配置验证规则的类型。允许的值是 RequiredClaim 和省略(未提供或空字符串)。

当设置为 RequiredClaim 时,Kubernetes API 服务器配置为验证传入的 JWT 包含所需的声明,并且其值与所需的值匹配。默认值为 RequiredClaim

issuer

一个必填字段,用于配置平台如何与身份提供程序进行交互,以及 Kubernetes API 服务器如何评估从身份提供程序发布的令牌。

issuer.audiences

一个必填字段,用于配置由身份提供程序发布的 JWT 令牌必需分发到的可接受的受众。至少一个条目必须与 JWT 令牌中的 aud 声明匹配。必须至少包含一个条目,且不得超过 10 个条目。

issuer.issuerCertificateAuthority

配置 Kubernetes API 服务器使用的证书颁发机构,以在获取发现信息时验证与身份提供程序的连接。如果没有指定,则使用系统信任。如果指定,它必须引用 openshift-config 命名空间中包含以 PEM 编码的 CA 证书的配置映射,该证书是配置映射的 data 字段中 ca-bundle.crt 键。

issuer.issuerCertificateAuthority.name

引用的配置映射的名称。

issuer.issuerURL

配置用于由身份提供程序发布令牌的 URL。Kubernetes API 服务器通过与 JWT 中的 iss 声明与配置的身份提供程序的 issuerURL 匹配来确定应如何处理身份验证令牌。此字段是必需的,必须使用 https:// 方案。

name

配置与身份提供程序关联的唯一人类可读标识符的必填字段。它用于区分多个身份提供程序,且不会影响令牌验证或身份验证机制。不能是空字符串 ("")。

oidcClients

配置集群、平台客户端应如何从身份提供程序请求令牌。不能超过 20 个条目,且条目必须具有唯一的命名空间/名称对。

oidcClients.clientID

从身份提供程序配置客户端标识符,平台组件用于向身份提供程序发出的身份验证请求。身份提供程序必须接受此标识符,以便平台组件能够使用身份提供程序作为身份验证模式。不能是空字符串 ("")。

oidcClients.clientSecret

配置平台组件在向身份提供程序发出身份验证请求时使用的客户端 secret。

如果没有指定,则不会在向身份提供程序发出身份验证请求时使用客户端 secret。

指定后,它会在 openshift-config 命名空间中引用一个 secret,该 secret 在 .data 字段的 clientSecret 键中包含客户端 secret。在向身份提供程序发出身份验证请求时使用的客户端 secret。

公共客户端不需要客户端 secret,但私有客户端需要客户端 secret 与身份提供程序一起使用。

oidcClients.clientSecret.name

所引用的 secret 的名称。

oidcClients.componentName

指定配置为使用身份提供程序作为身份验证模式的平台组件的名称。它与 componentNamespace 结合使用,作为唯一标识符。不能是一个空字符串 (""),且长度不得超过 256 个字符。

oidcClients.componentNamespace

指定将平台组件配置为使用身份提供程序作为身份验证模式运行的命名空间。它与 componentName 结合使用作为唯一标识符。不能是一个空字符串 (""),且长度不得超过 63 个字符。

oidcClients.extraScopes

配置在向身份提供程序发出身份验证请求时平台组件请求的额外范围。如果您配置了需要特定范围的声明映射,在标准 OIDC 范围之外请求特定范围的声明映射,这很有用。如果省略,则不会请求其他范围。

返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2025 Red Hat