理解OpenShift(4):用户及权限管理

 于 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
  • project manager
  • 如果用于本地 rolebinding,那么用户将能查看和修改所在项目中的所有资源
basic-user
  • user 可以获取关于项目和用户的基本信息
cluster-admin
  • 用户可以在任何项目中做任何操作(超级用户)
  • 如何用于本地 rolebinding,那么用户将拥有所在project的所有权限,包括控制quota和role
cluster-status
  • 用户可以获取集群的基本状态信息
edit
  • 用户可以修改项目中的大部分对象;但是不能查看或修改 role 和 rolebinding
self-provisioner
  • 所有用户的默认role,可以创建自己的project
view
  • 用户可以查看项目中的大部分对象,除了 role 和 rolebinding
  • 用户不能做任何修改任何对象 

可以查看所有角色,比如 system:router 角色:

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

50000+
5万行代码练就真实本领
17年
创办于2008年老牌培训机构
1000+
合作企业
98%
就业率

联系我们

电话咨询

0532-85025005

扫码添加微信