OpenShift用户管理图

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

生成用户及组证书

  1. 配置信息脚本 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证书存放目录
  2. 为新用户创建证书脚本 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"
  3. 在k8s的主节点运行add_user.sh,即可完成用户证书的生成。

用户、组权限与访问控制工具k8sum(K8S User Manager)设计

该工具包含以下功能
0. 功能说明

  1. 创建用户
  2. 为用户分配组信息
  3. 为用户或者组绑定role,设置权限
  4. 为用户或者组绑定clusterrole,设置权限

工具使用手册说明
0. 功能说明

1
2
3
4
5
6
7
$ k8sum [-h/--help]
k8sum是一个Kubernetes用户权限管理工具,它能够实现用户创建、分组、权限分配等功能。
格式:
k8sum [command] [--args]
command:
create 创建访问配置文件
bind 为用户/组绑定权限
  1. 创建用户
    1
    $ k8sum create --user=user-dev
  2. 为用户分配组信息
    1
    $ k8sum create --user=user-dev --group=group1,goup2
  3. 为用户或者组绑定role
    1
    2
    $ k8sum bind --user=user-dev --role=role1
    $ k8sum bind --group=group1 --role=role1
  4. 为用户或者组绑定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——基于角色的访问控制