美文网首页K8s
21.kubernetes(k8s)笔记 认证、授权与准入控制(

21.kubernetes(k8s)笔记 认证、授权与准入控制(

作者: Bigyong | 来源:发表于2021-12-28 07:11 被阅读0次

    目录
    概述
    1.kubernetes API访问控制
    2.认证 Authentication
    ServiceAccount令牌认证
    示例: 查看Pod 默认ServiceAccount及Secret

    概述:

    1. kubernetes API 访问控制
    官方文档:
    https://kubernetes.io/zh/docs/reference/access-authn-authz/controlling-access/
    kubernetes api分为:认证、授权、准入控制

    • 用户通过 kubectl、客户端库或者通过发送 REST 请求访问 API。 用户(自然人)和 Kubernetes 服务账户 都可以被授权进行 API 访问。 请求到达 API 服务器后会经过几个阶段,具体说明如图:


    • 首先看一下 Kubernetes API 请求的发起,请求的发起分为两个部分:

    1. 第一个部分是人机交互的过程。 是大家非常熟悉的用 kubectl 对 apiserver 的一个请求过程 使用的是 Users Accounts普通账户;
    2. 第二个部分是 Pod 中的业务逻辑与 apiserver 之间的交互 使用的是Service Accounts 服务帐号。
    • 当我们的 apiserver 收到请求后,就会开启访问控制流程。这里面分为三个步骤:
    1. Authentication 认证阶段:判断请求用户是否为能够访问集群的合法用户。如果用户是个非法用户,那 apiserver会返回一个 401 的状态码,并终止该请求;
    2. 如果用户合法的话,我们的 apiserver 会进入到访问控制的第二阶段 Authorization:授权阶段。在该阶段中apiserver 会判断用户是否有权限进行请求中的操作。如果无权进行操作,apiserver 会返回 403的状态码,并同样终止该请求;
    3. 如果用户有权进行该操作的话,访问控制会进入到第三个阶段:AdmissionControl。在该阶段中 apiserver 的admission controller 会判断请求是否是一个安全合规的请求。如果最终验证通过的话,访问控制流程才会结束。

    此时我们的请求将会转换为一个 Kubernetes objects 相应的变更请求,最终持久化到 ETCD 中。

    认证(任意一种) -->授权(一般是rbac 和 node)–> 准入控制(自己选择)


    2. 认证 Authentication

    认证有多种,可以启动一种或多种认证方式,只要有一种认证方式通过,就不再对其它方式认证,通常启动X 509 Client Certs和Service Accout Tokens两种认证方式

    • 常见的认证:
    1. 引导令牌(Token) : 如:节点加入时认证:kubelet
    2. 静态令牌: 存储于API Server进程可直接加载到的文件中保存的令牌,该文件内容会由API Server缓存于内存中;
    3. 静态密码:存储于API Server进程可直接加载到的文件中保存的账户和密码令牌,该文件内容会由API Server缓存于内存中;
    4. ServiceAccount令牌:
    5. OpenID Connect令牌:OIDC令牌,
    6. OAuth 2 webhook令牌
    7. 代理认证等
    访问k8s的API Server的客户端主要分为两类:
    • kubectl :用户家目录中的 .kube/config 里面保存了客户端访问API Server的密钥相关信息,这样当用kubectl访问k8s时,它就会自动读取该配置文件,向API Server发起认证,然后完成操作请求,使用Users Accounts普通账户。

    • pod:Pod中的进程需要访问API Server,如果是人去访问或编写的脚本去访问,这类访问使用的账号为:UserAccount;而Pod自身去连接API Server时,使用的账号是:ServiceAccount,生产中后者使用居多。

    • kubectl 向 apiserver发起的命令,采用的时http方式,其实就是对URL发起增删改查的操作。

    [root@k8s-master ~]# kubectl proxy --port=8888 &
    [root@k8s-master ~]# curl http://localhost:8888/api/v1/namespaces/default
    [root@k8s-master ~]# curl http://localhost:8888/apis/apps/v1/namespaces/default/deployments
    
    • 以上两种api的区别是:
      api它是一个特殊链接,只有在核心v1群组中的对象才能使用。
      apis 它是一般API访问的入口固定格式名

    ServiceAccount令牌认证

    • K8S自动为每个Pod注入一个ServiceAccount令牌,在每个名称空间中,会自动存在(由ServiceAccount准入控制器负责)一个ServiceAccount,将被该空间下的每个Pod共享使用。

    • 认证令牌保存于该空间下的一个Secret对象中,该对象中共有三个信息:
      1.namespace
      2.ca.crt
      3.token

    • 资源定义格式:

    apiVersion: v1 #ServiceAccount所属的API群组及版本
    kind: serviceAccount #资源类型标识
    metadata:
      name <string> #资源名称
      namespace <string> # ServiceAccount是名称空间级别的资源
    automountServiceAccountToken <boolean> # 是否让Pod自动挂载API令牌
    secrets <[]object> #以该SA运行的Pod所要使用的Secret对象组成的列表
      apiVersion <string> #引用的Secret对象所属的API群组及版本,可省略
      kind <string> #引用的资源的类型,这里是指Secret,可省略
      name <string> #引用的Secret对象的名称,通常仅给出该字段即可
      namespace <string> #引用的Secret对象所属的名称空间
      uid <string># 引用的Secret对象的标识符;
    imagePullSecrets <[]object> # 引用的用于下载Pod中容器镜像的Secret对象列表 之前讲到secret时提到过Pod挂载私有仓库secret,实际使用不方便需要每个Pod单独挂载,放到serviceaccount就不用每个Pod单独挂载
      name <string> #docker-registry类型的Secret资源的名称
    
    示例: 查看Pod 默认ServiceAccount及Secret
    [root@k8s-master ~]# kubectl get pod    
    NAME                                 READY   STATUS    RESTARTS   AGE
    centos-deployment-66d8cd5f8b-9x47c   1/1     Running   1          41h
    demodb-0                             1/1     Running   0          17h
    demodb-1                             1/1     Running   0          16h
    
    • 默认情况下没有指定ServiceAccount都会把默认的ServiceAccount挂载到Pod
    [root@k8s-master ~]# kubectl describe  pod demodb-0 
    Annotations:  <none>
    ...
        Mounts:
          /demodb/data from data (rw)
          /var/run/secrets/kubernetes.io/serviceaccount from default-token-fsshk (ro)  #默认的ServiceAccount令牌
    ...
    Volumes:
      data:
        Type:       PersistentVolumeClaim (a reference to a PersistentVolumeClaim in the same namespace)
        ClaimName:  data-demodb-0
        ReadOnly:   false
      default-token-fsshk:    #默认的ServiceAccount令牌 存储卷
        Type:        Secret (a volume populated by a Secret)
        SecretName:  default-token-fsshk  
        Optional:    false
    QoS Class:       BestEffort
    Node-Selectors:  <none>
    Tolerations:     node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
                     node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
    Events:          <none>
    
    • 每个名称空间下都自动生成一个默认的secret
    [root@k8s-master ~]# kubectl get secret
    NAME                  TYPE                                  DATA   AGE
    default-token-fsshk   kubernetes.io/service-account-token   3      51d   
    harbor-tom            kubernetes.io/dockerconfigjson        1      11d
    mysql-root-authn      Opaque                                2      11d
    nginx-ssl-secret      kubernetes.io/tls                     2      11d
    web-basic-authn       kubenetes.io/basic-auth               2      11d
    [root@k8s-master ~]# kubectl get secret -n kube-system
    NAME                                             TYPE                                  DATA   AGE
    attachdetach-controller-token-bpprw              kubernetes.io/service-account-token   3      51d
    bootstrap-signer-token-69hd8                     kubernetes.io/service-account-token   3      51d
    bootstrap-token-hbjzpz                           bootstrap.kubernetes.io/token         5      14d
    certificate-controller-token-26sn8               kubernetes.io/service-account-token   3      51d
    clusterrole-aggregation-controller-token-hlb6c   kubernetes.io/service-account-token   3      51d
    coredns-token-k6swp                              kubernetes.io/service-account-token   3      51d
    cronjob-controller-token-449ng                   kubernetes.io/service-account-token   3      51d
    daemon-set-controller-token-qb22n                kubernetes.io/service-account-token   3      51d
    default-token-xjfpp                              kubernetes.io/service-account-token   3      51d
    ...
    
    • 主要包含的3类信息 都是以加密方式显示 1. namespace、2. ca.crt、3. token
    [root@k8s-master ~]# kubectl describe secret default-token-xjfpp -n kube-system  #查看secret 详细信息
    Name:         default-token-xjfpp
    Namespace:    kube-system   
    Labels:       <none>
    Annotations:  kubernetes.io/service-account.name: default
                  kubernetes.io/service-account.uid: a7cfad17-e87a-42dd-8f34-46181dd43b05
    
    Type:  kubernetes.io/service-account-token
    
    Data  
    ====
    ca.crt:     1066 bytes
    namespace:  11 bytes     
    token:      eyJhbGciOiJSUzI1NiIsImtpZCI6Ijh4bkpFMkMxV0FtZmxPTmxsV3ZhY3lIRnZiRjlaUnhFSXdHSnRGc21adUUifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJkZWZhdWx0LXRva2VuLXhqZnBwIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQubmFtZSI6ImRlZmF1bHQiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC51aWQiOiJhN2NmYWQxNy1lODdhLTQyZGQtOGYzNC00NjE4MWRkNDNiMDUiLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6a3ViZS1zeXN0ZW06ZGVmYXVsdCJ9.ifUAhcEjhmSszILrjPkbmKAKuo6nDBPrmQTjz6HjBXw85eTsu-D5CCjGwSaVj7X6xqK3GTwcv-r8518pSv92rfbN5cc9FdpknJGjtuigCrksap1gHcqZvco3BM7KFEaTFpCaxiVvzp6YBh4pVmm4zAJGieE8964m3SwZqXUmf3VP3LyVDrYnlISQXoXy5oEXODe8694H1vwU3wuRmkwLOCV5QthTxFpx5siM7_KFkcBuG-pt0lTbf6d15OXk-WY6J3qkdbmLrJFaofAo-1tas6Fp7ziQnIAkG_lTrbXPHD-rHJf9v1PobVIVvlEe5hKc_V1tE36SEwpIYHb61DfWRw
    
    • Pod 默认的挂载路径 /var/run/secrets/kubernetes.io/serviceaccount
    [root@k8s-master authfiles]# kubectl exec -it demodb-0 -- /bin/sh
    /demodb/data # cd /var/run/secrets/kubernetes.io/serviceaccount
    /run/secrets/kubernetes.io/serviceaccount # ls
    ca.crt     namespace  token
    /run/secrets/kubernetes.io/serviceaccount # cat namespace 
    /run/secrets/kubernetes.io/serviceaccount # cat ca.crt 
    -----BEGIN CERTIFICATE-----
    MIIC5zCCAc+gAwIBAgIBADANBgkqhkiG9w0BAQsFADAVMRMwEQYDVQQDEwprdWJl
    cm5ldGVzMB4XDTIxMDYyODE3NDIxMFoXDTMxMDYyNjE3NDIxMFowFTETMBEGA1UE
    AxMKa3ViZXJuZXRlczCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMwQ
    mCJJ0GuIDdzZa8XAJIy7BRUGBT0oI0lVuWc3PD25whr1MBRyUru0u0n7mKVQTzbY
    0G8USHzwSnX51OoMpU5YwHK6WGLgJ6gdCfjAY6v12e7y+rvjOKYns6ljUf2MnaIL
    nrCy1/u56Lnh1wCH1XkLECP539MFamYkRGxeS9FZlFcgLvJp43VX9V4IWQeumHd9
    1abKVei/41qbbvyDU7l4l7klUmLUTGDlYpf1GPU/Jaom4QLRaEt2csYcNZ8J3yaY
    GvOloGM150Rsx4vL8DWOqZcUUg/uXujKg1MfWRrD9KvqK1QdP92IE+l6nXUKY34r
    voDCmOcL8J0nPyjbyf0CAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgKkMA8GA1UdEwEB
    /wQFMAMBAf8wHQYDVR0OBBYEFOwi2wrUbuvVmbiV2rnnLtz0hsgcMA0GCSqGSIb3
    DQEBCwUAA4IBAQBCFkEU4gyouDs4hG0pjdlrJRkDw1kKg1JV8m3CqcKUKmJBUT9H
    9R8LaU2s/6yS5zX3VSdUNgF1V/hpjUJ6bSud9Xfnmbw8lHKUucUSIWU9a+TGTvkn
    DqI8FcC8gKstUAwagxdRwj3KEy7HSAcbMXjKFSdAlQ2Qq7CG8vLXilurHhEEbrzq
    unbuVjJ80gIWeeo23HkAbjOiTiSokN2AoGyGW9eS3bMLSJgMHzLtX80uWwS75jc3
    2mMrYe59nzGIR2yY2zxkmmj6DOLoMQKyJlqPC2fGKyAv0N79QKAGl7JjbXzYvaV2
    egWtCk0FHnfah9Fu+/P8pNtY8agSluneeHkL
    -----END CERTIFICATE-----
    /run/secrets/kubernetes.io/serviceaccount # 
    

    相关文章

      网友评论

        本文标题:21.kubernetes(k8s)笔记 认证、授权与准入控制(

        本文链接:https://www.haomeiwen.com/subject/wkklxrtx.html