×

OpenShift容器平台OAuth服务器

OpenShift容器平台主控节点包含一个内置的OAuth服务器。用户获取OAuth访问令牌以向API进行身份验证。

当用户请求新的OAuth令牌时,OAuth服务器使用已配置的身份提供程序来确定发出请求的用户身份。

然后,它确定该身份映射到的用户,为该用户创建访问令牌,并返回该令牌以供使用。

OAuth令牌请求流程和响应

OAuth服务器支持标准的授权码授权隐式授权OAuth授权流程。

当使用隐式授权流程 (response_type=token) 请求 OAuth 令牌,且客户端 ID 配置为请求 WWW-Authenticate challenges(例如 openshift-challenging-client)时,以下是 /oauth/authorize 可能的服务器响应及其处理方法。

状态 内容 客户端响应

302

Location 头部包含 URL 片段中的 access_token 参数 (RFC 6749 第 4.2.2 节)

使用 access_token 值作为 OAuth 令牌。

302

Location 头部包含 error 查询参数 (RFC 6749 第 4.1.2.1 节)

失败,可以选择向用户显示 error(以及可选的 error_description)查询值。

302

其他 Location 头部

遵循重定向,并使用这些规则处理结果。

401

存在 WWW-Authenticate 头部

如果类型被识别(例如 BasicNegotiate 等),则响应挑战,重新提交请求,并使用这些规则处理结果。

401

缺少 WWW-Authenticate 头部

无法进行挑战身份验证。失败并显示响应正文(其中可能包含获取 OAuth 令牌的替代方法的链接或详细信息)。

其他

其他

失败,可以选择向用户显示响应正文。

内部 OAuth 服务器选项

内部 OAuth 服务器提供多个配置选项。

OAuth 令牌持续时间选项

内部 OAuth 服务器生成两种令牌

令牌 描述

访问令牌

生命周期较长的令牌,用于授予对 API 的访问权限。

授权码

生命周期较短的令牌,其唯一用途是交换访问令牌。

您可以配置这两种令牌的默认持续时间。如有必要,您可以使用 OAuthClient 对象定义来覆盖访问令牌的持续时间。

OAuth 授权选项

当 OAuth 服务器接收到对用户先前未授予权限的客户端的令牌请求时,OAuth 服务器采取的操作取决于 OAuth 客户端的授权策略。

请求令牌的 OAuth 客户端必须提供其自身的授权策略。

您可以应用以下默认方法

授权选项 描述

auto

自动批准授权并重试请求。

prompt

提示用户批准或拒绝授权。

配置内部 OAuth 服务器的令牌持续时间

您可以配置内部 OAuth 服务器令牌持续时间的默认选项。

默认情况下,令牌仅有效 24 小时。在此时间过后,现有会话将过期。

如果默认时间不足,则可以使用以下步骤进行修改。

步骤
  1. 创建一个包含令牌持续时间选项的配置文件。以下文件将其设置为 48 小时,是默认时间的两倍。

    apiVersion: config.openshift.io/v1
    kind: OAuth
    metadata:
      name: cluster
    spec:
      tokenConfig:
        accessTokenMaxAgeSeconds: 172800 (1)
    1 设置 accessTokenMaxAgeSeconds 来控制访问令牌的生命周期。默认生命周期为 24 小时,或 86400 秒。此属性不能为负数。如果设置为零,则使用默认生命周期。
  2. 应用新的配置文件

    由于您更新了现有的 OAuth 服务器,因此必须使用 oc apply 命令来应用更改。

    $ oc apply -f </path/to/file.yaml>
  3. 确认更改已生效

    $ oc describe oauth.config.openshift.io/cluster
    示例输出
    ...
    Spec:
      Token Config:
        Access Token Max Age Seconds:  172800
    ...

配置内部 OAuth 服务器的令牌空闲超时

您可以配置 OAuth 令牌在设定的空闲时间后过期。默认情况下,未设置令牌空闲超时。

如果在您的 OAuth 客户端中也配置了令牌空闲超时,则该值将覆盖在内部 OAuth 服务器配置中设置的超时。

先决条件
  • 您可以作为具有 cluster-admin 角色的用户访问集群。

  • 您已配置身份提供商 (IDP)。

