×

要与AWS上的Red Hat OpenShift服务交互,用户必须首先向集群进行身份验证。身份验证层识别与AWS上的Red Hat OpenShift服务API请求关联的用户。然后,授权层使用有关请求用户的相关信息来确定请求是否允许。

用户

AWS上的Red Hat OpenShift服务中的用户是可以向AWS上的Red Hat OpenShift服务API发出请求的实体。AWS上的Red Hat OpenShift服务User对象表示一个参与者,可以通过向其或其组添加角色来授予其系统权限。通常,这表示与AWS上的Red Hat OpenShift服务交互的开发人员或管理员的帐户。

可能存在几种类型的用户

用户类型 描述

普通用户

这是大多数交互式AWS Red Hat OpenShift服务用户的表示方式。普通用户在首次登录时会在系统中自动创建,也可以通过API创建。普通用户由User对象表示。例如:joe alice

系统用户

许多这些用户在定义基础设施时会自动创建,主要目的是为了使基础设施能够安全地与API交互。它们包括集群管理员(拥有所有权限)、每个节点用户、路由器和注册表使用的用户以及其他各种用户。最后,还有一个anonymous系统用户,默认情况下用于未经身份验证的请求。例如:system:admin system:openshift-registry system:node:node1.example.com

服务帐户

这些是与项目关联的特殊系统用户;有些会在首次创建项目时自动创建,而项目管理员可以创建更多帐户,以便定义对每个项目内容的访问权限。服务帐户由ServiceAccount对象表示。例如:system:serviceaccount:default:deployer system:serviceaccount:foo:builder

每个用户都必须以某种方式进行身份验证才能访问AWS上的Red Hat OpenShift服务。没有身份验证或身份验证无效的API请求将被身份验证为由anonymous系统用户发出的请求。身份验证后,策略将确定用户有权执行的操作。

用户可以分配到一个或多个,每个组代表一组特定的用户。在管理授权策略以一次向多个用户授予权限时,组非常有用,例如允许访问项目中的对象,而不是分别授予用户权限。

除了明确定义的组外,还有一些系统组或虚拟组是由集群自动预配的。

以下默认虚拟组最重要

虚拟组 描述

system:authenticated

自动与所有已验证用户关联。

system:authenticated:oauth

自动与所有使用OAuth访问令牌进行身份验证的用户关联。

system:unauthenticated

自动与所有未经身份验证的用户关联。

API身份验证

对AWS上的Red Hat OpenShift服务API的请求使用以下方法进行身份验证

OAuth访问令牌
  • 使用<namespace_route>/oauth/authorize<namespace_route>/oauth/token端点从AWS上的Red Hat OpenShift服务OAuth服务器获取。

  • 作为Authorization: Bearer…​标头发送。

  • 对于websocket请求,以base64url.bearer.authorization.k8s.io.<base64url-encoded-token>的形式作为websocket子协议标头发送。

X.509客户端证书
  • 需要与API服务器建立HTTPS连接。

  • 由API服务器针对受信任的证书颁发机构捆绑包进行验证。

  • API服务器创建并分发证书给控制器以进行自我身份验证。

任何具有无效访问令牌或无效证书的请求都会被身份验证层拒绝,并显示401错误。

如果没有提供访问令牌或证书,身份验证层会将system:anonymous虚拟用户和system:unauthenticated虚拟组分配给请求。这允许授权层确定匿名用户允许发出哪些请求(如果有)。

AWS上的Red Hat OpenShift服务OAuth服务器

AWS上的Red Hat OpenShift服务主节点包含一个内置的OAuth服务器。用户获取OAuth访问令牌以对其自身进行身份验证到API。

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

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

OAuth令牌请求

每个OAuth令牌请求都必须指定将接收和使用该令牌的OAuth客户端。启动AWS上的Red Hat OpenShift服务API时,会自动创建以下OAuth客户端

OAuth客户端 用法

openshift-browser-client

使用可以处理交互式登录的用户代理在<namespace_route>/oauth/token/request处请求令牌。[1]

openshift-challenging-client

使用可以处理WWW-Authenticate挑战的用户代理请求令牌。

  1. <namespace_route> 指的是命名空间路由。可以通过运行以下命令找到它

    $ oc get route oauth-openshift -n openshift-authentication -o json | jq .spec.host

所有OAuth令牌请求都涉及对<namespace_route>/oauth/authorize的请求。大多数身份验证集成在此端点前面放置一个身份验证代理,或将AWS上的Red Hat OpenShift服务配置为针对后端身份提供程序验证凭据。对<namespace_route>/oauth/authorize的请求可以来自无法显示交互式登录页面的用户代理,例如CLI。因此,AWS上的Red Hat OpenShift服务支持使用WWW-Authenticate挑战进行身份验证,以及交互式登录流程。

如果在<namespace_route>/oauth/authorize端点前面放置了身份验证代理,它会向未经身份验证的非浏览器用户代理发送WWW-Authenticate挑战,而不是显示交互式登录页面或重定向到交互式登录流程。

为了防止针对浏览器客户端的跨站点请求伪造 (CSRF) 攻击,只有在请求中包含X-CSRF-Token标头时,才发送Basic身份验证挑战。预期接收Basic WWW-Authenticate挑战的客户端必须将此标头设置为非空值。

如果身份验证代理不支持WWW-Authenticate挑战,或者AWS上的Red Hat OpenShift服务配置为使用不支持WWW-Authenticate挑战的身份提供程序,则必须使用浏览器从<namespace_route>/oauth/token/request手动获取令牌。