K8S限制不同的用户操作固定命名空间

为用户签发证书

ssl认证

#进入存放ca证书的文件夹
$ cd /etc/kubernetes/pki/
#生成私钥key
$ (umask 077; openssl genrsa -out hxg.key 2048)
#生成一个用户名为user-hxg的证书
$ openssl req -new -key hxg.key -out hxg.csr -subj "/CN=user-hxg"
$ openssl x509 -req -in hxg.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out hxg.crt -days 3650
Signature ok
subject=/CN=user-hxg
Getting CA Private Key

注意:

  • 生成密钥的命令使用(),可以避免修改umask影响到系统的umask
  • 流程是 生成密钥 =====》用密钥生成证书请求文件 CN是指定给哪个用户请求证书 =====》用密钥和请求文件,让ca签发证书 days是有效期

在kubeconfig下新增用户

#把user-hxg这个用户添加到kubernetes集群中,可以用来认证apiserver的连接
$ kubectl config set-credentials user-hxg --client-certificate=./hxg.crt --client-key=./hxg.key --embed-certs=true
User "user-hxg" set.

#在配置文件的上下文中新增加一个user-hxg这个账号
$ kubectl config set-context user-hxg@kubernetes --cluster=kubernetes --user=user-hxg
Context "user-hxg@kubernetes" created.

注意:

  • 使用set-credentials添加证书和私钥
  • 使用set-context添加用户的上下文 格式必须是<用户名>@<集群名> 例如user-hxg@kubernetes

最后体现在配置文件中的效果

切换上下文

$ kubectl config use-context user-hxg@kubernetes 
Switched to context "user-hxg@kubernetes".
$ kubectl get pod
Error from server (Forbidden): pods is forbidden: User "user-hxg" cannot list resource "pods" in API group "" in the namespace "default"

可以看到切换到user-hxg@kubernetes的,默认没有任何权限

#切换回原上下文
$ kubectl config use-context kubernetes-admin@kubernetes #这个是集群用户,有任何权限

授权

user-hxg用户通过rolebinding绑定到管理员的clusterrole上,用户就可以对rolebinding所在命名空间下有任何的操作

注意,只能是给定的命名空间,如果想操作所有的命名空间,需要使用clusterRoleBanding

命令行创建

#创建命名空间
$ kubectl create ns rbac
#创建rolebinding 将用户绑定在命名空间中,并授予命名空间的管理员权限
$ kubectl create rolebinding user-hxg-bind -n rbac --clusterrole=cluster-admin --user=user-hxg

yaml文件创建

#创建命名空间
---
apiVersion: v1
kind: Namespace
metadata:
  name: rbac
#创建rolebinding
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: user-hxg-bind
  namespace: rbac
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- namespace: rbac
  kind: User
  name: user-hxg

切换上下文查看权限

$ kubectl config use-context user-hxg@kubernetes 
Switched to context "user-hxg@kubernetes".
#拒绝访问默认命名空间下的资源
$ kubectl get pod
Error from server (Forbidden): pods is forbidden: User "user-hxg" cannot list resource "pods" in API group "" in the namespace "default"

#可访问指定命名空间下的资源
$ kubectl get pod -n rbac
No resources found in rbac namespace.
$ kubectl get svc -n rbac
No resources found in rbac namespace.

给用户生成配置文件

新建用户

$ useradd hxg

修改并拷贝配置文件

#新建存放配置文件的目录
$ mkdir /home/hxg/.kube
#拷贝配置文件
$ cp /root/.kube/config /home/hxg/.kube/
#修改配置文件
$ vim /home/hxg/.kube/
apiVersion: v1
clusters:
- cluster:
    certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1J............==
    server: https://10.0.0.5:6443
  name: kubernetes
contexts:      #删除上下文中的其他用户的上下文,只保留user-hxg用户的
- context:
    cluster: kubernetes
    user: user-hxg
  name: user-hxg@kubernetes
current-context: user-hxg@kubernetes  #修改此处的上下文,将上下文修改成user-hxg用户的
kind: Config
preferences: {}
users:   #删除其他用户的密钥和证书 只留user-hxg用胡的证书和密钥
- name: user-hxg
  user:
    client-certificate-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS..............=
    client-key-data: LS0tLS1CRUdJTiBSU0EgUFJ..................=

#修改属主属组
$ chown -R hxg:hxg /home/hxg/.kube

修改的要点

  • 修改当前上下文current-context字段的值,将当前上下文的值改为user-hxg用户
  • 删除其他用户的上下文 删除其他用户的密钥和证书

验证

#切换到hxg下
$ su - hxg
上一次登录:六 10月 22 03:44:41 CST 2022pts/0 上
#无法查看默认命名空间的
$ kubectl get pod
Error from server (Forbidden): pods is forbidden: User "user-hxg" cannot list resource "pods" in API group "" in the namespace "default"
#可以查看rbac命名空间的
$ kubectl get pods -n rbac
No resources found in rbac namespace.

删除用户及删除上下文

$ kubectl config delete-user user-hxg 
deleted user user-hxg from /root/.kube/config        
$ kubectl config delete-context user-hxg@kubernetes 
deleted context user-hxg@kubernetes from /root/.kube/config

注意:要想解除某个用户的权限,只删除配置文件中的用户和上下文是无法取消权限的,需要删除roleBinding或者cluserRoleBinding才行

posted @ 2023-02-12 19:35  厚礼蝎  阅读(293)  评论(0编辑  收藏  举报