步骤
  1. 更新 OAuth 配置以设置令牌空闲超时。

    1. 编辑 OAuth 对象

      $ oc edit oauth cluster

      添加 spec.tokenConfig.accessTokenInactivityTimeout 字段并设置您的超时值

      apiVersion: config.openshift.io/v1
      kind: OAuth
      metadata:
      ...
      spec:
        tokenConfig:
          accessTokenInactivityTimeout: 400s (1)
      1 设置具有适当单位的值,例如 400s 表示 400 秒,或 30m 表示 30 分钟。允许的最小超时值为 300s
    2. 保存文件以应用更改。

  2. 检查 OAuth 服务器 Pod 是否已重启

    $ oc get clusteroperators authentication

    PROGRESSING 显示为 False 之前,请不要继续执行下一步,如下面的输出所示

    示例输出
    NAME             VERSION   AVAILABLE   PROGRESSING   DEGRADED   SINCE
    authentication   4.17.0    True        False         False      145m
  3. 检查 Kubernetes API 服务器 Pod 的新版本是否已推出。这将需要几分钟时间。

    $ oc get clusteroperators kube-apiserver

    PROGRESSING 显示为 False 之前,请不要继续执行下一步,如下面的输出所示

    示例输出
    NAME             VERSION   AVAILABLE   PROGRESSING   DEGRADED   SINCE
    kube-apiserver   4.17.0     True        False         False      145m

    如果 PROGRESSING 显示 True,请等待几分钟然后重试。

验证
  1. 使用您的 IDP 中的身份登录到集群。

  2. 执行命令并验证其是否成功。

  3. 在不使用身份的情况下等待超过配置的超时时间。在此步骤的示例中,等待超过 400 秒。

  4. 尝试从同一身份的会话执行命令。

    此命令应失败,因为令牌应已因空闲时间超过配置的超时时间而过期。

    示例输出
    error: You must be logged in to the server (Unauthorized)

自定义内部 OAuth 服务器 URL

您可以通过在集群 Ingress 配置的 spec.componentRoutes 字段中设置自定义主机名和 TLS 证书来自定义内部 OAuth 服务器 URL。

如果您更新了内部 OAuth 服务器 URL,则可能会破坏集群中需要与 OpenShift OAuth 服务器通信以检索 OAuth 访问令牌的组件的信任。需要信任 OAuth 服务器的组件在调用 OAuth 端点时需要包含正确的 CA 捆绑包。例如

$ oc login -u <username> -p <password> --certificate-authority=<path_to_ca.crt> (1)
1 对于自签名证书,ca.crt 文件必须包含自定义 CA 证书,否则登录将失败。

集群身份验证操作符在 openshift-config-managed 命名空间中的 oauth-serving-cert 配置映射中发布 OAuth 服务器的服务证书。您可以在配置映射的 data.ca-bundle.crt 密钥中找到证书。

先决条件
  • 您已以具有管理权限的用户身份登录到集群。

  • 您已在 openshift-config 命名空间中创建了一个包含 TLS 证书和密钥的密钥。如果自定义主机名后缀的域名与集群域名后缀不匹配,则需要此密钥。如果后缀匹配,则此密钥是可选的。

    您可以使用 oc create secret tls 命令创建 TLS 密钥。

步骤
  1. 编辑集群 Ingress 配置

    $ oc edit ingress.config.openshift.io cluster
  2. 设置自定义主机名以及可选的服务证书和密钥

    apiVersion: config.openshift.io/v1
    kind: Ingress
    metadata:
      name: cluster
    spec:
      componentRoutes:
        - name: oauth-openshift
          namespace: openshift-authentication
          hostname: <custom_hostname> (1)
          servingCertKeyPairSecret:
            name: <secret_name> (2)
    1 自定义主机名。
    2 引用openshift-config命名空间中的一个密钥,其中包含TLS证书 (tls.crt) 和密钥 (tls.key)。如果自定义主机名后缀与集群域名后缀不匹配,则需要此密钥。如果后缀匹配,则此密钥为可选。
  3. 保存文件以应用更改。

OAuth服务器元数据

在OpenShift Container Platform中运行的应用程序可能需要发现有关内置OAuth服务器的信息。例如,它们可能需要在无需手动配置的情况下发现<namespace_route>的地址。为此,OpenShift Container Platform实现了IETF OAuth 2.0授权服务器元数据草案规范。

因此,在集群内运行的任何应用程序都可以向https://openshift.default.svc/.well-known/oauth-authorization-server发出GET请求以获取以下信息:

{
  "issuer": "https://<namespace_route>", (1)
  "authorization_endpoint": "https://<namespace_route>/oauth/authorize", (2)
  "token_endpoint": "https://<namespace_route>/oauth/token", (3)
  "scopes_supported": [ (4)
    "user:full",
    "user:info",
    "user:check-access",
    "user:list-scoped-projects",
    "user:list-projects"
  ],
  "response_types_supported": [ (5)
    "code",
    "token"
  ],
  "grant_types_supported": [ (6)
    "authorization_code",
    "implicit"
  ],
  "code_challenge_methods_supported": [ (7)
    "plain",
    "S256"
  ]
}
1 授权服务器的发行者标识符,这是一个使用https方案且没有查询或片段组件的URL。这是发布包含有关授权服务器信息的.well-known RFC 5785资源的位置。
2 授权服务器的授权端点的URL。参见 RFC 6749
3 授权服务器的令牌端点的URL。参见 RFC 6749
4 包含此授权服务器支持的OAuth 2.0 RFC 6749范围值的列表的JSON数组。请注意,并非所有受支持的范围值都会被公布。
5 包含此授权服务器支持的OAuth 2.0 response_type值的列表的JSON数组。使用的数组值与RFC 7591中“OAuth 2.0动态客户端注册协议”中定义的response_types参数中使用的值相同。
6 包含此授权服务器支持的OAuth 2.0授权类型值的列表的JSON数组。使用的数组值与RFC 7591OAuth 2.0动态客户端注册协议中定义的grant_types参数中使用的值相同。
7 包含此授权服务器支持的PKCE RFC 7636代码挑战方法列表的JSON数组。代码挑战方法值用于RFC 7636的4.3节中定义的code_challenge_method参数。有效的代码挑战方法值是在IANA PKCE Code Challenge Methods注册表中注册的值。参见 IANA OAuth参数

OAuth API事件故障排除

在某些情况下,API服务器返回难以调试的意外情况错误消息,而无需直接访问API主日志。出于避免向未经身份验证的用户提供有关服务器状态的信息的目的,故意模糊了错误的根本原因。

这些错误的子集与服务帐户OAuth配置问题有关。这些问题记录在非管理员用户可以查看的事件中。在OAuth期间遇到意外情况服务器错误时,运行oc get events以在ServiceAccount下查看这些事件。

以下示例警告缺少正确的OAuth重定向URI的服务帐户。

$ oc get events | grep ServiceAccount
示例输出
1m         1m          1         proxy                    ServiceAccount                                  Warning   NoSAOAuthRedirectURIs   service-account-oauth-client-getter   system:serviceaccount:myproject:proxy has no redirectURIs; set serviceaccounts.openshift.io/oauth-redirecturi.<some-value>=<redirect> or create a dynamic URI using serviceaccounts.openshift.io/oauth-redirectreference.<some-value>=<reference>

运行oc describe sa/<service_account_name>报告与给定服务帐户名称关联的任何OAuth事件。

$ oc describe sa/proxy | grep -A5 Events
示例输出
Events:
  FirstSeen     LastSeen        Count   From                                    SubObjectPath   Type            Reason                  Message
  ---------     --------        -----   ----                                    -------------   --------        ------                  -------
  3m            3m              1       service-account-oauth-client-getter                     Warning         NoSAOAuthRedirectURIs   system:serviceaccount:myproject:proxy has no redirectURIs; set serviceaccounts.openshift.io/oauth-redirecturi.<some-value>=<redirect> or create a dynamic URI using serviceaccounts.openshift.io/oauth-redirectreference.<some-value>=<reference>

以下是可能的事件错误列表:

未指定重定向URI注释或URI无效

Reason                  Message
NoSAOAuthRedirectURIs   system:serviceaccount:myproject:proxy has no redirectURIs; set serviceaccounts.openshift.io/oauth-redirecturi.<some-value>=<redirect> or create a dynamic URI using serviceaccounts.openshift.io/oauth-redirectreference.<some-value>=<reference>

指定的路由无效

Reason                  Message
NoSAOAuthRedirectURIs   [routes.route.openshift.io "<name>" not found, system:serviceaccount:myproject:proxy has no redirectURIs; set serviceaccounts.openshift.io/oauth-redirecturi.<some-value>=<redirect> or create a dynamic URI using serviceaccounts.openshift.io/oauth-redirectreference.<some-value>=<reference>]

指定的引用类型无效

Reason                  Message
NoSAOAuthRedirectURIs   [no kind "<name>" is registered for version "v1", system:serviceaccount:myproject:proxy has no redirectURIs; set serviceaccounts.openshift.io/oauth-redirecturi.<some-value>=<redirect> or create a dynamic URI using serviceaccounts.openshift.io/oauth-redirectreference.<some-value>=<reference>]

缺少SA令牌

Reason                  Message
NoSAOAuthTokens         system:serviceaccount:myproject:proxy has no tokens