302
OpenShift容器平台主控节点包含一个内置的OAuth服务器。用户获取OAuth访问令牌以向API进行身份验证。
当用户请求新的OAuth令牌时,OAuth服务器使用已配置的身份提供程序来确定发出请求的用户身份。
然后,它确定该身份映射到的用户,为该用户创建访问令牌,并返回该令牌以供使用。
当使用隐式授权流程 (response_type=token) 请求 OAuth 令牌,且客户端 ID 配置为请求 WWW-Authenticate challenges(例如 openshift-challenging-client)时,以下是 /oauth/authorize 可能的服务器响应及其处理方法。
| 状态 | 内容 | 客户端响应 |
|---|---|---|
302 |
|
使用 |
302 |
|
失败,可以选择向用户显示 |
302 |
其他 |
遵循重定向,并使用这些规则处理结果。 |
401 |
存在 |
如果类型被识别(例如 |
401 |
缺少 |
无法进行挑战身份验证。失败并显示响应正文(其中可能包含获取 OAuth 令牌的替代方法的链接或详细信息)。 |
其他 |
其他 |
失败,可以选择向用户显示响应正文。 |
您可以配置内部 OAuth 服务器令牌持续时间的默认选项。
|
默认情况下,令牌仅有效 24 小时。在此时间过后,现有会话将过期。 |
如果默认时间不足,则可以使用以下步骤进行修改。
创建一个包含令牌持续时间选项的配置文件。以下文件将其设置为 48 小时,是默认时间的两倍。
apiVersion: config.openshift.io/v1
kind: OAuth
metadata:
name: cluster
spec:
tokenConfig:
accessTokenMaxAgeSeconds: 172800 (1)
| 1 | 设置 accessTokenMaxAgeSeconds 来控制访问令牌的生命周期。默认生命周期为 24 小时,或 86400 秒。此属性不能为负数。如果设置为零,则使用默认生命周期。 |
应用新的配置文件
|
由于您更新了现有的 OAuth 服务器,因此必须使用 |
$ oc apply -f </path/to/file.yaml>
确认更改已生效
$ oc describe oauth.config.openshift.io/cluster
...
Spec:
Token Config:
Access Token Max Age Seconds: 172800
...
您可以配置 OAuth 令牌在设定的空闲时间后过期。默认情况下,未设置令牌空闲超时。
|
如果在您的 OAuth 客户端中也配置了令牌空闲超时,则该值将覆盖在内部 OAuth 服务器配置中设置的超时。 |
您可以作为具有 cluster-admin 角色的用户访问集群。
您已配置身份提供商 (IDP)。
更新 OAuth 配置以设置令牌空闲超时。
编辑 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。 |
保存文件以应用更改。
检查 OAuth 服务器 Pod 是否已重启
$ oc get clusteroperators authentication
在 PROGRESSING 显示为 False 之前,请不要继续执行下一步,如下面的输出所示
NAME VERSION AVAILABLE PROGRESSING DEGRADED SINCE
authentication 4.17.0 True False False 145m
检查 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,请等待几分钟然后重试。
使用您的 IDP 中的身份登录到集群。
执行命令并验证其是否成功。
在不使用身份的情况下等待超过配置的超时时间。在此步骤的示例中,等待超过 400 秒。
尝试从同一身份的会话执行命令。
此命令应失败,因为令牌应已因空闲时间超过配置的超时时间而过期。
error: You must be logged in to the server (Unauthorized)
您可以通过在集群 Ingress 配置的 spec.componentRoutes 字段中设置自定义主机名和 TLS 证书来自定义内部 OAuth 服务器 URL。
|
如果您更新了内部 OAuth 服务器 URL,则可能会破坏集群中需要与 OpenShift OAuth 服务器通信以检索 OAuth 访问令牌的组件的信任。需要信任 OAuth 服务器的组件在调用 OAuth 端点时需要包含正确的 CA 捆绑包。例如
集群身份验证操作符在 |
您已以具有管理权限的用户身份登录到集群。
您已在 openshift-config 命名空间中创建了一个包含 TLS 证书和密钥的密钥。如果自定义主机名后缀的域名与集群域名后缀不匹配,则需要此密钥。如果后缀匹配,则此密钥是可选的。
|
您可以使用 |
编辑集群 Ingress 配置
$ oc edit ingress.config.openshift.io cluster
设置自定义主机名以及可选的服务证书和密钥
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)。如果自定义主机名后缀与集群域名后缀不匹配,则需要此密钥。如果后缀匹配,则此密钥为可选。 |
保存文件以应用更改。
在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 7591中OAuth 2.0动态客户端注册协议中定义的grant_types参数中使用的值相同。 |
| 7 | 包含此授权服务器支持的PKCE RFC 7636代码挑战方法列表的JSON数组。代码挑战方法值用于RFC 7636的4.3节中定义的code_challenge_method参数。有效的代码挑战方法值是在IANA PKCE Code Challenge Methods注册表中注册的值。参见 IANA OAuth参数。 |
在某些情况下,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