找回密码
 立即注册
首页 业界区 业界 K8s中的RBAC认证授权之基于HTTPS证书给User授权认证 ...

K8s中的RBAC认证授权之基于HTTPS证书给User授权认证

驼娑 3 天前
概述

本文主要介绍在K8s中如何使用证书给User进行授权认证。
在生产环境中,当你想给对应的人员分配不同的权限,则可以阅读这篇文章
阅读这篇文章之前,你应该有一些前置知识,应该知道K8s的授权认证
可以阅读这篇文章:一文搞懂K8s中的RBAC认证授权
实操

使用cfssl生成User的CA证书

cfssl可以阅读这篇文章:https://www.cnblogs.com/huangSir-devops/p/18876361
  1. ## 创建CA证书
  2. [root@master ~/cfssl]# cat ca-config.json
  3. {
  4.   "signing": {
  5.     "default": {
  6.        # 配置默认证书有效期为10年
  7.       "expiry": "87600h"
  8.     },
  9.     "profiles": {
  10.       "kubernetes": {
  11.         "expiry": "87600h",
  12.         "usages": ["signing", "key encipherment", "server auth", "client auth"]
  13.       }
  14.     }
  15.   }
  16. }
  17. # 创建CA证书请求
  18. [root@master ~/cfssl]# cat ca-csr.json
  19. {
  20.   # CN表示用户名称
  21.   "CN": "develop",
  22.   "hosts": [],
  23.   "key": {
  24.     # 加密算法
  25.     "algo": "rsa",
  26.     # 密钥长度
  27.     "size": 4096
  28.   },
  29.   "names": [
  30.     {
  31.       # 国家代码,CN代表是中国
  32.       "C": "CN",
  33.       # 省份
  34.       "ST": "Beijing",
  35.       # 城市或地区
  36.       "L": "Beijing",
  37.       # 这里O表示用户组
  38.       "O": "dev
  39.       # 组织单位(Organizational Unit),可以理解成公司部门
  40.       "OU": "ca"
  41.     }
  42.   ]
  43. }
  44. # 创建证书存储目录
  45. [root@master ~/cfssl]# mkdir -p develop
  46. # 生成证书
  47. [root@master ~/cfssl]# cfssl gencert \
  48.   -ca=/etc/kubernetes/pki/ca.crt \
  49.   -ca-key=/etc/kubernetes/pki/ca.key \
  50.   -config=ca-config.json \
  51.   -profile=kubernetes \
  52.   ca-csr.json  | cfssljson -bare develop/develop
  53. 2025/06/07 13:52:37 [INFO] generate received request
  54. 2025/06/07 13:52:37 [INFO] received CSR
  55. # 查看文件
  56. [root@master ~/cfssl]# tree
  57. .
  58. ├── ca-config.json
  59. ├── ca-csr.json
  60. └── develop
  61.     ├── develop-key.pem # 公钥
  62.     ├── develop.csr
  63.     └── develop.pem  # 私钥
复制代码
生成kubeconfig文件

创建集群入口
  1. # 配置集群,集群可以设置多套,此处只配置了一套
  2. # --certificate-authority
  3. #   指定K8s的ca根证书文件路径
  4. # --embed-certs
  5. #   如果设置为true,表示将根证书文件的内容写入到配置文件中,
  6. #   如果设置为false,则只是引用配置文件,将kubeconfig
  7. # --server
  8. #   指定APIServer的地址。
  9. # --kubeconfig
  10. #   指定kubeconfig的配置文件名称
  11. [root@master ~/cfssl]# kubectl config set-cluster dev \
  12.   --certificate-authority=/etc/kubernetes/pki/ca.crt \
  13.   --embed-certs=true \
  14.   --server=https://apiserver.cluster.local:6443 \
  15.   --kubeconfig=develop.kubeconfig
  16. # 检查kubeconfig的配置文件
  17. [root@master ~/cfssl]# ll develop.kubeconfig
  18. -rw------- 1 root root 5336 Jun  4 11:27 develop.kubeconfig
复制代码
设置客户端认证,客户端将来需要携带证书让服务端验证
  1. [root@master ~/cfssl]# kubectl config set-credentials develop \
  2.   --client-key=/root/cfssl/develop/develop-key.pem \
  3.   --client-certificate=/root/cfssl/develop/develop.pem \
  4.   --embed-certs=true \
  5.   --kubeconfig=develop.kubeconfig
