袁党生博客

  • 主页
  • linux基础
  • SHELL
  • WEB
  • 负载
  • 企业级应用
  • 数据库
  • KVM
  • Docker
  • K8S
  • 监控
  • 存储
  • 博客搭建问题
  1. 首页
  2. K8S
  3. 正文

十三、kubernetes准入控制

2023年8月24日 1594点热度 0人点赞 0条评论


本章概述

  • Kubernetes API 鉴权流程
  • Kubernetes API 鉴权类型
  • 准入控制示例

13.1 Kubernetes API 鉴权流程:

1、身份验证:
  kubernetes API-Server验证客户端身份是不是合法的service account账户,如果不是则API服务器直接返回错误状态码401并终止请求。此步骤会检查头部报文和客户端证书,如:client certificates,password,tokens
  集群认证证书文件默认在用户家目录下的.kube/config,如root用户文件路径为:/root/.kube/config,为安全考虑,有些集群可能会更改证书文件路径,可以通过指定证书文件访问k8s集群。如:kubectl get pod --kubeconfig=/root/.kube/config
2、鉴权:
  如果请求者有效,API服务器继续验证客户端是否有权限执行其当前的请求操作,如果请求者未经授权则API服务器返回错误403并终止请求。此步骤会检测Policy与verbs,如get、delete等
3、准入控制:
  如果客户端权限验证通过,则API服务器的准入控制器判断请求是否被允许执行。
  此步骤由控制器检测权限,如DenyExecOnPrivileged、LimitRanger等。

13.2 Kubernetes API 鉴权类型:

官网链接:https://kubernetes.io/zh/docs/reference/access-authn-authz/authorization
常用的两种:Node和RBAC
1、Node(节点鉴权):针对kubelet发出的API请求进行鉴权。
  授予node节点的kubelet读取services、endpoints、secrets、configmaps等事件状态,并向API server更新pod与node状态。
  查看k8s配置文件,默认开启Node和RBAC

2、Webhook: 是一个HTTP回调,发生某些事情时调用的HTTP调用。

# Kubernetes API 版本
apiVersion: v1
# API 对象种类
kind: Config
# clusters 代表远程服务。
clusters:
- name: name-of-remote-authz-service
cluster:
# 对远程服务进行身份认证的 CA。
certificate-authority: /path/to/ca.pem
# 远程服务的查询 URL。必须使用 'https'。
server: https://authz.example.com/authorize

3、ABAC(Attribute-based access control ):基于属性的访问控制,1.6之前使用,将属性与账户直接绑定。

{"apiVersion": "abac.authorization.kubernetes.io/v1beta1", "kind": "Policy", "spec": {"user": "user1", "namespace": "*", "resource": "*","apiGroup": "*"}}   #用户user1对所有namespace所有API版本的所有资源拥有所有权限((没有设置"readonly": true)。

{"apiVersion": "abac.authorization.kubernetes.io/v1beta1", "kind": "Policy", "spec": {"user": "user2", "namespace": "myserver", "resource":"pods", "readonly": true}}   #用户user2对namespace myserver的pod有只读权限。

--authorization-mode=...,RBAC,ABAC --authorization-policy-file=mypolicy.json   #通过修改配置文件开启ABAC参数

4、RBAC(Role-Based Access Control):基于角色的访问控制,将权限与角色(role)先进行关联,然后将角色与用户进行绑定(Binding)从而继承角色中的权限。
  RBAC API声明了四种Kubernetes对象:Role、ClusterRole、RoleBinding和ClusterRoleBinding。
  Role: 定义一组规则,用于访问命名空间中的 Kubernetes 资源。
  RoleBinding: 定义用户和角色(Role)的绑定关系。
  ClusterRole: 定义了一组访问集群中 Kubernetes 资源(包括所有命名空间)的规则。
  ClusterRoleBinding: 定义了用户和集群角色(ClusterRole)的绑定关系。

13.3 准入控制示例

13.3.1 通过token登录dashboard

示例:创建magedu-user账号,具有magedu namespace的权限
1、指定namespace创建账号
kubectl create serviceaccount magedu-user -n magedu
查看账号:

2、创建role规则

vim  magedu-role.yaml
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  namespace: magedu    #角色所在namespace,要和目标pod保持一致
  name: magedu-role     #指定角色名称
rules:
- apiGroups: ["*"]              #资源对象的API版本,空表示所有版本
  resources: ["pods/exec"]       #目标资源对象为pod可执行的命令
  #verbs: ["*"]
  ##RO-Role
  verbs: ["get", "list", "watch", "create"]    #定义上述资源对象的权限

