OpenShift中有用户及组的概念,并且提供了User与Group资源类型,可以非常方便地为OpenShift集群创建用户,创建组,以组给用户进行组管理,并授权。这也大大方便了集群账号的管理与权限的控制。
[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获取用户信息及对用户(组)授权
获取当前用户名
[k8s@master01 ~] kubectl config view -o=jsonpath="{.contexts[0].context.user}"
dev-user
为用户赋予namespace的管理员权限
[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管理员权限
[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
#!/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
#!/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)设计
该工具包含以下功能
- 功能说明
- 创建用户
- 为用户分配组信息
- 为用户或者组绑定role,设置权限
- 为用户或者组绑定clusterrole,设置权限
工具使用手册说明
- 功能说明
$ k8sum [-h/--help]
k8sum是一个Kubernetes用户权限管理工具,它能够实现用户创建、分组、权限分配等功能。
格式:
k8sum [command] [--args]
command:
create 创建访问配置文件
bind 为用户/组绑定权限
- 创建用户
$ k8sum create --user=user-dev
- 为用户分配组信息
$ k8sum create --user=user-dev --group=group1,goup2
- 为用户或者组绑定role
$ k8sum bind --user=user-dev --role=role1
$ k8sum bind --group=group1 --role=role1
- 为用户或者组绑定clusterrole
$ 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实战:为账号一统
网友评论