复制代码
设置默认上下文,可以用于绑定多个客户端和服务端的对应关系。
  1. [root@master ~/cfssl]# kubectl config set-context develop \
  2.   --cluster=dev \
  3.   --user=develop \
  4.   --kubeconfig=develop.kubeconfig
复制代码
测试使用生成的kubeconfig文件访问K8s集群资源
  1. # 设置当前使用的上下文
  2. [root@master ~/cfssl]# kubectl config use-context develop --kubeconfig=/root/cfssl/develop.kubeconfig
  3. Switched to context "develop"
  4. # 访问测试,这里显示无权限
  5. [root@master ~/cfssl]# kubectl get po --kubeconfig=/root/cfssl/develop.kubeconfig
  6. Error from server (Forbidden): pods is forbidden: User "develop" cannot list resource "pods" in API group "" in the namespace "default"
复制代码
为用户配置Role

上面的步骤,是认证没有问题了,但是对应的用户对集群没有权限操作
  1. [root@master ~/role]# cat role-default.yaml
  2. apiVersion: rbac.authorization.k8s.io/v1
  3. kind: Role
  4. metadata:
  5.   namespace: default
  6.   name: custom-role
  7. rules:
  8.   # 规则1:操作核心组和 apps 组的 pods、deployments,仅允许 get 和 list
  9. - apiGroups: ["","apps"]
  10.   resources: ["pods","deployments"]
  11.   verbs: ["get", "list"]
  12.   # 规则2:操作核心组和 apps 组的 configmaps、secrets、daemonsets,仅允许 get 和 list
  13. - apiGroups: ["","apps"]
  14.   resources: ["configmaps","secrets","daemonsets"]
  15.   verbs: ["get", "list"]
  16.   # 规则3:操作核心组的 secrets,允许 delete 和 create
  17. - apiGroups: [""]
  18.   resources: ["secrets"]
  19.   verbs: ["delete","create"]
  20. [root@master ~/role]# kubectl apply -f role-default.yaml
  21. [root@master ~/role]# kubectl get role custom-role
  22. NAME          CREATED AT
  23. custom-role   2025-06-07T06:34:52Z
  24. # 查看详情
  25. [root@master ~/role]# kubectl describe role custom-role
  26. Name:         custom-role
  27. Labels:       <none>
  28. Annotations:  <none>
  29. PolicyRule:
  30.   Resources         Non-Resource URLs  Resource Names  Verbs
  31.   ---------         -----------------  --------------  -----
  32.   secrets           []                 []              [get list delete create]
  33.   configmaps        []                 []              [get list]
  34.   daemonsets        []                 []              [get list]
  35.   deployments       []                 []              [get list]
  36.   pods              []                 []              [get list]
  37.   configmaps.apps   []                 []              [get list]
  38.   daemonsets.apps   []                 []              [get list]
  39.   deployments.apps  []                 []              [get list]
  40.   pods.apps         []                 []              [get list]
  41.   secrets.apps      []                 []              [get list]
