7.9. 配置 OpenID Connect 身份提供程序

配置 oidc 身份提供程序,使用授权代码流与 OpenID Connect 身份提供程序集成。

7.9.1. 关于 OpenShift Container Platform 中的身份提供程序

默认情况下,集群中只有 kubeadmin 用户。要指定身份提供程序,您必须创建一个自定义资源(CR) 来描述该身份提供程序并把它添加到集群中。

注意

OpenShift Container Platform 用户名不能包括 /:%

7.9.2. 关于 OpenID Connect 身份验证

OpenShift Container Platform 中的 Authentication Operator 要求配置的 OpenID Connect 身份提供程序实现 OpenID Connect Discovery 规格。

注意

不支持 ID TokenUserInfo 解密。

默认情况下,需要 openid 范围。如果必要,可在 extraScopes 字段中指定额外的范围。

声明可读取自从 OpenID 身份提供程序返回的 JWT id_token;若有指定,也可读取自从 UserInfo URL 返回的 JSON。

必须至少配置一个声明,以用作用户的身份。标准的身份声明是 sub

您还可以指定将哪些声明用作用户的首选用户名、显示名称和电子邮件地址。如果指定了多个声明,则使用第一个带有非空值的声明。下表列出了标准声明:

声明描述

sub

“subject identifier”的缩写。 用户在签发者处的远程身份。

preferred_username

置备用户时的首选用户名。用户希望使用的简写名称,如 janedoe。通常,与身份验证系统中用户的登录或用户名对应的值,如用户名或电子邮件。

email

电子邮件地址。

name

显示名称。

如需更多信息,请参阅 OpenID 声明文档

注意

除非您的 OpenID Connect 身份提供程序支持资源所有者密码凭证 (ROPC) 授权流,否则用户必须从 <namespace_route>/oauth/token/request 中获取令牌,才能用于命令行工具。

7.9.3. 支持的 OIDC 供应商

红帽在 OpenShift Container Platform 中测试并支持特定的 OpenID Connect (OIDC) 供应商。OpenShift Container Platform 测试并支持以下 OpenID Connect (OIDC) 供应商。在 OpenShift Container Platform 中使用没有包括在以下列表中的 OIDC 供应商可能可以正常工作,但没有经过红帽测试,因此不被红帽支持。

  • Active Directory Federation Services for Windows Server

    注意

    目前,在使用自定义声明时,不支持将 Active Directory Federation Services for Windows Server 用于 OpenShift Container Platform。

  • GitLab
  • Google
  • Keycloak
  • Microsoft 身份平台(Azure Active Directory v2.0)

    注意

    目前,当需要同步组名称时,不支持使用 Microsoft 身份平台。

  • Okta
  • Ping 身份
  • 红帽单点登录

7.9.4. 创建 secret

身份提供程序使用 openshift-config 命名空间中的 OpenShift Container Platform Secret 对象来包含客户端 secret、客户端证书和密钥。

流程

  • 使用以下命令创建一个包含字符串的 Secret 对象:

    $ oc create secret generic <secret_name> --from-literal=clientSecret=<secret> -n openshift-config
    提示

    您还可以应用以下 YAML 来创建 secret:

    apiVersion: v1
    kind: Secret
    metadata:
      name: <secret_name>
      namespace: openshift-config
    type: Opaque
    data:
      clientSecret: <base64_encoded_client_secret>
  • 您可以使用以下命令定义一个包含文件内容的 Secret 对象,如证书文件:

    $ oc create secret generic <secret_name> --from-file=<path_to_file> -n openshift-config

7.9.5. 创建配置映射

身份提供程序使用 openshift-config 命名空间中的 OpenShift Container Platform ConfigMap 对象来包含证书颁发机构捆绑包。主要用于包含身份提供程序所需的证书捆绑包。

注意

只有 GitHub Enterprise 需要此步骤。

流程

  • 使用以下命令,定义包含证书颁发机构的 OpenShift Container Platform ConfigMap。证书颁发机构必须存储在 ConfigMap 对象的 ca.crt 键中。

    $ oc create configmap ca-config-map --from-file=ca.crt=/path/to/ca -n openshift-config
    提示

    您还可以应用以下 YAML 来创建配置映射:

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: ca-config-map
      namespace: openshift-config
    data:
      ca.crt: |
        <CA_certificate_PEM>

7.9.6. OpenID Connect CR 示例

以下自定义资源 (CR) 显示 OpenID Connect 身份提供程序的参数和可接受值。

如果您必须指定自定义证书捆绑包、额外范围、额外授权请求参数或 userInfo URL,请使用完整的 OpenID Connect CR。

标准 OpenID Connect CR

