【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