于 OpenShift 3.11,Kubernetes 1.11 进行测试 ***
OpenShift 支持 RBAC(Role Based Access Controll),基于角色的访问控制。它涉及诸多概念,本文尝试着做一些概念上的梳理,很多细节还需要进一步研究。
1. 主要概念及其之间的联系
1.1 用户(User)

我试着把一个OpenShift 环境中的所有用户分为三大类:
- 应用用户:部署在集群之中的应用自己的用户。一般来说每个应用都有自己的用户管理系统,与平台无关。也有一些应用,比如 Jenkins,支持与OpenShift 用户系统集成,也就是Jenkins允许用户在通过了OpenShift 用户认证后对其进行访问。这部分不是本文的讨论范围之内。
- OpenShift 用户:访问OpenShift 资源的用户。根据其特征,又将其分为三个子类:
- Regular user:代表一个自然人用户,比如部署应用的一个开发者。
- System user:OpenShift 系统用户,大部分在集群创建时被自动创建,比如每个node都有一个system user。因为这部分主要和OpenShift自身系统相关,与一般用户关系不太大,因此本文不会具体介绍这部分。
- Service account:服务账户。这是跟一个项目关联的特殊系统用户,每个用户被一个 ServiceAccount 对象表示,通常是指 pod 中运行主进程的用户。后文会有具体介绍。
- 操作系统用户:访问操作系统资源的用户,又分为容器内的操作系统用户,和宿主机上的操作系统用户。
1.2 身份(Identity)与认证(Authentication)
认证是确认用户身份是否合法的过程。这可以有多种实现方式,比如用户名/密码、令牌(token)、证书等。不同类型的用户有不同的身份管理方式:
- 对于 regular user,每个用户有一个身份(identity)用于认证。OpenShift 以插件形式支持多种 identity provider,比如在测试环境中常用的 htpasswd,生产环境中常用的 LDAP 等。这些 provider 中会保存用户身份信息,比如用户名和密码。useridentitymapping 对象将 user 对象和 identity 对象联系在一起。
- 对于 service account,一方面它需要访问 OpenShift 集群资源比如 API 和内部镜像仓库中的镜像,另一方面它可能需要访问 pod 中和宿主机上的操作系统资源,比如宿主机上的文件或网络。对于前者,每个 service account 使用 secret 来进行身份认证,包括用户 API 访问的 token 和用于从镜像仓库拉取代码的 secret。对于后者,本来有 user namespace(用户命名空间)来支持,但是似乎OpenShift 还不支持该功能。
1.3 角色(Role)/权限(Permission)与授权(Authorization)
授权是对被认证了的用户访问受控制的资源的权限进行控制。按照资源类型,OpenShift 将授权管理方式分为两大类:
- 对于 OpenShift 集群资源,比如 pod,deployment,route 等,通过 role (角色)进行控制。从范围(scope)上分,role 可分为集群角色(clusterRole)和项目角色(role)。每个角色定义了受控制的对象(subject)、允许的操作(verb)和范围(集群还是项目)。用户(user)和角色(role/clusterRole)之间通过 rolebinding/clusterrolebinding 对象进行绑定。
- 对于操作系统资源,这只针对服务账户。宿主机上的用户访问宿主机上的资源,这由宿主机操作系统进行控制。pod 中的用户(serviceaccount)访问pod内和宿主机上操作系统资源,由 scc(security context constraints)进行控制。
2. 身份 (Identity) 与认证(Authentication)
就像人的身份证一样,identity 是一个 user 的身份信息,该信息用于用户认证。OpenShift 自己并没有实现用户身份信息库,而是通过灵活支持多种 identity provider,来实现各种不同的身份管理方案。每种实现都以不同的方式保存着用户的身份信息,比如保存在LDAP 中,保存在 htpasswd 文件中,保存在 OpenStack Keystone 中。

因此,OpenShift 对 user 身份的校验是通过这些配置了的 identity provider 进行的。因此,还需要 OpenShift user 和这些 provider 里面的 identity 的映射关系。OpenShfit 支持四种映射管理,claim,lookup,generate,add。具体请参考官网
3. 角色(Role)和授权(Authorization)
前文说了,角色用于控制对 OpenShift 资源的访问权限,它分为项目角色和集群角色。

OpenShift 系统默认会创建很多的集群角色。常用的角色的简单描述如下:
| admin |
|
| basic-user |
|
| cluster-admin |
|
| cluster-status |
|
| edit |
|
| self-provisioner |
|
| view |
|
可以查看所有角色,比如 system:router 角色:

可以使用 oc adm policy 命令向用户或用户授予角色:
