• K8S的安全机制


    引言


    Kubernetes 作为一个分布式集群的管理工具,保证集群的安全性是其一个重要的任务。API Server 是集群内部各个组件通信的中介, 也是外部控制的入口。所以 Kubernetes 的安全机制基本就是围绕保护 API Server 来设计的。
    比如 kubectl 如果想向 API Server 请求资源,需要过三关,第一关是认证(Authentication),第二关是鉴权(Authorization), 第三关是准入控制(Admission Control),只有通过这三关才可能会被 K8S 创建资源。

    一、K8S安全框架介绍

    • 访问K8S集群的资源需要过三关:认证、鉴权、准入控制 
    • 普通用户若要安全访问集群API Server,往往需要证书、 Token或者用户名+密码;Pod访问,需要ServiceAccount 
    • K8S安全控制框架主要由下面3个阶段进行控制,每一个阶段 都支持插件方式,通过API Server配置来启用插件。

         1. Authentication:用于识别用户身份, 方式有: SSL证书,token, 用户名+密码等

          2. Authorization:确认是否对资源具有相关的权限

          3. Admission Control: 判断操作是否符合集群的要求

    当kubectl ,ui,程序 等请求某个 k8s 接口,先认证(判断真伪),鉴权(是否有权限这么做?),

    准入控制(能不能个这么干?)

     二、认证(Authentication)

    三种客户端身份认证:

    • HTTPS 证书认证:基于CA证书签名的数字证书认证

          kube-apiserver      

          etcd  

          kubelet 连接kube-apiserver

          kube-proxy连接 kube-apiserver

          均采用 https传输方式

    • HTTP Token认证:通过一个Token来识别用户

    客户端携带一个token来请求server端,如果server端含有这个token,那么认证成功否则失败

    • HTTP Base认证:用户名+密码的方式认证

    比较原始的方式,在k8s中基本很少使用

    三、授权鉴权(Authorization)

    RBAC(Role-Based Access Control,基于角色的访问控制):

    负责完成授权(Authorization)工作。

    根据API请求属性,决定允许还是拒绝。

    • user:用户名
    • group:用户分组
    • extra:用户额外信息
    • API • 请求路径:例如/api,/healthz • API请求方法:get,list,create,update,patch,watch,delete
    • HTTP请求方法:get,post,put,delete
    • 资源
    • 子资源 
    • 命名空间
    • API组

    四、准入控制(Adminssion Control)

    Adminssion Control实际上是一个准入控制器插件列表,发送到API Server的请求都需要经过这个列表中的每个准入控制器 插件的检查,检查不通过,则拒绝请求。

    五、使用RBAC授权

    RBAC(Role-Based Access Control,基于角色的访问控制),允许通过Kubernetes API动态配置策略。

    • 角色 

    • Role:授权特定命名空间的访问权限
    • ClusterRole:授权所有命名空间的访问权限

    • 角色绑定

    • RoleBinding:将角色绑定到主体(即subject)
    • ClusterRoleBinding:将集群角色绑定到主体

    • 主体(subject) 

    • User:用户
    • Group:用户组
    • ServiceAccount:服务账号

    用户或者用户组,服务账号,与具备某些权限的角色绑定,然后将该角色的权限继承过来,这一点类似阿里云的 ram 授权。这里需要注意 定义的角色是 Role作用域只能在指定的名称空间下有效,如果是ClusterRole可作用于所有名称空间下。

    Rolebinding 和Role 对应,ClusterRoleBinding 和 ClusterRole 对应。

    六、RABC示例 

    示例:为benjamin用户授权default命名空间Pod读取权限

    1. 用K8S CA签发客户端证书

    2. 生成kubeconfig授权文件

    3. 创建RBAC权限策略

    6.1 通过CA证书生成自签证书

    1. mkdir /root/benjamin
    2. sh cert.sh
    3. cat > ca-config.json <
    4. {
    5. "signing": {
    6. "default": {
    7. "expiry": "87600h"
    8. },
    9. "profiles": {
    10. "kubernetes": {
    11. "usages": [
    12. "signing",
    13. "key encipherment",
    14. "server auth",
    15. "client auth"
    16. ],
    17. "expiry": "87600h"
    18. }
    19. }
    20. }
    21. }
    22. EOF
    23. cat > benjamin-csr.json <
    24. {
    25. "CN": "benjamin",
    26. "hosts": [],
    27. "key": {
    28. "algo": "rsa",
    29. "size": 2048
    30. },
    31. "names": [
    32. {
    33. "C": "CN",
    34. "ST": "BeiJing",
    35. "L": "BeiJing",
    36. "O": "k8s",
    37. "OU": "System"
    38. }
    39. ]
    40. }
    41. EOF
    42. cfssl gencert -ca=/opt/kubernetes/ssl/ca.pem -ca-key=/opt/kubernetes/ssl/ca-key.pem -config=ca-config.json -profile=kubernetes benjamin-csr.json | cfssljson -bare benjami

    通过指定的ca配置生成 benjamin-key.pem  benjamin.pem

    6.2 生成kubeconfig授权文件

    1. cd /root/benjamin
    2. sh config.sh
    3. kubectl config set-cluster kubernetes \
    4. --certificate-authority=/opt/kubernetes/ssl/ca.pem \
    5. --embed-certs=true \
    6. --server=https://192.168.31.63:6443 \
    7. --kubeconfig=benjamin.kubeconfig
    8. # 设置客户端认证
    9. kubectl config set-credentials benjamin \
    10. --client-key=benjamin-key.pem \
    11. --client-certificate=benjamin.pem \
    12. --embed-certs=true \
    13. --kubeconfig=benjamin.kubeconfig
    14. # 设置默认上下文
    15. kubectl config set-context kubernetes \
    16. --cluster=kubernetes \
    17. --user=benjamin \
    18. --kubeconfig=benjamin.kubeconfig
    19. # 设置当前使用配置
    20. kubectl config use-context kubernetes --kubeconfig=benjamin.kubeconfig

    执行 config.sh 生成benjamin.kubeconfig

    6.3 创建RABC授权

    1. kind: Role
    2. apiVersion: rbac.authorization.k8s.io/v1
    3. metadata:
    4. namespace: default
    5. name: pod-reader
    6. rules:
    7. - apiGroups: [""]
    8. resources: ["pods"]
    9. verbs: ["get", "watch", "list"]
    10. ---
    11. kind: RoleBinding
    12. apiVersion: rbac.authorization.k8s.io/v1
    13. metadata:
    14. name: read-pods
    15. namespace: default
    16. subjects:
    17. - kind: User
    18. name: benjamin
    19. apiGroup: rbac.authorization.k8s.io
    20. roleRef:
    21. kind: Role
    22. name: pod-reader
    23. apiGroup: rbac.authorization.k8s.io

    6.4 验证

    将master节点的kubectl 命令分发到node节点

    scp /usr/bin/kubectl 192.168.161.12:/usr/bin/

    如果不指定 kubeconfig 文件的时候发现 查看不了

    指定授权后的kubeconfig文件 可以查看你default名称空间下的 pod资源

    查看default 名称空间下pod的日志发现也是不可以

    但是却不能访问非 default 名称空间下的pod,和所有名称空间下的其他资源,因为授权查看的资源只有default名称空间下的pod资源。

    增加权限验证

    根据上面的rabc.yaml 增加resources 列表 查看pod日志和查看service的权限

    重新应用配置  kubectl  apply -f rabc.yaml

    重新配置后:

    可以查看default 空间下pod日志

    可以查看default空间下service

    如何让自定义授权文件成为默认文件?

     cp benjamin.kubeconfig /root/.kube/config

    如果没有  .kube 目录就创建一个,这样就会读取默认配置文件  /root/.kube/config 

    7、官网链接

    Using RBAC Authorization | Kubernetes

    总结:

    你与日月齐光,明动四方

  • 相关阅读:
    基于Java的汽车维修预约管理系统设计与实现(源码+lw+部署文档+讲解等)
    ROSCon 2023 大会回顾
    儿童写作业用的护眼灯哪种好?双十一写作业护眼灯推荐
    小谈设计模式(29)—访问者模式
    Linux查看哪些进程占用的系统 buffer/cache 较高 (hcache,lsof)命令
    pytorch中Tensor(张量)
    [工业互联-2]:工业有线互联总线之CAN总线
    三网话费接口API文档
    java计算机毕业设计智能道路交通管理系统源代码+系统+数据库+lw文档
    NLP工具再汇总
  • 原文地址:https://blog.csdn.net/L2111533547/article/details/126215167