- apiGroups: ["*"]
  resources: ["pods"]         #目标资源对象为pod
  #verbs: ["*"]
  ##RO-Role
  verbs: ["get", "list", "watch"]        #定义上述资源对象的权限

- apiGroups: ["apps/v1"]
  resources: ["deployments"]       #目标资源对象为deployment控制器
  #verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]
  ##RO-Role
  verbs: ["get", "watch", "list"]       #定义上述资源对象的权限

创建role
kubectl apply -f magedu-role.yaml
查看role

3、创建role-binding,将role规则和用户进行绑定

vim  magedu-role-bind.yaml
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: role-bind-magedu
  namespace: magedu
subjects:
- kind: ServiceAccount
  name: magedu-user       #指定要绑定的账号
  namespace: magedu
roleRef:
  kind: Role
  name: magedu-role       #指定要绑定的role规则
  apiGroup: rbac.authorization.k8s.io

创建role-binding
kubectl apply -f magedu-role-bind.yaml
查看role-binding
kubectl get rolebindings.rbac.authorization.k8s.io -n magedu
kubectl describe rolebindings.rbac.authorization.k8s.io role-bind-magedu -n magedu

4、获取token
(1)查看magedu namespace下的secrets
kubectl get secrets -n magedu #magedu-user即为刚创建的账号secrets

(2)获取secrets中的token信息
kubectl describe secrets magedu-user-token-nr5xg -n magedu

5、登录dashboard
复制token信息,通过magedu-user用户登录dashboard
(1)在k8s集群查看dashboard地址,进行访问,然后输入token

(2)登录以后只能访问default namespace下的资源,要想访问magedu namespace下的资源,需要修改浏览器url路径中的namespace(将default更改为magedu即可)

可以正常查看pod情况

注意:这里只能对pod进行"get", "list", "watch", "create"操作,对其他资源无法进行操作,也无法对其他namespace进行操作。
执行删除操作时,因为不具备删除权限,会报错:

以上生成的token,仅可以用来登录dashboard,如果想要进入集群执行命令,则需要生成kubeconfig文件,通过制定kubeconfig文件连接K8S集群执行命令

13.3.2 通过kubeconfig文件登录集群

1、创建csr文件
创建存放证书的目录
mkdir -p /root/yaml/20220522/RBAC-yaml-case
cd /root/yaml/20220522/RBAC-yaml-case
编辑yaml文件

vim  magedu-user-csr.json
{
  "CN": "China",
  "hosts": [],
  "key": {
    "algo": "rsa",
    "size": 2048
  },
  "names": [
    {
      "C": "CN",
      "ST": "BeiJing",
      "L": "BeiJing",
      "O": "k8s",
      "OU": "System"
    }
  ]
}

2、签发证书
这里需要用到cfssl来生成证书,如果没有安装需要进行安装,安装步骤参考4.2.3.2.2的第(4)步骤。

ln -sv /etc/kubeasz/bin/cfssl* /usr/bin/
cfssl gencert -ca=/etc/kubernetes/ssl/ca.pem  -ca-key=/etc/kubernetes/ssl/ca-key.pem -config=/etc/kubeasz/clusters/k8s-cluster1/ssl/ca-config.json  -profile=kubernetes magedu-user-csr.json | cfssljson -bare  magedu-user

参数说明:

-ca=/etc/kubernetes/ssl/ca.pem  #指定ca公钥证书,和k8s集群使用同一个ca证书
-ca-key=/etc/kubernetes/ssl/ca-key.pem   #指定ca私钥证书,和k8s集群使用同一个ca证书
-config=/etc/kubeasz/clusters/k8s-cluster1/ssl/ca-config.json  #指定k8s集群config文件
-profile=Kubernetes   #描述文件


查看生成的证书

3、生成普通用户kubeconfig文件
kubectl config set-cluster cluster1 --certificate-authority=/etc/kubernetes/ssl/ca.pem --embed-certs=true --server=https://172.31.7.188:6443 --kubeconfig=magedu-user.kubeconfig
参数说明:

cluster1     #k8s集群名称
--certificate-authority=/etc/kubernetes/ssl/ca.pem      #指定ca公钥
--embed-certs=true   #伪装证书,即通过base64加密
--server=https://172.31.7.188:6443   #api-server地址和端口,可以写VIP地址172.31.7.188
--kubeconfig=magedu-user.kubeconfig  #指定kubeconfig文件,会在当前目录下生成该文件

