OpenShift用戶管理圖
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實戰:為賬號一統