2.3. API 身份验证
对 OpenShift Container Platform API 的请求通过以下方式进行身份验证:
- OAuth 访问令牌
-
使用
<namespace_route>/oauth/authorize
和<namespace_route>/oauth/token
端点,从 OpenShift Container Platform OAuth 服务器获取。 -
作为
Authorization: Bearer…
标头形式发送。 -
以
base64url.bearer.authorization.k8s.io.<base64url-encoded-token>
形式,作为 websocket 请求的 websocket 子协议标头发送。
-
使用
- X.509 客户端证书
- 需要与 API 服务器的 HTTPS 连接。
- 由 API 服务器针对可信证书颁发机构捆绑包进行验证。
- API 服务器创建证书并分发到控制器,以对自身进行身份验证。
任何具有无效访问令牌或无效证书的请求都会被身份验证层以 401
错误形式拒绝。
如果没有出示访问令牌或证书,身份验证层会将 system:anonymous
虚拟用户和 system:unauthenticated
虚拟组分配给请求。这使得授权层能够决定匿名用户可以发出哪些(如有)请求。
2.3.1. OpenShift Container Platform OAuth 服务器
OpenShift Container Platform master 包含内置的 OAuth 服务器。用户获取 OAuth 访问令牌来对自身进行 API 身份验证。
有人请求新的 OAuth 令牌时,OAuth 服务器使用配置的身份提供程序来确定提出请求的人的身份。
然后,它会确定该身份所映射到的用户,为该用户创建一个访问令牌,再返回要使用的令牌。
2.3.1.1. OAuth 令牌请求
每个对 OAuth 令牌的请求都必须指定要接收和使用令牌的 OAuth 客户端。启动 OpenShift Container Platform API 时会自动创建以下 OAuth 客户端:
OAuth 客户端 | 使用方法 |
---|---|
|
使用可处理交互式登录的用户代理,在 |
|
使用可处理 |
<namespace_route>
是指命名空间路由。运行以下命令可以找到:$ oc get route oauth-openshift -n openshift-authentication -o json | jq .spec.host
所有对 OAuth 令牌的请求都包括对 <namespace_route>/oauth/authorize
的请求。大部分身份验证集成都会在这个端点前放置一个身份验证代理,或者将 OpenShift Container Platform 配置为针对后备身份提供程序验证凭证。对 <namespace_route>/oauth/authorize
的请求可能来自不能显示交互式登录页面的用户代理,如 CLI。因此,除了交互式登录流程外,OpenShift Container Platform 也支持使用 WWW-Authenticate
质询进行验证。
如果在 <namespace_route>/oauth/authorize
端点前面放置身份验证代理,它会向未经身份验证的非浏览器用户代理发送 WWW-Authenticate
质询,而不显示交互式登录页面或重定向到交互式登录流程。
为防止浏览器客户端遭受跨站请求伪造 (CSRF) 攻击,当请求中存在 X-CSRF-Token
标头时,仅发送基本身份验证质询。希望接收基本 WWW-Authenticate
质询的客户端必须将此标头设置为非空值。
如果身份验证代理不支持 WWW-Authenticate
质询,或者如果 OpenShift Container Platform 配置为使用不支持 WWW-Authenticate 质询的身份提供程序,则必须使用浏览器从 <namespace_route>/oauth/token/request
手动获取令牌。
2.3.1.2. API 模仿
您可以配置对 OpenShift Container Platform API 的请求,使其表现为像是源自于另一用户。如需更多信息,请参阅 Kubernetes 文档中的用户模仿。
2.3.1.3. Prometheus 身份验证指标
OpenShift Container Platform 在身份验证尝试过程中捕获以下 Prometheus 系统指标:
-
openshift_auth_basic_password_count
统计oc login
用户名和密码的尝试次数。 -
openshift_auth_basic_password_count_result
按照结果(success
或error
)统计oc login
用户名和密码的尝试次数。 -
openshift_auth_form_password_count
统计 web 控制台登录尝试次数。 -
openshift_auth_form_password_count_result
按照结果(success
或error
)统计 web 控制台登录尝试次数。 -
openshift_auth_password_total
统计oc login
和 web 控制台登录尝试总次数。