• 第13章:Kubernetes 鉴权框架与用户权限分配


    1.Kubernetes的安全框架

    • 访问K8S集群的资源需要过三关:认证、鉴权、准入控制

    • 普通用户若要安全访问集群API Server,往往需要证书、Token或者用户名+密码;Pod访问,需要ServiceAccount

    • K8S安全控制框架主要由下面3个阶段进行控制,每一个阶段都支持插件方式,通过API Server配置来启用插件。

    访问API资源要经过以下三关才可以:

    1. Authentication(鉴权)

    2. Authorization(授权)

    3. Admission Control(准入控制)

    k8s-security

    2.传输安全,认证,授权,准入控制

    传输安全:

    • 告别8080,迎接6443(http://172.16.1.70:6443/) Client sent an HTTP request to an HTTPS server.

    • 全面基于HTTPS通信

    鉴权:三种客户端身份认证:

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

      [root@k8s-admin ~]# ls /etc/kubernetes/pki/ [root@k8s-admin ~]# ls -l /root/.kube/config -rw------- 1 root root 5451 Apr 24 18:40 /root/.kube/config

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

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

    授权:

    RBAC(Role-Based Access Control,基于角色的访问控制):负责完成授权(Authorization)工作。

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

    准入控制:

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

    3.使用RBAC授权

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

    角色

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

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

    角色绑定

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

    • ClusterRoleBinding:将集群角色绑定到主体

    主体(subject)

    • User:用户

    • Group:用户组

    • ServiceAccount:服务账号

    rbac

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

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

    # tar -xzf cfssl.tar.gz
    # cp -a cfssl/* /usr/bin/


    # cat cert.sh
    cat > ca-config.json <<EOF
    {
      "signing": {
        "default": {
          "expiry": "87600h"
        },
        "profiles": {
          "kubernetes": {
            "usages": [
                "signing",
                "key encipherment",
                "server auth",
                "client auth"
            ],
            "expiry": "87600h"
          }
        }
      }
    }
    EOF
    
    cat > lc-csr.json <<EOF
    {
      "CN": "lc",
      "hosts": [],
      "key": {
        "algo": "rsa",
        "size": 2048
      },
      "names": [
        {
          "C": "CN",
          "ST": "BeiJing",
          "L": "BeiJing",
          "O": "k8s",
          "OU": "System"
        }
      ]
    }
    EOF
    
    cfssl gencert -ca=/etc/kubernetes/pki/ca.crt -ca-key=/etc/kubernetes/pki/ca.key -config=ca-config.json -profile=kubernetes lc-csr.json | cfssljson -bare lc

    # sh cert.sh
    生成如下文件
    ca-config.json lc.csr lc-csr.json lc-key.pem lc.pem

    2、生成kubeconfig授权文件

     
    # cat config.sh
    kubectl config set-cluster kubernetes 
      --certificate-authority=/etc/kubernetes/pki/ca.crt 
      --embed-certs=true 
      --server=https://172.16.1.70:6443 
      --kubeconfig=lc.kubeconfig
    
    # 设置客户端认证
    kubectl config set-credentials lc 
      --client-key=lc-key.pem 
      --client-certificate=lc.pem 
      --embed-certs=true 
      --kubeconfig=lc.kubeconfig
    
    # 设置默认上下文
    kubectl config set-context kubernetes 
      --cluster=kubernetes 
      --user=lc 
      --kubeconfig=lc.kubeconfig
    
    # 设置当前使用配置
    kubectl config use-context kubernetes --kubeconfig=lc.kubeconfig
    
    
    # sh config.sh
    会生成 lc.kubeconfig 文件

    3、创建RBAC权限策略

    # cat rbac.yaml
    ---
    # 创建角色(权限集合)
    kind: Role
    apiVersion: rbac.authorization.k8s.io/v1
    metadata:
      namespace: default
      name: pod-reader
    rules:
    - apiGroups: [""]
      resources: ["pods"]
      verbs: ["get", "watch", "list"]
    
    ---
    # 将lc用户绑定到角色
    kind: RoleBinding
    apiVersion: rbac.authorization.k8s.io/v1
    metadata:
      name: read-pods
      namespace: default
    subjects:
    - kind: User
      name: lc
      apiGroup: rbac.authorization.k8s.io
    roleRef:
      kind: Role
      name: pod-reader
      apiGroup: rbac.authorization.k8s.io
      
      
    # kubectl apply -f rbac.yaml
    # 具体的角色权限可以参考官网rbac相关文档:https://kubernetes.io/zh/docs/reference/access-authn-authz/rbac/

    4、测试

    # kubectl get Role
    NAME         AGE
    pod-reader   7m46s

    # kubectl get RoleBinding
    NAME       AGE
    read-pods   7m49s

    # kubectl --kubeconfig=lc.kubeconfig get pods
    NAME                     READY   STATUS   RESTARTS   AGE
    nginx-86c57db685-rrhzp   1/1     Running   1         28d

    # kubectl --kubeconfig=lc.kubeconfig get pods -n kube-system
    Error from server (Forbidden): pods is forbidden: User "lc" cannot list resource "pods" in API group "" in the namespace "kube-system"
    # lc用户只有访问default命名空间Pod读取权限。

  • 相关阅读:
    PAT B1021 个位数统计 (15)
    PAT B1006 换个格式输出整数 (15)
    PAT A1058 A+B in Hogwarts (20)
    PAT A1027 Colors in Mars (20)
    PAT A1019 General Palindromic Number (20 分)
    PAT B1022 D进制的A+B
    J2EE
    MVC
    数据库长连接短连接
    twisted
  • 原文地址:https://www.cnblogs.com/LiuChang-blog/p/14800682.html
Copyright © 2020-2023  润新知