• k8s--基础--23.3--认证-授权-准入控制--授权


    k8s–基础–23.3–认证-授权-准入控制–授权


    1、介绍

    Kubernetes的授权是基于插件形式的,其常用的授权插件有以下几种
    1. Node(节点认证)
    2. ABAC(基于属性的访问控制)
    3. RBAC(基于角色的访问控制)
    4. Webhook(基于http回调机制的访问控制)

    1.1、什么是RBAC(基于角色的访问控制)?

    1. 就是给用户(Users)授予一个角色(Role),那么这个用户就有这个角色的权限。
    2. Role是有名称空间的限制的

    在这里插入图片描述

    1.1、RBAC工作逻辑

    1. 给用户(Users)授予一个角色(Role),那么这个用户就有这个角色的权限。
    2. 授权方式有2种
      1. 名称空间级别 的授权
      2. 集群级别 的授权

    1.1.1、名称空间级别 的授权

    如果通过rolebinding绑定role,只能对rolebingding所在的名称空间的资源有权限,上图user1这个用户绑定到role1上,只对role1这个名称空间的资源有权限,对其他名称空间资源没有权限,这个属于名称空间级别的授权。

    1.1.2、集群级别的授权机制

    1. 集群角色(ClusterRole):可以认为是角色组的概念,就是一组角色
    2. 定义一个集群角色(ClusterRole),对集群内的所有资源都有可操作的权限
      1. 将User2通过ClusterRoleBinding到ClusterRole,使User2拥有集群的操作权限
    3. 对资源的访问,没有名称空间的限制

    1.2、Role、RoleBinding、ClusterRole和ClusterRoleBinding的关系如下图:

    在这里插入图片描述

    1.2.1、通过上图可以看到,3种绑定

    1. 用户通过 rolebinding绑定role
    2. 用户通过 clusterrolebinding绑定clusterrole
    3. 用户通过 rolebinding绑定clusterrole

    1.4、ClusterRole的好处

    1. 假如有6个名称空间,每个名称空间的用户都需要对自己的名称空间有管理员权限,那么需要定义6个role和rolebinding,然后依次绑定,如果名称空间更多,我们需要定义更多的role,这个是很麻烦的,所以我们引入clusterrole,定义一个clusterrole,对clusterrole授予所有权限,然后用户通过rolebinding绑定到clusterrole,就会拥有自己名称空间的管理员权限了,这样就减少了很多工作量。
    2. 注:RoleBinding仅仅对当前名称空间有对应的权限。

    2、授权机制

    1. k8s中的授权策略也支持开启多个授权插件,只要一个验证通过即可。
    2. k8s授权处理主要是根据以下请求属性:
      1. user, group, extra
      2. API、请求方法(如get、post、update、patch和delete)和请求路径(如/api)
      3. 请求资源和子资源
      4. Namespace
      5. API Group
    3. k8s支持的授权模式
      1. Node Authorization
      2. ABAC Authorization
      3. RBAC Authorization
      4. Webhook Authorization

    2.1、Node Authorization

    通过配合NodeRestriction control准入控制插件来限制kubelet访问node,endpoint、pod、service以及secret、configmap、PV和PVC等相关的资源。

    2.1.1、配置方式

    –authorization-mode=Node,RBAC –admission-control=…,NodeRestriction,…
    
    
    • 1
    • 2

    2.2、ABAC Authorization

    这种模式的实现相对比较生硬,就是在master node保存一份policy文件,指定不同用户(或用户组)对不同资源的访问权限,当修改该文件后,需要重启apiserver,跟openstack 的ABAC类似。policy文件的格式如下:

    
    # Alice can do anything to all resources:
    {
        "apiVersion": "abac.authorization.kubernetes.io/v1beta1",
        "kind": "Policy",
        "spec": {
            "user": "alice",
            "namespace": "*",
            "resource": "*",
            "apiGroup": "*"
        }
    }
    # Kubelet can read any pods:
    {
        "apiVersion": "abac.authorization.kubernetes.io/v1beta1",
        "kind": "Policy",
        "spec": {
            "user": "kubelet",
            "namespace": "*",
            "resource": "pods",
            "readonly": true
        }
    }
    
    # Kubelet can read and write events:
    {
        "apiVersion": "abac.authorization.kubernetes.io/v1beta1",
        "kind": "Policy",
        "spec": {
            "user": "kubelet",
            "namespace": "*",
            "resource": "events"
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35

    2.2.1、使用这种模式需要配置参数

    –authorization-mode=ABAC –authorization-policy-file=SOME_FILENAME。
    
    • 1

    2.3、RBAC Authorization

    1. 通过启动参数使用RBAC:–authorization-mode=RBAC
    2. 使用kubeadm安装k8s默认会enabled。
    3. BAC API定义了四个资源对象用于描述RBAC中用户和资源之间的连接权限
      1. Role
      2. ClusterRole
      3. RoleBinding
      4. ClusterRoleBinding
    4. Role是定义在某个Namespace下的资源,在这个具体的Namespace下使用。
      1. ClusterRole与Role相似,只是ClusterRole是整个集群范围内使用的。
      2. RoleBinding把Role绑定到账户主体Subject,让Subject继承Role所在namespace下的权限。
      3. ClusterRoleBinding把ClusterRole绑定到Subject,让Subject集成ClusterRole在整个集群中的权限。
    5. API Server已经创建一系列ClusterRole和ClusterRoleBinding。
      1. 这些资源对象中名称以system:开头的,表示这个资源对象属于Kubernetes系统基础设施,也就说RBAC默认的集群角色已经完成足够的覆盖,让集群可以完全在 RBAC的管理下运行。
      2. 修改这些资源对象可能会引起未知的后果,例如
        1. 对于system:node这个ClusterRole定义了kubelet进程的权限,如果这个角色被修改,可能导致kubelet无法工作。

    2.3.1、通过命令获取对应的Role相关资源进行增删改查

    kubectl get roles --all-namespaces
    
    kubectl get ClusterRoles
    
    kubectl get rolebinding --all-namespaces
    
    kubectl get clusterrolebinding
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    内容

    [root@master1 test5]# kubectl get roles --all-namespaces
    NAMESPACE              NAME                                             CREATED AT
    kube-public            kubeadm:bootstrap-signer-clusterinfo             2022-03-19T02:06:49Z
    kube-public            system:controller:bootstrap-signer               2022-03-19T02:06:47Z
    kube-system            extension-apiserver-authentication-reader        2022-03-19T02:06:47Z
    kube-system            kube-proxy                                       2022-03-19T02:06:49Z
    kube-system            kubeadm:kubelet-config-1.18                      2022-03-19T02:06:47Z
    kube-system            kubeadm:nodes-kubeadm-config                     2022-03-19T02:06:47Z
    kube-system            system::leader-locking-kube-controller-manager   2022-03-19T02:06:47Z
    kube-system            system::leader-locking-kube-scheduler            2022-03-19T02:06:47Z
    kube-system            system:controller:bootstrap-signer               2022-03-19T02:06:47Z
    kube-system            system:controller:cloud-provider                 2022-03-19T02:06:47Z
    kube-system            system:controller:token-cleaner                  2022-03-19T02:06:47Z
    kubernetes-dashboard   kubernetes-dashboard                             2022-03-19T13:40:13Z
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    2.4、Webhook Authorization

    1. 用户在外部提供 HTTPS 授权服务,然后配置 apiserver 调用该服务去进行授权。
    2. 参考官方文档
      1. https://kubernetes.io/docs/reference/access-authn-authz/webhook/

    2.4.1、apiserver配置参数:

    –authorization-webhook-config-file=SOME_FILENAME
    
    • 1

    3、kubernetes 中的认证机制

    1. kubernetes 支持多种认证机制,可以配置成多个认证体制共存,这样,只要有一个认证通过,这个request就认证通过了。下面介绍官网列举的几种常见认证机制
    2. 参考资料:https://kubernetes.io/docs/reference/access-authn-authz/authentication/

    3.1、Service Account Tokens

    1. Service Account Token 是一种比较特殊的认证机制
    2. 适用于上文中提到的pod内部服务需要访问apiserver的认证情况
    3. 默认enabled。

    3.1.1、启动参数文件

    –service-account-key-file=/etc/kubernetes/pki/apiserver-key.pem
    
    • 1
    1. 有启动参数文件,就使用启动参数文件
    2. 没有启动参数文件,默认使用–tls-private-key-file的值,即API Server的私钥。

    3.1.2、验证

    # 获取所有名称空间的sa账号
    kubectl get serviceaccount --all-namespaces
    
    • 1
    • 2

    在这里插入图片描述

    可以看到k8s集群为所有的namespace创建了一个默认的service account,利用命令describe会发现service account只是关联了一个secret作为token,也就是service-account-token。

    
    kubectl describe serviceaccount/default -n kube-system
    
    • 1
    • 2

    在这里插入图片描述

    
    kubectl get secret default-token-7xqxg -o yaml -n kube-system
    
    • 1
    • 2

    在这里插入图片描述

    可以看到service-account-token的secret资源包含的数据有三部分:

    1. ca.crt:

      1. API Server的CA公钥证书
      2. 用于Pod中的Process对API Server的服务端数字证书进行校验时使用的;
    2. namespace:

      1. Secret所在namespace的值的base64编码: echo -n “kube-system”|base64
      2. 在这里插入图片描述
    3. token:

      1. 该token就是由service-account-key-file的值签署(sign)生成。
      2. 这种认证方式主要由k8s集群自己管理,用户用到的情况比较少。
      3. 我们创建一个pod时,默认就会将该namespace对应的默认service account token mount到Pod中,所以无需我们操作便可以直接与apiserver通信

    3.2、OpenID Connect Tokens

    类似 OAuth2的认证方式,大致认证过程如下:

    在这里插入图片描述

  • 相关阅读:
    周赛371(模拟、哈希+排序+枚举)
    Java项目房屋租赁系统(java+SSM+Layui+JSP+mysql)
    音视频转换器 Permute 3 for mac中文
    css如何将border线加到元素内部,占内边距,不占外边距
    .NET轻松实现支付宝服务窗网页授权并获取用户相关信息
    恭喜元宇宙产业委秘书长何超、执行秘书长武艳芳成为南京河西CBD发展大使
    如何理解电商云仓出租?
    Python花瓣雨
    java计算机毕业设计校园二手交易平台源码+系统+mysql数据库+lw文档+部署
    长篇图解java反射机制及其应用场景
  • 原文地址:https://blog.csdn.net/zhou920786312/article/details/126242304