【Openshift】用户权限管理

令牌

openshift通过用户提供的登录信息确认用户身份的过程即认证的过程,openshift通过OAuth进行用户的认证,OAuth是一个开源的认证和授权的框架,在openshift的master节点上运行着一个内置的OAuth服务对用户的请求进行认证检查。一旦OAuth服务器通过登录信息确认用户身份,OAuth服务器就返回用户的token,通过token,用户可以在有效时间内对系统进行访问。

获取当前用户当前会话token

~]# oc login -u dev
~]# oc whoami -t
#还可以通过访问URL获取token
curl -v --insecure --user username:passwrod --header "X-CSRF-Token: xxx" --url "https://master.example.com:8443/oauth/authorize?response_type=token&client_id=openshift-challenging-client"

Indentity Provider

作为身份验证的登录信息,如用户名和密码,并非保存在openshift集群内,而是保存早用户信息管理系统内,openshift并不包含具体的用户信息库管理系统,但是openshift提供不同的适配器连接不同的用户信息管理系统。这些后端的用户信息管理系统在openshift中称为Indentity Provider

查看master-config.yaml配置,可以看到当前示例集群使用的Provider的类型及配置

~]# cat /etc/origin/master/master-config.yaml|grep provider -A 3

假设用户为openshift配置某个Indentity Provider,当用户第一次登陆时,openshift会为这个用户创建一个user对象及一个identity对象。

~]# oc get identity

这里接下来我们采用htpasswd作为Indentity Provider

用户组管理

openshift可以通过oc get user命令查看openshift系统中的存在的用户列表
openshift用户信息来源于后端的Indentity Provider。

组的信息来源有两个,一个是后端的Indentity Provider,二是通过用户在openshift中定义,通过oadm groups命令,可以在openshift中对组及组的成员进行管理

创建developers的组

~]# oc groups new developers

将dev用户添加到developers组内,通过组,管理员可以更方便的管理用户,为后续权限管理打下基础

~]# oadm groups add-users developers dev

用户权限

1、创建openshift用户

~]# htpasswd -b /etc/origin/master/htpasswd admin welcomel
-c: 重新创建密码文件
#查看已经创建的用户
~]# cat /etc/origin/master/htpasswd
#修改用户密码
~]# htpasswd -b htpasswd.user Jack 123456

将用户定义为集群管理员

~]# oc adm policy add-cluster-role-to-user cluster-admin <user>
示例:为创建的用户分配集群管理员权限
~]# oc adm policy add-cluster-role-to-user cluster-admin admin

授权

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,用户不能做任何修改任何对象 

本地role绑定命令

命令	                                                描述
$ oc adm policy who-can <verb><resource>	指出哪些用户可以对某一资源执行某种操作。
$ oc adm policy add-role-to-user <role><username>	将指定角色绑定到当前项目中的指定用户。
$ oc adm policy remove-role-from-user<role> <username>	从当前项目中的指定用户移除指定角色。
$ oc adm policy remove-user <username>	移除当前项目中的指定用户及其所有角色。
$ oc adm policy add-role-to-group <role><groupname>	将给定角色绑定到当前项目中的指定组。
$ oc adm policy remove-role-from-group<role> <groupname>	从当前项目中的指定组移除给定角色。
$ oc adm policy remove-group<groupname>	移除当前项目中的指定组及其所有角色。

集群role绑定命令

命令	                                                            描述
$ oc adm policy add-cluster-role-to-user<role> <username>	将给定角色绑定到集群中所有项目的指定用户。
$ oc adm policy remove-cluster-role-from-user <role> <username>	从集群中所有项目的指定用户移除给定角色。
$ oc adm policy add-cluster-role-to-group <role> <groupname>	将给定角色绑定到集群中所有项目的指定组。
$ oc adm policy remove-cluster-role-from-group <role> <groupname>	从集群中所有项目的指定组移除给定角色。

向指定项目中的用户添加role