查看kubeconfig文件,已经生成证书,api-server地址,k8s集群名称,但其他字段为空,继续生成

4、设置客户端认证参数,将普通用户的公钥和私钥放入kubeconfig文件

# cp *.pem /etc/kubernetes/ssl/
# kubectl config set-credentials magedu-user \
--client-certificate=/etc/kubernetes/ssl/magedu-user.pem \
--client-key=/etc/kubernetes/ssl/magedu-user-key.pem \
--embed-certs=true \
--kubeconfig=./magedu-user.kubeconfig

参数说明:

magedu-user        #指定普通用户名称
--client-certificate=/etc/kubernetes/ssl/magedu-user.pem    #指定普通用户公钥
--client-key=/etc/kubernetes/ssl/magedu-user-key.pem     #指定普通用户私钥
--embed-certs=true       #证书伪装,进行base64加密
--kubeconfig=./magedu-user.kubeconfig           #指定kubeconfig文件

查看kubeconfig文件内容,普通用户信息已加入kubeconfig文件

5、设置上下文参数(多集群使用上下文区分)
官网链接:https://kubernetes.io/zh/docs/concepts/configuration/organize-cluster-access-kubeconfig/
命令如下:

#kubectl config set-context cluster1 \
--cluster=cluster1 \
--user=magedu-user \
--namespace=magedu \
--kubeconfig=./magedu-user.kubeconfig

参数说明:

--cluster=cluster1    #指定设置上下文的集群名称
--user=magedu-user        #指定普通用户名称
--namespace=magedu      #指定普通用户可以访问的namespace
--kubeconfig=./magedu-user.kubeconfig          #指定kubeconfig文件

查看kubeconfig文件

6、设置默认上下文
kubectl config use-context cluster1 --kubeconfig=./magedu-user.kubeconfig

7、获取token:
kubectl get secrets -n magedu | grep magedu
kubectl describe secrets magedu-token-8d897 -n magedu

kubectl describe secrets magedu-user-token-nr5xg -n magedu

token如下所示:

eyJhbGciOiJSUzI1NiIsImtpZCI6Ii05ZmctQVVKcEdaLXpuN2pCUHg4WXloNEJYbVNPR1JpVEVhQTNmTUw1SkkifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJtYWdlZHUiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlY3JldC5uYW1lIjoibWFnZWR1LXVzZXItdG9rZW4tbnI1eGciLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoibWFnZWR1LXVzZXIiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC51aWQiOiI5NjFhM2YwMS1kYjNhLTQ5MmYtYWNiOS0zODAzNjFmM2RhMDciLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6bWFnZWR1Om1hZ2VkdS11c2VyIn0.BVuVUCFJrxAA5GoZEXD2euMpixkb3lQ-Tqctif-N4B8_TakLMOZAJbZr4MA-cEdCyFPiXnKpI-kdf1HNnUajy0uIp8avYql-dzhSyI2pKft2aklT7kUAWvdIH9E2YIpMO7jq4VJSx5v7PiVHUL4wvBKwL9V3TcnqUCqb6_ANy5oTcGgomd7lMs4x4mgqFQf6hcnbUwkcXNbQq9QF0tf4xgXiSqNX27j0DiUXkrcDKvG8Kr7Jv0eeWZyfgy-2r9d5RG2Y1Cv2kptmq6ATAtxoU5wxQoyGpwNWtz0V_WRMXhGpuP4BXybLMdA3tneUfVTcLlxGjLj0lcH4D2IhG9LiJQ

8、将token写入用户kube-config文件:
将token复制到magedu-user.kubeconfig文件最后
注意:json文件对格式要求严格,注意缩进(token前要缩进四个字符,按四下空格)

将magedu-user.kubeconfig文件导出,传递到需要登录dashboard的主机上

9、dashboard登录测试:
浏览器输入https://172.31.7.111:30004/#/login

选择magedu-user.kubeconfig文件
进入dashboard控制台,默认就是magedu,无需手动更改

标签: k8s
最后更新:2023年8月24日

袁党生

这个人很懒,什么都没留下

点赞
< 上一篇
下一篇 >

文章评论

razz evil exclaim smile redface biggrin eek confused idea lol mad twisted rolleyes wink cool arrow neutral cry mrgreen drooling persevering
取消回复

COPYRIGHT © 2023 linux学习. ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang

豫ICP备18039507号-1