CCE集群实现客户端不同的用户操作不同集群

举报
可以交个朋友 发表于 2023/12/28 20:12:16 2023/12/28
【摘要】 一、背景客户基于安全生产权限管控考虑,想通过堡垒机让不同用户可以操作不同集群的资源,授权操作权限的时间需要1天过期。需要解决的问题点分析如下:单个客户端可以控制多套集群不同用户控制不同集群用户只能操作授权的命名空间资源用户操作权限会超时,可以续期 二、方案简介堡垒机实现授权用户具体集群细粒度权限,调用API接口,生成kubeconfig堡垒机调用集群的API接口设置权限范围、有效期限,获取...

一、背景

客户基于安全生产权限管控考虑,想通过堡垒机让不同用户可以操作不同集群的资源,授权操作权限的时间需要1天过期。

需要解决的问题点分析如下:

  • 单个客户端可以控制多套集群
  • 不同用户控制不同集群
  • 用户只能操作授权的命名空间资源
  • 用户操作权限会超时,可以续期

二、方案简介

image.png

  1. 堡垒机实现授权用户具体集群细粒度权限,调用API接口,生成kubeconfig
  2. 堡垒机调用集群的API接口设置权限范围、有效期限,获取对应的token
  3. 堡垒机更新具有时间期限的token到kubeconfig里
  4. 用户通过堡垒机登录具体跳板机,在具体用户文件夹下使用kubectl与对应权限的集群交互

三、关键技术点

  1. 用户账号与集群ServiceAccount账号对应。在K8S集群的指定命名空间下新建ServiceAccount和role,并绑定。
  2. RBAC权限细粒度控制。通过对k8s集群里role权限的配置,实现资源不同级别访问的权限。
  3. 过期时间设置。通过TokenRequest API获取ServiceAccount账号具有时间期限的token,将kubeconfig里client-certificate-data和client-key-data的内容替换为此token,从而实现时间的有效期设置。可以参考官方文档:https://kubernetes.io/zh-cn/docs/reference/kubernetes-api/authentication-resources/token-request-v1

四、准备工作

本案例只负责单点功能联调,堡垒机相关联动还需客户自己实现

资源准备:
1 一套CCE k8s集群(自搭建集群需要准备集群相关证书和kbeconfig文件)
2 一台linux客户端(集群节点也可)

本案例效果如下:
在一台linux客户端上,tom用户只拥有操作集群A中testns1的权限

五、操作步骤

步骤1 登录Linux客户端,创建系统普通用户

创建用户并设置密码,依次创建完客户,按需要更换用户名

# useradd tom
# echo "******"|passwd --stdin tom
Changing password for user tom.
passwd: all authentication tokens updated successfully.

步骤2 创建k8s集群的SA、role和rolebinding资源

# 创建命名空间testns1
kubectl create ns testns1
# 在testns1命名空间下创建serviceaccount账户tom
kubectl create sa tom -n testns1
# 在testns1命名空间下创建role角色
kubectl create role tom --verb=* --resource=* -n testns1 
# 在testns1命名空间下将SA账户和role角色进行绑定
kubectl create rolebinding tom-bind --role=tom --serviceaccount=testns1:tom -n testns1
# 更新role角色的操作权限为拥有在testns1命名空间下所有操作权限 
kubectl patch role tom --patch '{"rules":[{"apiGroups":["*"],"resources":["*"],"verbs":["*"]}]}' -n testns1
# 查看是否创建成功
kubectl get sa,role,rolebinding -n testns1

image.png

步骤3 通过集群证书认证,调用API接口获取临时性服务账号token.

  1. 登录CCE集群,在集群信息中查看连接信息,查找到连接认证,点击下载x509证书
    image.png

  2. 下载后会获取到集群的client.key、client.crt、ca.crt相关x509证书文件
    image.png

  3. 将上面下载的证书文件上传到集群的一台node节点主机,将文件上传到cert文件夹内

  mkdir cert && cd cert
  1. 获取具有期限的sa服务账号的token
    使用 TokenRequest API 指定证书过期时间,获取上面创建的服务账号tom的token,也就是API凭据,比如让token过期时间为1天,即86400秒,操作命令如下:
curl -g -k -s -H 'Content-Type: application/json; charset=utf-8' --cert /root/cert/client.crt --key /root/cert/client.key --cacert /root/cert/ca.crt  -X POST https://192.168.2.77:5443/api/v1/namespaces/testns1/serviceaccounts/tom/token -d '{"spec":{"expirationSeconds":86400}}'
  • –cert /root/cert/client.crt --key /root/cert/client.key --cacert /root/cert/ca.crt : 集群x509证书
  • 192.168.2.77:5443 : 集群kube-apiserver服务地址
  • testns1: serviceaccount账户所在命名空间
  • tom: serviceaccount账户

image.png

保存返回值到文件,后期步骤需要使用

步骤4 在tom用户目录新建kubeconfig文件

  1. 在/home/tom下创建.kube子目录