~]# oc adm policy add-role-to-user <role> <user> -n <project>
#示例
~]# oc adm policy add-role-to-user view arvato_dev -n sephora-stage
~]# oc adm policy add-role-to-user edit arvato_ops -n sephora-stage

查看role绑定

~]# oc get rolebinding

查看cluster role绑定

~]# oc get clusterrolebinding

自定义role

创建本地role

~]# oc create role <name> --verb=<verb> --resource=<resource> -n <project>
○ <name>,本地角色的名称
○ <verb>,以逗号分隔的、应用到角色的操作动词列表
○ <resource>,角色应用到的资源
○ <project>,项目名称

例:要创建一个本地角色来允许用户查看 blue 项目中的 Pod

~]# oc create role podview --verb=get --resource=pod -n blue
#新角色绑定到用户
~]# oc adm policy add-role-to-user podview user2 --role-namespace=blue -n blue

创建集群role

~]# oc create clusterrole <name> --verb=<verb> --resource=<resource>
○ <name>,本地角色的名称
○ <verb>,以逗号分隔的、应用到角色的操作动词列表
○ <resource>,角色应用到的资源

例如,要创建一个集群角色来允许用户查看 Pod,请运行以下命令:

~]# oc create clusterrole podviewonly --verb=get --resource=pod

Serviceaccount

Service account是openshift中特殊的用户账号,这些账号专门用于容器应用交互
每当创建一个新的项目时,openshift都会为这个项目创建一系列的service account,如builder账号用户构建S2I,default账号用于运行容器,deployer账号用户部署容器

查看当前项目的serviceaccount

$ oc get sa
NAME       SECRETS   AGE
builder    2         2d
default    2         2d
deployer   2         2d

在当前项目中创建新服务帐户:

$ oc create sa <service_account_name>
serviceaccount "robot" created

serviceaccount授权

默认openshift启动容器不能调用宿主机的资源,比如端口
openshift默认启动的容器禁止使用Root用户,需要使用root需要修改scc
scc限制了容器内启动用户UID范围,也就数说,虽然Dcokerfile中定义容器和用户的安全上下文设置决定是按dockerfile指定用户启动,还是随机生成一个普通用户运行

修改当前项目的服务账号
例如,将 view 角色添加到 top-secret 项目中的 robot 服务帐户:

$ oc adm policy add-role-to-user view system:serviceaccount:top-secret:robot
#也可以使用如下方法:
$ oc adm policy add-role-to-user <role_name> -z <serviceaccount_name>

示例:新建sa账号arvato-api,访问所有名称空间

$ oc project sephora-prod
$ oc create sa arvato-api
$ oc adm policy add-cluster-role-to-user cluster-reader  system:serviceaccount:sephora-prod:arvato-api

获取sa账号的token

oc serviceaccounts get-token arvato-ops

安全上下文(SCC)

scc主要是控制pod的权限,只有serviceaccount才使用到scc
通过身份认证了的用户都只在 restricted 这个 scc 的用户列表,包括 service account。因此,pod 默认使用的是 restricted scc。要使它使用其它的scc,就要将它的 service account user 加入到要使用的 scc 的用户列表之中

查看scc列表

~]# oc get scc
privileged: openshift内置的scc,权限最大,包括修改selinux和anyuid
anyuid: pod内可以修改uid,使用root
#授权
~]# oc adm policy add-scc-to-user <scc_name> <user_name>
~]# oc adm policy add-scc-to-user anyuid -z nginxuser
#等同于
~]# oc adm policy add-scc-to-user anyuid system:serviceaccount:default:nginxuser

示例:给default的sa账号配置privileged组的scc

~]# oc project sephora-stage
~]# oc adm policy add-scc-to-user privileged -z default

参考链接:https://www.cnblogs.com/sammyliu/p/10083659.html

posted @ 2022-04-15 21:00  彬彬l  阅读(751)  评论(0编辑  收藏  举报