关于kubernetes:21kubernetesk8s笔记-认证授权与准入控制一-认证ServiceAccount

43次阅读

共计 7030 个字符,预计需要花费 18 分钟才能阅读完成。

概述:

1. kubernetes API 访问控制

官网文档:
https://kubernetes.io/zh/docs…
kubernetes api 分为:认证、受权、准入管制

  • 用户通过 kubectl、客户端库或者通过发送 REST 申请拜访 API。用户(自然人)和 Kubernetes 服务账户 都能够被受权进行 API 拜访。申请达到 API 服务器后会通过几个阶段,具体阐明如图:
  • 首先看一下 Kubernetes API 申请的发动,申请的发动分为两个局部:
  • 第一个局部是人机交互的过程。是大家十分相熟的用 kubectl 对 apiserver 的一个申请过程 应用的是 Users Accounts 一般账户;
  • 第二个局部是 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 两种认证形式

  • 常见的认证:
  • 疏导令牌(Token) : 如: 节点退出时认证:kubelet
  • 动态令牌: 存储于 API Server 过程可间接加载到的文件中保留的令牌,该文件内容会由 API Server 缓存于内存中;
  • 动态明码: 存储于 API Server 过程可间接加载到的文件中保留的账户和明码令牌,该文件内容会由 API Server 缓存于内存中;
  • ServiceAccount 令牌:
  • OpenID Connect 令牌:OIDC 令牌,
  • OAuth 2 webhook 令牌
  • 代理认证等

拜访 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 # 

正文完
 0