
OpenShift中有用户及组的概念,并且提供了User与Group资源类型,可以非常方便地为OpenShift集群创建用户,创建组,以组给用户进行组管理,并授权。这也大大方便了集群账号的管理与权限的控制。
1 2 3 4 5
| [openshift@master01 ~] oc create user dev-user # 创建用户dev-user [openshift@master01 ~] oc adm groups new my-group # 创建组my-group [openshift@master01 ~] oc adm groups new my-group dev-user # 创建组my-group,并添加dev-user到该组 [openshift@master01 ~] oc adm groups add-users my-group dev-user # 为组my-group添加用户dev-user [openshift@master01 ~] oc adm groups remove-users my-group dev-user # 将用户dev-user从my-group组中移除
|
与OpenShift一样,K8S也是通过RBAC实现权限控制。RBAC(Role-Based Access Control)即为基于角色的访问控制。K8S中与RBAC相关的资源类型有:Role、ClusterRole、RoleBinding、ClusterRoleBinding。那么针对K8S集群,有没有办法实现类似于OpenShift的用户、组的管理呢?答案是肯定的,但是需要执行一系列的脚本操作。
本篇将介绍如何通过命令为Kubernetes创建用户及用户组,并对用户进行授权。同时设计了一个脚本工具来模拟实现类似OpenShift用户与组的功能。
K8S获取用户信息及对用户(组)授权
获取当前用户名
1 2
| [k8s@master01 ~] kubectl config view -o=jsonpath="{.contexts[0].context.user}" dev-user
|
为用户赋予namespace的管理员权限
1 2
| [k8s@master01 ~] kubectl create rolebinding dev-user-admin-binding --clusterrole=admin --user=dev-user --namespace=dev [k8s@master01 ~] kubectl create rolebinding dev-user-admin-binding --clusterrole=admin --user=dev-user -n sit
|
为组授权,赋予namespace管理员权限
1 2
| [k8s@master01 ~] kubectl create rolebinding dev-group-admin-binding --clusterrole=admin --group=dev-group --namespace=dev [k8s@master01 ~] kubectl create rolebinding dev-group-admin-binding --clusterrole=admin --group=dev-user -n sit
|
生成用户及组证书
- 配置信息脚本
config.sh
1 2 3 4 5 6
| #!/bin/bash USERNAME=username #用户名 GROUP=/O=group #用户所属组,多个组可以使用/O=group1/O=group2 DEFAULT_NS=kube-system # 默认ns API_SERVER=https://master.k8s.com:6443 #K8S API Server地址 K8S_PKI_PATH=/etc/kubernetes/pki/ # K8S证书存放目录
|
- 为新用户创建证书脚本
add_user.sh
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| #!/bin/bash source config.sh # 导入配置信息 K8S_PKI_PATH=${K8S_PKI_PATH%/} mkdir -p .tmp openssl genrsa -out .tmp/$USERNAME.key 2048 # 生成密钥 openssl req -new -key .tmp/$USERNAME.key -out .tmp/$USERNAME.csr -subj "/CN=${USERNAME}${GROUP}" #生成csr证书,包含用户名及组信息 openssl x509 -req -in .tmp/$USERNAME.csr -CA ${K8S_PKI_PATH}/ca.crt -CAkey ${K8S_PKI_PATH}/ca.key -CAcreateserial -out .tmp/$USERNAME.crt -days 3650 #生成crt证书
# 使用k8s证书与生成的用户证书生成访问配置文件$USERNAME.conf kubectl config --kubeconfig=$USERNAME.conf set-cluster kubernetes --server=$API_SERVER --certificate-authority=${K8S_PKI_PATH}/ca.crt --embed-certs kubectl config --kubeconfig=$USERNAME.conf set-credentials $USERNAME --client-certificate=.tmp/$USERNAME.crt --client-key=.tmp/$USERNAME.key --embed-certs=true kubectl config --kubeconfig=$USERNAME.conf set-context $USERNAME@kubernetes --cluster=kubernetes --user=$USERNAME --namespace=$DEFAULT_NS kubectl config --kubeconfig=$USERNAME.conf use-context $USERNAME@kubernetes
echo -e "请将下面的文件内容复制到需要的用户目录.kube/config文件中\n\n" cat $USERNAME.conf echo -e "\n\n"
|
- 在k8s的主节点运行add_user.sh,即可完成用户证书的生成。
用户、组权限与访问控制工具k8sum(K8S User Manager)设计
该工具包含以下功能
0. 功能说明
- 创建用户
- 为用户分配组信息
- 为用户或者组绑定role,设置权限
- 为用户或者组绑定clusterrole,设置权限
工具使用手册说明
0. 功能说明
1 2 3 4 5 6 7
| $ k8sum [-h/--help] k8sum是一个Kubernetes用户权限管理工具,它能够实现用户创建、分组、权限分配等功能。 格式: k8sum [command] [--args] command: create 创建访问配置文件 bind 为用户/组绑定权限
|
- 创建用户
1
| $ k8sum create --user=user-dev
|
- 为用户分配组信息
1
| $ k8sum create --user=user-dev --group=group1,goup2
|
- 为用户或者组绑定role
1 2
| $ k8sum bind --user=user-dev --role=role1 $ k8sum bind --group=group1 --role=role1
|
- 为用户或者组绑定clusterrole
1 2
| $ k8sum bind --user=user-dev --clusterrole=clusterrole1 $ k8sum bind --group=group1 --clusterrole=clusterrole1
|
总结
RBAC设计来源于OpenShift,最后融入到了K8S。虽然都是基于RBAC,但是OpenShift在对用户权限的管理这一块考虑得更加全面,也更为实用。K8S真正要做好权限管理这块,还需要做更多的集成或二次开发的工作。
补充说明:OpenShift也好,Kubernetes也好,都可以对接第三方认证,如Keystone,LDAP,OpenID Connect等。
OpenShift与OpenLDAP结接,可参考之前分享的文章:Openshift上部署OpenLDAP实战:为账号一统
参考文章
为Kubernetes集群添加用户
RBAC——基于角色的访问控制