mkdir -p /home/tom/.kube
  1. 创建一个名为config的文件
    登录CCE集群,在集群信息中查看连接信息,查找到连接认证,在kubectl中点击配置,将配置文件复制到/home/tom/.kube/config文件中
    image.png
vim  /home/tom/.kube/config
{ 
    "kind": "Config",
    "apiVersion": "v1",
    "preferences": {},
    "clusters": [
        {
            "name": "internalCluster",
            "cluster": {
                "server": "https://xxx.xxx.xxx.xxx:5443",
                "certificate-authority-data": "***********"
            }
        }
    ],
    "users": [
        {
            "name": "user",
            "user": {
                "client-certificate-data": "********",
                "client-key-data": "**********"
            }
        }
    ],
    "contexts": [
        {
            "name": "internal",
            "context": {
                "cluster": "internalCluster",
                "user": "user"
            }
        }
    ],
    "current-context": "internal"
}
  • “server”: “https://xxx.xxx.xxx.xxx:5443” 集群apiserver地址,从CCE控制台下载下来就有,无需更改
  • “certificate-authority-data”: “***********” 集群master节点ca证书编码后的内容,从CCE控制台下载下来就有,无需更改
  • “client-certificate-data” 和 “client-key-data” 暂不做改动,后面会删除替换为token的内容;
  1. 更改config文件属主
# chown tom:tom /home/tom/.kube/config
ls -l /home/tom/.kube/config
-rw------- 1 tom tom 3178 Mar 22 14:27 /home/tom/.kube/config

步骤5 更改kubeconfig部分字段内容

将client-certificate-data内容 和 client-key-data内容全部删除,复制获取的token内容,放到"user": { }大括号里,如下图所示

 vim /home/tom/.kube/config

建议通过sed命名更改/home/tom/.kube/config文件,替换client-certificate-data内容 和 client-key-data内容,可以提高效率
image.png

----结束

验证结果

步骤1 切换到tom用户,执行kubectl命令,查询资源资源.

验证创建资源

kubectl -n testns1 create deployment myapp --image=nginx:alpine --replicas=1

kubectl get pod -n testns1
NAME                     READY   STATUS    RESTARTS   AGE 
myapp-745f5bd6c4-lt4rn   1/1     Running   0          119s 
nginx-bfb9c64c7-c6flj    1/1     Running   0          35m

image.png
可以观察到其它命名空间无权限操作
----结束

扩展:获取serviceAccout永久性的token

  • 在CCE 1.23及之前的版本(k8s 是1.24之前),创建ServiceAccount会自动创建secret,且此secret的期限是永久的;
  • 从CCE 1.25以后的版本, 通过在创建secret时添加注解"kubernetes.io/service-account.name"来绑定SA,apiserver会自动为secret注入永不过期的token

CCE 1.23及以下

步骤1 在testns1命名空间下查看secret

# kubectl get secret -n testns1
NAME                  TYPE                                  DATA   AGE 
default-secret        kubernetes.io/dockerconfigjson        1      13m 
default-token-zhzxs   kubernetes.io/service-account-token   3      13m 
paas.elb              cfe/secure-opaque                     3      13m 
tom-token-qr7j9       kubernetes.io/service-account-token   3      5m25s

步骤2 查看想看的secret

# kubectl get secret tom-token-qr7j9 -n testns1 -oyaml

image.png

步骤3 下面获取解码后的token

# kubectl -n testns1 get secret tom-token-qr7j9 -o jsonpath="{['data']['token']}"|base64 --decode 
eyJhbGciOiJSUzI1NiIsImtpZCI6IkFvOHloVjF2UEhuT2t0Z0FGcjBhcWowYk1tX25rLVVjNVJIMnV6TGVfQ0UifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3Nlcn**********************************************************************mfXlDgUH9VWfgqSN1hmq6vA

----结束

CCE 1.25

步骤1 创建服务账号zhangsan

# kubectl create sa zhangsan -n test 
serviceaccount/zhangsan created

步骤2 使用如下yaml创建secret绑定sa

# cat sa-zhangsan.yaml 
apiVersion: v1 
kind: Secret 
metadata: 
  name: zhangsan-secret 
  namespace: test 
  annotations: 
    kubernetes.io/service-account.name: zhangsan 
type: kubernetes.io/service-account-token 
 
# kubectl apply -f sa-zhangsan.yaml 
secret/zhangsan-secret created 
 
# kubectl -n test get secret 
NAME              TYPE                                  DATA   AGE 
zhangsan-secret   kubernetes.io/service-account-token   3      14s

步骤3 获取token

# kubectl -n test describe secret zhangsan-secret |grep token: 
token:      eyJhbGciOiJSUzI1NiIsImtpZCI6Ijg1aTlzS09odFkwUzFOeElYMHI0ZT********************************************************FMpp-rnK3hn9DEhzPO-hUfvw

----结束

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。