复制代码
使用RoleBinding关联Role
  1. apiVersion: rbac.authorization.k8s.io/v1
  2. kind: RoleBinding
  3. metadata:
  4.   # RoleBinding 名称
  5.   name: develope-rolebinding
  6.   # 作用的命名空间
  7.   namespace: default
  8. roleRef:
  9.   apiGroup: rbac.authorization.k8s.io
  10.   # 引用的角色类型(必须是 Role 或 ClusterRole)
  11.   kind: Role
  12.   # 引用的角色名称
  13.   name: custom-role
  14. # 被授权的主体列表
  15. subjects:
  16. # 主体类型(User/ServiceAccount/Group)
  17. - kind: User
  18.   # 主体名称,对应生成证书的CN字段
  19.   name: develop
  20.   #APIGroup 默认是 "rbac.authorization.k8s.io"。这意味着这些权限规则默认只适用于 #RBAC API 资源,例如 Role、RoleBinding、ClusterRole 和 ClusterRoleBinding。
  21.   apiGroup: "rbac.authorization.k8s.io"
  22. [root@master ~/role]# cat rolebinding-develop.yaml
  23. apiVersion: rbac.authorization.k8s.io/v1
  24. kind: RoleBinding
  25. metadata:
  26.   # RoleBinding 名称
  27.   name: develope-rolebinding
  28.   # 作用的命名空间
  29.   namespace: default
  30. roleRef:
  31.   apiGroup: rbac.authorization.k8s.io
  32.   # 引用的角色类型(必须是 Role 或 ClusterRole)
  33.   kind: Role
  34.   # 引用的角色名称
  35.   name: custom-role
  36. # 被授权的主体列表
  37. subjects:
  38. # 主体类型(User/ServiceAccount/Group)
  39. - kind: User
  40.   # 主体名称,对应生成证书的CN字段
  41.   name: develop
  42.   #APIGroup 默认是 "rbac.authorization.k8s.io"。这意味着这些权限规则默认只适用于 #RBAC API 资源,例如 Role、RoleBinding、ClusterRole 和 ClusterRoleBinding。
  43.   apiGroup: "rbac.authorization.k8s.io"
  44. # 创建RoleBinding
  45. [root@master ~/role]# kubectl apply -f rolebinding-develop.yaml
  46. # 查看RoleBinding
  47. rolebinding.rbac.authorization.k8s.io/develope-rolebinding created
  48. [root@master ~/role]# kubectl get rolebinding
  49. NAME                   ROLE                      AGE
  50. develope-rolebinding   Role/custom-role          11s
  51. # 查看详情
  52. [root@master ~/role]# kubectl describe rolebinding develope-rolebinding
  53. Name:         develope-rolebinding
  54. Labels:       <none>
  55. Annotations:  <none>
  56. Role:
  57.   Kind:  Role
  58.   Name:  custom-role
  59. Subjects:
  60.   Kind  Name     Namespace
  61.   ----  ----     ---------
  62.   User  develop
复制代码
再次使用User测试

查看Pod有权限
  1. [root@master ~/role]# kubectl get po --kubeconfig=/root/cfssl/develop.kubeconfig
  2. NAME                                                     READY   STATUS    RESTARTS   AGE
  3. alertmanager-prometheus-kube-prometheus-alertmanager-0   2/2     Running   0          21h
  4. nginx-pod                                                0/1     Pending   0          6d16h
  5. prometheus-grafana-55cbbf54b7-lmhnd                      3/3     Running   0          20h
  6. prometheus-kube-prometheus-operator-847fd659bc-scp4w     1/1     Running   0          21h
  7. prometheus-kube-state-metrics-5fb66759db-nb242           1/1     Running   0          21h
  8. prometheus-prometheus-kube-prometheus-prometheus-0       2/2     Running   0          16h
  9. prometheus-prometheus-node-exporter-89xt7                1/1     Running   0          21h
  10. prometheus-prometheus-node-exporter-cn8s4                1/1     Running   0          21h
  11. prometheus-prometheus-node-exporter-llqgx                1/1     Running   0          21h
复制代码
删除Pod无权限
  1. [root@master ~/role]# kubectl delete po nginx-pod --kubeconfig=/root/cfssl/develop.kubeconfig
  2. Error from server (Forbidden): pods "nginx-pod" is forbidden: User "develop" cannot delete resource "pods" in API group "" in the namespace "default"
复制代码
删除Pod需要添加对应的权限
  1. # 修改Role
  2. [root@master ~/role]# cat role-default.yaml
  3. apiVersion: rbac.authorization.k8s.io/v1
  4. kind: Role
  5. metadata:
  6.   namespace: default
  7.   name: custom-role
  8. rules:
  9. - apiGroups: ["","apps"]
  10.   resources: ["pods","deployments"]
  11.   # 添加delete
  12.   verbs: ["get", "list","delete"]
  13. - apiGroups: ["","apps"]
  14.   resources: ["configmaps","secrets","daemonsets"]
  15.   verbs: ["get", "list"]
  16. - apiGroups: [""]
  17.   resources: ["secrets"]
  18.   verbs: ["delete","create"]
  19. # 重新应用
  20. [root@master ~/role]# kubectl apply -f role-default.yaml
  21. role.rbac.authorization.k8s.io/custom-role configured
复制代码
重新测试删除Pod
  1. [root@master ~/role]# kubectl delete po nginx-pod --kubeconfig=/root/cfssl/develop.kubeconfig
  2. pod "nginx-pod" deleted # 这里显示正常
复制代码
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

您需要登录后才可以回帖 登录 | 立即注册