apiVersion: config.openshift.io/v1
kind: OAuth
metadata:
  name: cluster
spec:
  identityProviders:
  - name: oidcidp 1
    mappingMethod: claim 2
    type: OpenID
    openID:
      clientID: ... 3
      clientSecret: 4
        name: idp-secret
      claims: 5
        preferredUsername:
        - preferred_username
        name:
        - name
        email:
        - email
        groups:
        - groups
      issuer: https://www.idp-issuer.com 6

1
此提供程序名称作为前缀放在身份声明值前,以此组成身份名称。它还可用来构建的重定向 URL。
2
控制如何在此提供程序的身份和 User 对象之间建立映射。
3
在 OpenID 提供程序中注册的客户端的客户端 ID。该客户端必须能够重定向到 https://oauth-openshift.apps.<cluster_name>.<cluster_domain>/oauth2callback/<idp_provider_name>
4
对包含客户端 secret 的 OpenShift Container Platform Secret 对象的引用。
5
用作身份的声明列表。使用第一个非空声明。
6
OpenID 规范中描述的颁发者标识符。必须使用 https,且不带查询或分段组件。

完整 OpenID Connect CR

apiVersion: config.openshift.io/v1
kind: OAuth
metadata:
  name: cluster
spec:
  identityProviders:
  - name: oidcidp
    mappingMethod: claim
    type: OpenID
    openID:
      clientID: ...
      clientSecret:
        name: idp-secret
      ca: 1
        name: ca-config-map
      extraScopes: 2
      - email
      - profile
      extraAuthorizeParameters: 3
        include_granted_scopes: "true"
      claims:
        preferredUsername: 4
        - preferred_username
        - email
        name: 5
        - nickname
        - given_name
        - name
        email: 6
        - custom_email_claim
        - email
        groups: 7
        - groups
      issuer: https://www.idp-issuer.com

1
可选:对包含 PEM 编码证书颁发机构捆绑包的 OpenShift Container Platform 配置映射的引用,以用于验证所配置 URL 的服务器证书。
2
可选:除 openid 范围外的可选请求范围列表,在授权令牌请求期间使用。
3
可选:映射到授权令牌请求中的附加参数映射。
4
为此身份置备用户时用作首选用户名的声明的列表。使用第一个非空声明。
5
用作显示名称的声明列表。使用第一个非空声明。
6
用作电子邮件地址的声明列表。使用第一个非空声明。
7
用户登录时,用于将 OpenID Connect 供应商的组与 OpenShift Container Platform 同步的声明列表。使用第一个非空声明。

其他资源

  • 如需了解所有身份提供程序通用的参数(如 mappingMethod )的信息,请参阅身份提供程序参数

7.9.7. 在集群中添加身份提供程序

安装集群之后,请在其中添加一个身份提供程序,以便您的用户可以进行身份验证。

先决条件

  • 创建 OpenShift Container Platform 集群。
  • 为身份提供程序创建自定义资源(CR)。
  • 必须已经以管理员身份登录。

流程

  1. 应用定义的 CR:

    $ oc apply -f </path/to/CR>
    注意

    如果一个 CR 不存在,oc apply 会创建一个新的 CR,并可能会触发以下警告 Warning: oc apply should be used on resources created by either oc create --save-config or oc apply。在这种情况下,您可以忽略这个警告。

  2. 从 OAuth 服务器获取令牌。

    只要 kubeadmin 用户已被删除,oc login 命令就会提供如何访问可以获得令牌的网页的说明。

    您还可以通过使用 web 控制台的 (?)访问此页面。 HelpCommand Line ToolsCopy Login Command.

  3. 登录到集群,提供令牌进行身份验证。

    $ oc login --token=<token>
    注意

    如果您的 OpenID Connect 身份提供程序支持资源所有者密码凭证(ROPC)授权流,您可以使用用户名和密码登录。您可能需要执行相应的步骤,为身份提供程序启用 ROPC 授权流。

    在 OpenShift Container Platform 中配置 OIDC 身份提供程序后,您可以使用以下命令登录,以提示您的用户名和密码:

    $ oc login -u <identity_provider_username> --server=<api_server_url_and_port>
  4. 确认用户登录成功,并显示用户名。

    $ oc whoami

7.9.8. 使用 web 控制台配置身份提供程序

通过 web 控制台而非 CLI 配置身份提供程序 (IDP)。

先决条件

  • 您必须以集群管理员身份登录到 web 控制台。

流程

  1. 导航至 AdministrationCluster Settings
  2. Configuration 选项卡下,单击 OAuth
  3. Identity Providers 部分中,从 Add 下拉菜单中选择您的身份提供程序。
注意

您可以通过 web 控制台来指定多个 IDP,而不会覆盖现有的 IDP。