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