一、K8S 证书介绍
在 Kube-apiserver 中提供了很多认证方式,其中最常用的就是 TLS 认证,当然也有 BootstrapToken,BasicAuth 认证等,只要有一个认证通过,那么 Kube-apiserver 即认为认证通过。下面就主要讲解 TLS 认证。
如果你是使用 kubeadm安装的 Kubernetes, 则会自动生成集群所需的证书。但是如果是通过二进制搭建,所有的证书是需要自己生成的,这里我们说说集群必需的证书。
在了解 Kubernetes 证书之前,需要先了解什么是 “单向 TLS 认证” 和 “双向 TLS 认证”
• 服务器单向认证:只需要服务器端提供证书,客户端通过服务器端证书验证服务的身份,但服务器并不验证客户端的身份。这种情况一般适用于对 Internet 开放的服务,例如搜索引擎网站,任何客户端都可以连接到服务器上进行访问,但客户端需要验证服务器的身份,以避免连接到伪造的恶意服务器。
• 双向 TLS 认证:除了客户端需要验证服务器的证书,服务器也要通过客户端证书验证客户端的身份。这种情况下服务器提供的是敏感信息,只允许特定身份的客户端访问。开启服务端验证客户端默认是关闭的,需要在服务端开启认证配置。
二、鉴权证书
Kube-apiserver,Kubelet 来说,它们都能提供 HTTPS 服务,Kube-apiserver、Kubelet 对于一个请求,既要认证也要鉴权。在 Kube-apiserver 中,鉴权也有多种方式:
• Node
• ABAC
• RBAC
• Webhook
在 TLS + RBAC 模式下,访问 Kube-apiserver 有三种方式:
• 证书 + RBAC(就是上一篇说到的那些证书)
• Node + RBAC( Kubelet 访问 Kube-apiserver 时)
• ServiceAccount + RBAC( Kubernetes 集群内 Pod 访问 Kube-apiserver )
三、K8S 证书的 CN、O
RBAC 鉴权需要对 User 或者 Group 来绑定相应权限达到效果。Kubernetes 证书中的 CN 表示 User,O 表示 Group,看一个例子:
用 openssl 命令解析 kubelet 的客户端证书,kubelet 访问 Kube-apiserver 的时候就会用这个证书来认证,鉴权。
openssl x509 -noout -text -in kubelet-client-current.pem
Kubernetes RBAC 鉴权机制就是利用将权限绑定到 User 或者 Group,使得 User、Group 拥有对应权限,下面就看看 Kubernetes 如何 根据证书、ServiceAccount 鉴权的。
四、Kubectl
Kubectl 使用 KubeConfig 与 Kube-apiserver 进行认证、鉴权。认证上一篇说过了,就是通过 TLS 认证。这里说鉴权,先看看 KubeConfig 的客户端证书 O、CN
使用 openssl 命令解析 KubeConfig 中 client-certificate-data 字段,查看 KubeConfig 客户端证书的 O、CN
[root@master1 ~]# cat /root/.kube/config | grep client-certificate-data: | sed 's/ client-certificate-data: //g' | base64 -d | openssl x509 -noout -subject
subject= /O=system:masters/CN=kubernetes-admin
可以看到 KubeConfig 客户端证书为 kubernetes-admin User 且属于 sys