[kubernetes] 证书详细总结
目錄
?
一 證書(shū)簡(jiǎn)介
二 證書(shū)類(lèi)型分類(lèi)
三? 證書(shū)說(shuō)明
四 TLS?bootstrapping?簡(jiǎn)化kubelet證書(shū)制作
五 證書(shū)制作步驟
1? 創(chuàng)建CA證書(shū)
2 創(chuàng)建K8S證書(shū)
2.1. 創(chuàng)建kubernetes證書(shū)
2.2 創(chuàng)建kube-controller-manager證書(shū)
2.3 創(chuàng)建kube-scheduler證書(shū)?
3 創(chuàng)建ADMIN證書(shū)
4 創(chuàng)建ETCD證書(shū)
6 查看證書(shū)信息:?
?
一 證書(shū)簡(jiǎn)介
服務(wù)端保留公鑰和私鑰,客戶端使用root CA認(rèn)證服務(wù)端的公鑰
一共有多少證書(shū):
Etcd:
1、Etcd對(duì)外提供服務(wù),要有一套etcd?server證書(shū)
2、Etcd各節(jié)點(diǎn)之間進(jìn)行通信,要有一套etcd?peer證書(shū)
3、Kube-APIserver訪問(wèn)Etcd,要有一套etcd?client證書(shū)
kubernetes:
4、Kube-apiserver對(duì)外提供服務(wù),要有一套kube-apiserver?server證書(shū)
5、kube-scheduler、kube-controller-manager、kube-proxy、kubelet和其他可能用到的組件,需要訪問(wèn)kube-APIserver,要有一套kube-apiserver?client證書(shū)
6、kube-controller-manager要生成服務(wù)的service?account,要有一對(duì)用來(lái)簽署service?account的證書(shū)(CA證書(shū))
7、kubelet對(duì)外提供服務(wù),要有一套kubelet?server證書(shū)
8、kube-apiserver需要訪問(wèn)kubelet,要有一套kubelet?client證書(shū)
?
加起來(lái)共8套,但是這里的“套”的含義我們需要理解。
同一個(gè)套內(nèi)的證書(shū)必須是用同一個(gè)CA簽署的,簽署不同套里的證書(shū)的CA可以相同,也可以不同。例如,所有etcd server證書(shū)需要是同一個(gè)CA簽署的,所有的etcd peer證書(shū)也需要是同一個(gè)CA簽署的,而一個(gè)etcd server證書(shū)和一個(gè)etcd peer證書(shū),完全可以是兩個(gè)CA機(jī)構(gòu)簽署的,彼此沒(méi)有任何關(guān)系。這算兩套證書(shū)。
為什么同一個(gè)“套”內(nèi)的證書(shū)必須是同一個(gè)CA簽署的
原因在驗(yàn)證這些證書(shū)的一端。因?yàn)樵谝?yàn)證這些證書(shū)的一端,通常只能指定一個(gè)Root CA。這樣一來(lái),被驗(yàn)證的證書(shū)自然都需要是被這同一個(gè)Root CA對(duì)應(yīng)的私鑰簽署,不然不能通過(guò)認(rèn)證。
實(shí)際上,使用一套證書(shū)(都使用一套CA來(lái)簽署)一樣可以搭建出K8S,一樣可以上生產(chǎn),但是理清這些證書(shū)的關(guān)系,在遇到因?yàn)樽C書(shū)錯(cuò)誤,請(qǐng)求被拒絕的現(xiàn)象的時(shí)候,不至于無(wú)從下手,而且如果沒(méi)有搞清證書(shū)之間的關(guān)系,在維護(hù)或者解決問(wèn)題的時(shí)候,貿(mào)然更換了證書(shū),弄不好會(huì)把整個(gè)系統(tǒng)搞癱。
kubelet證書(shū)為何不同
這樣做是一個(gè)為了審計(jì),另一個(gè)為了安全。 每個(gè)kubelet既是服務(wù)端(kube-apiserver需要訪問(wèn)kubelet),也是客戶端(kubelet需要訪問(wèn)kube-apiserver),所以要有服務(wù)端和客戶端兩組證書(shū)。
服務(wù)端證書(shū)需要與服務(wù)器地址綁定,每個(gè)kubelet的地址都不相同,即使綁定域名也是綁定不同的域名,故服務(wù)端地址不同
客戶端證書(shū)也不應(yīng)相同,每個(gè)kubelet的認(rèn)證證書(shū)與所在機(jī)器的IP綁定后,可以防止一個(gè)kubelet的認(rèn)證證書(shū)泄露以后,使從另外的機(jī)器上偽造的請(qǐng)求通過(guò)驗(yàn)證。
安全方面,如果每個(gè)node上保留了用于簽署證書(shū)的bootstrap token,那么bootstrap token泄漏以后,是不是可以隨意簽署證書(shū)了?安全隱患非常大。所以,kubelet啟動(dòng)成功以后,本地的bootstrap token需要被刪除。
?
二 證書(shū)類(lèi)型分類(lèi)
kubernetes的證書(shū)類(lèi)型主要分為3類(lèi):
- serving CA: 用于簽署serving證書(shū),該證書(shū)用于加密https通信。用于簽署kubernetes API serving證書(shū)的CA也可以用于簽署API server插件的serving證書(shū),可能會(huì)用到不同的CA
- client CA: 用于簽署客戶端證書(shū),同時(shí)也被API server插件用來(lái)對(duì)客戶端發(fā)來(lái)的證書(shū)進(jìn)行認(rèn)證。用于簽署kubernetes API serving證書(shū)的client CA也可以用于簽署API server插件的serving證書(shū),可能會(huì)用到不同的CA
- RequestHeader client CA: 該CA用于簽署API server代理客戶端證書(shū),擁有代理證書(shū)的客戶端可以有效地偽裝成任何身份。當(dāng)運(yùn)行在aggregator之后時(shí),該CA必須與前述aggregator代理客戶端證書(shū)的CA一致
三? 證書(shū)說(shuō)明
serving 證書(shū):
--tls-cert-file和--tls-private-key-file,API server用這兩個(gè)選項(xiàng)來(lái)認(rèn)證連接到自己的TLS。這兩個(gè)證書(shū)也是CA(可以是自簽CA)簽署的。由于客戶端節(jié)點(diǎn)可能會(huì)拒絕自簽CA,因此需要將該CA分發(fā)給客戶端節(jié)點(diǎn),并在客戶端指定該CA。如下kubelet的kubeconfig中的certificate-authority就指定了用于認(rèn)證tls證書(shū)的CA。--tls-cert-file中需要有server字段的名稱(chēng)。API server和kubelet(當(dāng)需要認(rèn)證到kubelet的請(qǐng)求時(shí))都有這兩個(gè)選項(xiàng),工作原理一樣。
current-context: my-context
apiVersion: v1
clusters:
- cluster:
certificate-authority: /path/to/my/ca.crt # CERTIFICATE AUTHORITY THAT ISSUED YOUR TLS CERT
server: https://horse.org:4443 # this name needs to be on the certificate in --tls-cert-file
name: my-cluster
kind: Config
users:
- name: green-user
user:
client-certificate: path/to/my/client/cert
client-key: path/to/my/client/key
?
client 證書(shū)
--client-ca-file:任何帶有 client-ca-file 簽名的客戶端證書(shū)的請(qǐng)求,都將通過(guò)客戶端證書(shū)中 Common Name 對(duì)應(yīng)的標(biāo)識(shí)進(jìn)行身份認(rèn)證,證書(shū)中的 Common Name 會(huì)作為用戶名,Organization作為組來(lái)使用。默認(rèn)情況下,API Server使用該選項(xiàng)會(huì)自動(dòng)創(chuàng)建一個(gè)名為extension-apiserver-authentication,位于kube-system命名空間的ConfigMap ,該ConfigMap 中包含了--client-ca-file指定的CA。
API server的--kubelet-certificate-authority、--kubelet-client-certificate、--kubelet-client-key 和kubelet的--client-ca-file為一組選項(xiàng),用于對(duì)kubelet進(jìn)行認(rèn)證(kubelet 組件在工作時(shí),采用主動(dòng)的查詢機(jī)制,即定期請(qǐng)求 apiserver 獲取自己所應(yīng)當(dāng)處理的任務(wù))
RequestHeader client CA 證書(shū)
主要涉及3個(gè)選項(xiàng)--requestheader-client-ca-file、--proxy-client-cert-file、--proxy-client-key-file。代理(如aggregator)使用--proxy-client-cert-file、--proxy-client-key-file來(lái)請(qǐng)求API Server,API Server使用--requestheader-client-ca-file指定的證書(shū)來(lái)認(rèn)證代理的證書(shū)。這三個(gè)選項(xiàng)都設(shè)置在API server的flag中,即aggregator一方面作為API server認(rèn)證來(lái)自client的證書(shū),一方面作為client,使用自身的代理證書(shū)向API server請(qǐng)求認(rèn)證。
當(dāng)kubernetes對(duì)應(yīng)的客戶端證書(shū)中的usernames和group與自己需求不符合時(shí)(無(wú)法認(rèn)證或權(quán)限不足等),可以使用認(rèn)證代理(代理使用另一套證書(shū)請(qǐng)求API server)
可以看到serving證書(shū)是通過(guò)TLS來(lái)進(jìn)行認(rèn)證,client證書(shū)通過(guò)用戶名(Common Name)和組(Organization)進(jìn)行認(rèn)證;RequestHeader client證書(shū)認(rèn)證方式與client證書(shū)認(rèn)證方式類(lèi)似
?
證書(shū)的驗(yàn)證:
顯示插件API server支持的證書(shū):openssl s_client -connect <service-cluster-ip>:443更多
驗(yàn)證證書(shū)是否由CA簽署:openssl verify -CAfile?ca.crt???the-certificate.crt
更多參見(jiàn)Certificate Issues
?
四 TLS?bootstrapping?簡(jiǎn)化kubelet證書(shū)制作
Kubernetes1.4版本引入了一組簽署證書(shū)用的API。這組API的引入,使我們可以不用提前準(zhǔn)備kubelet用到的證書(shū)。
官網(wǎng)地址:https://kubernetes.io/docs/tasks/tls/certificate-rotation/
每個(gè)kubelet用到的證書(shū)都是獨(dú)一無(wú)二的,因?yàn)樗壎ǜ髯缘腎P地址,于是需要給每個(gè)kubelet單獨(dú)制作證書(shū),如果業(yè)務(wù)量很大的情況下,node節(jié)點(diǎn)會(huì)很多,這樣一來(lái)kubelet的數(shù)量也隨之增加,而且還會(huì)經(jīng)常變動(dòng)(增減Node)kubelet的證書(shū)制作就成為一件很麻煩的事情。使用TLS bootstrapping就可以省事兒很多。
工作原理:Kubelet第一次啟動(dòng)的時(shí)候,先用同一個(gè)bootstrap token作為憑證。這個(gè)token已經(jīng)被提前設(shè)置為隸屬于用戶組system:bootstrappers,并且這個(gè)用戶組的權(quán)限也被限定為只能用來(lái)申請(qǐng)證書(shū)。 用這個(gè)bootstrap token通過(guò)認(rèn)證后,kubelet申請(qǐng)到屬于自己的兩套證書(shū)(kubelet server、kube-apiserver client for kubelet),申請(qǐng)成功后,再用屬于自己的證書(shū)做認(rèn)證,從而擁有了kubelet應(yīng)有的權(quán)限。這樣一來(lái),就去掉了手動(dòng)為每個(gè)kubelet準(zhǔn)備證書(shū)的過(guò)程,并且kubelet的證書(shū)還可以自動(dòng)輪替更新
參考文檔:
Kubernetes TLS bootstrapping 那點(diǎn)事
?
五 證書(shū)制作步驟
1? 創(chuàng)建CA證書(shū)
創(chuàng)建證書(shū)配置文件 mkdir ca; cd ca;
vim ca-config.json
{"signing": {"default": {"expiry": "87600h"},"profiles": {"etcd": {"expiry": "87600h","usages": ["signing","key encipherment","server auth","client auth"]},"kubernetes": {"expiry": "87600h","usages": ["signing","key encipherment","server auth","client auth"]}}} }字段說(shuō)明:
ca-config.json:可以定義多個(gè) profiles,分別指定不同的過(guò)期時(shí)間、使用場(chǎng)景等參數(shù);后續(xù)在簽名證書(shū)時(shí)使用某個(gè) profile;
signing:表示該證書(shū)可以簽名其他證書(shū);生成的ca.pem證書(shū)中 CA=TRUE;
server auth:表示client可以用該 CA 對(duì)server提供的證書(shū)進(jìn)行驗(yàn)證;
client auth:表示server可以用該CA對(duì)client提供的證書(shū)進(jìn)行驗(yàn)證;
expiry:過(guò)期時(shí)間
創(chuàng)建CA證書(shū)簽名請(qǐng)求文件
vim ca-csr.json
{"CN": "kubernetes","key": {"algo": "rsa","size": 2048},"names": [{"C": "CN","ST": "BeiJing","L": "BeiJing","O": "k8s","OU": "System"}],"ca": {"expiry": "87600h"} }?
字段說(shuō)明:
“CN”:Common Name,kube-apiserver 從證書(shū)中提取作為請(qǐng)求的用戶名 (User Name);瀏覽器使用該字段驗(yàn)證網(wǎng)站是否合法;
“O”:Organization,kube-apiserver 從證書(shū)中提取該字段作為請(qǐng)求用戶所屬的組 (Group)
生成CA證書(shū)和私鑰
cfssl gencert -initca ca-csr.json | cfssljson -bare ca
ls -al | grep ca
-rw-r--r-- 1 root root 487 Jun 26 11:20 ca-config.json -rw-r--r-- 1 root root 1001 Jun 26 11:20 ca.csr -rw-r--r-- 1 root root 264 Jun 26 11:20 ca-csr.json -rw------- 1 root root 1675 Jun 26 11:20 ca-key.pem -rw-r--r-- 1 root root 1359 Jun 26 11:20 ca.pem其中ca-key.pem是ca的私鑰,ca.csr是一個(gè)簽署請(qǐng)求,ca.pem是CA證書(shū),是后面kubernetes組件會(huì)用到的RootCA。
?
2 創(chuàng)建K8S證書(shū)
在創(chuàng)建這個(gè)證書(shū)之前,先規(guī)劃一下架構(gòu)
k8s-master1? 10.211.55.11
etcd01? ? ? ? ? 10.211.55.11
2.1. 創(chuàng)建kubernetes證書(shū)
創(chuàng)建kubernetes證書(shū)簽名請(qǐng)求文件? mkdir kubernetes; cd kubernetes;
vim kubernetes-csr.json
{"CN": "kubernetes","hosts": ["127.0.0.1","10.254.0.1""10.211.55.11","kubernetes","kubernetes.default","kubernetes.default.svc","kubernetes.default.svc.cluster","kubernetes.default.svc.cluster.local"],"key": {"algo": "rsa","size": 2048},"names": [{"C": "CN","ST": "BeiJing","L": "BeiJing","O": "k8s","OU": "System"}] }字段說(shuō)明:
如果 hosts 字段不為空則需要指定授權(quán)使用該證書(shū)的 IP 或域名列表。
由于該證書(shū)后續(xù)被 kubernetes master 集群使用,將master節(jié)點(diǎn)的IP都填上(如有多個(gè)),同時(shí)還有service網(wǎng)絡(luò)的首IP。(一般是 kube-apiserver 指定的 service-cluster-ip-range 網(wǎng)段的第一個(gè)IP,如 10.254.0.1)
生成kubernetes證書(shū)和私鑰
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes kubernetes-csr.json | cfssljson -bare kubernetes
ls |grep kubernetes
kubernetes.csr kubernetes-csr.json kubernetes-key.pem kubernetes.pem2.2 創(chuàng)建kube-controller-manager證書(shū)
創(chuàng)建 kube-controller-manager 證書(shū)簽名請(qǐng)求文件??
vim kube-controller-manager-csr.json
{"CN": "system:kube-controller-manager","key": {"algo": "rsa","size": 2048},"hosts": ["127.0.0.1","10.211.55.11"],"names": [{"C": "CN","ST": "BeiJing","L": "BeiJing","O": "system:kube-controller-manager","OU": "system"}] }說(shuō)明:
hosts 列表包含所有 kube-controller-manager 節(jié)點(diǎn) IP;
CN 為 system:kube-controller-manager、O 為 system:kube-controller-manager,kubernetes 內(nèi)置的 ClusterRoleBindings system:kube-controller-manager 賦予 kube-controller-manager 工作所需的權(quán)限
生成kube-controoller-manager證書(shū)和私鑰
cfssl gencert -ca=../ca/ca.pem -ca-key=../ca/ca-key.pem -config=../ca/ca-config.json -profile=kubernetes kube-controller-manager-csr.json | cfssljson -bare kube-controller-manager?
ls |grep kube-controller-manager?
kube-controller-manager.csr kube-controller-manager-csr.json kube-controller-manager-key.pem kube-controller-manager.pem2.3 創(chuàng)建kube-scheduler證書(shū)?
?創(chuàng)建 kube-scheduler 證書(shū)簽名請(qǐng)求文件
vim kube-scheduler-csr.json?
{"CN": "system:kube-scheduler","hosts": ["127.0.0.1","10.211.55.11"],"key": {"algo": "rsa","size": 2048},"names": [{"C": "CN","ST": "BeiJing","L": "BeiJing","O": "system:kube-scheduler","OU": "System"}] }?
說(shuō)明:
hosts 列表包含所有 kube-scheduler 節(jié)點(diǎn) IP;
CN 為 system:kube-scheduler、O 為 system:kube-scheduler,kubernetes 內(nèi)置的 ClusterRoleBindings system:kube-scheduler 將賦予 kube-scheduler 工作所需的權(quán)限。
?
經(jīng)過(guò)上述操作,我們會(huì)用到如下文件
cfssl gencert -ca=../ca/ca.pem -ca-key=../ca/ca-key.pem -config=../ca/ca-config.json -profile=kubernetes kube-scheduler-csr.json| cfssljson -bare kube-scheduler
ls | grep kube-scheduler
kube-scheduler.csr kube-scheduler-csr.json kube-scheduler-key.pem kube-scheduler.pem3 創(chuàng)建ADMIN證書(shū)
創(chuàng)建admin證書(shū)簽名請(qǐng)求文件? mkdir admin ; cd admin
?vim admin-csr.json
{"CN": "admin","hosts": [],"key": {"algo": "rsa","size": 2048},"names": [{"C": "CN","ST": "BeiJing","L": "BeiJing","O": "system:masters","OU": "System"}] }?
說(shuō)明:
后續(xù) kube-apiserver 使用 RBAC 對(duì)客戶端(如 kubelet、kube-proxy、Pod)請(qǐng)求進(jìn)行授權(quán);
kube-apiserver 預(yù)定義了一些 RBAC 使用的 RoleBindings,如 cluster-admin 將 Group system:masters 與 Role cluster-admin 綁定,該 Role 授予了調(diào)用kube-apiserver 的所有 API的權(quán)限;
O指定該證書(shū)的 Group 為 system:masters,kubelet 使用該證書(shū)訪問(wèn) kube-apiserver 時(shí) ,由于證書(shū)被 CA 簽名,所以認(rèn)證通過(guò),同時(shí)由于證書(shū)用戶組為經(jīng)過(guò)預(yù)授權(quán)的 system:masters,所以被授予訪問(wèn)所有 API 的權(quán)限;
注:這個(gè)admin 證書(shū),是將來(lái)生成管理員用的kube config 配置文件用的,現(xiàn)在我們一般建議使用RBAC 來(lái)對(duì)kubernetes 進(jìn)行角色權(quán)限控制, kubernetes 將證書(shū)中的CN 字段 作為User, O 字段作為 Group
相關(guān)權(quán)限認(rèn)證可以參考下面文章
https://mp.weixin.qq.com/s/XIkQdh5gnr-KJhuFHboNag
生成admin證書(shū)和私鑰
cfssl gencert -ca=../ca/ca.pem -ca-key=../ca/ca-key.pem -config=../ca/ca-config.json -profile=kubernetes admin-csr.json | cfssljson -bare admin
ls | grep admin
admin.csr admin-csr.json admin-key.pem admin.pem4 創(chuàng)建ETCD證書(shū)
創(chuàng)建etcd證書(shū)簽名請(qǐng)求文件?
vim etcd-csr.json
{"CN": "etcd","hosts": ["127.0.0.1","10.211.55.11"],"key": {"algo": "rsa","size": 2048},"names": [{"C": "CN","ST": "BeiJing","L": "BeiJing" }] }字段說(shuō)明:
如果 hosts 字段不為空則需要指定授權(quán)使用該證書(shū)的 IP 或域名列表。該證書(shū)后續(xù)被 etcd 集群使用
生成kubernetes證書(shū)和私鑰
cfssl gencert -ca=../ca/ca.pem -ca-key=../ca/ca-key.pem -config=../ca/ca-config.json -profile=etcd etcd-csr.json | cfssljson -bare etcd
ls |grep etcd
etcd.csr etcd-csr.json etcd-key.pem etcd.pem?
6 查看證書(shū)信息:?
cfssl-certinfo -cert kubernetes.pem
在搭建k8s集群的時(shí)候,將這些文件分發(fā)到至此集群中其他節(jié)點(diǎn)機(jī)器中即可。至此,TLS證書(shū)創(chuàng)建完畢
admin: total 24 drwxr-xr-x 2 root root 4096 Sep 24 12:44 . drwxr-xr-x 6 root root 4096 Sep 24 12:44 .. -rw-r--r-- 1 root root 1009 Sep 24 12:15 admin.csr -rw-r--r-- 1 root root 229 Sep 24 12:14 admin-csr.json -rw------- 1 root root 1679 Sep 24 12:15 admin-key.pem -rw-r--r-- 1 root root 1399 Sep 24 12:15 admin.pemca: total 28 drwxr-xr-x 2 root root 4096 Sep 24 12:01 . drwxr-xr-x 6 root root 4096 Sep 24 12:44 .. -rw-r--r-- 1 root root 487 Sep 24 12:01 ca-config.json -rw-r--r-- 1 root root 1001 Sep 24 12:01 ca.csr -rw-r--r-- 1 root root 309 Sep 24 11:58 ca-csr.json -rw------- 1 root root 1679 Sep 24 12:01 ca-key.pem -rw-r--r-- 1 root root 1359 Sep 24 12:01 ca.pemetcd: total 24 drwxr-xr-x 2 root root 4096 Sep 24 12:24 . drwxr-xr-x 6 root root 4096 Sep 24 12:44 .. -rw-r--r-- 1 root root 1005 Sep 24 12:24 etcd.csr -rw-r--r-- 1 root root 272 Sep 24 12:23 etcd-csr.json -rw------- 1 root root 1675 Sep 24 12:24 etcd-key.pem -rw-r--r-- 1 root root 1375 Sep 24 12:24 etcd.pemkubernetes: total 56 drwxr-xr-x 2 root root 4096 Sep 24 12:44 . drwxr-xr-x 6 root root 4096 Sep 24 12:44 .. -rw-r--r-- 1 root root 1119 Sep 24 12:11 kube-controller-manager.csr -rw-r--r-- 1 root root 350 Sep 24 12:11 kube-controller-manager-csr.json -rw------- 1 root root 1675 Sep 24 12:11 kube-controller-manager-key.pem -rw-r--r-- 1 root root 1493 Sep 24 12:11 kube-controller-manager.pem -rw-r--r-- 1 root root 1245 Sep 24 12:02 kubernetes.csr -rw-r--r-- 1 root root 512 Sep 24 12:02 kubernetes-csr.json -rw------- 1 root root 1679 Sep 24 12:02 kubernetes-key.pem -rw-r--r-- 1 root root 1610 Sep 24 12:02 kubernetes.pem -rw-r--r-- 1 root root 1094 Sep 24 12:13 kube-scheduler.csr -rw-r--r-- 1 root root 331 Sep 24 12:12 kube-scheduler-csr.json -rw------- 1 root root 1675 Sep 24 12:13 kube-scheduler-key.pem -rw-r--r-- 1 root root 1468 Sep 24 12:13 kube-scheduler.pem參考
Kubernetes 的證書(shū)認(rèn)證
k8s學(xué)習(xí)筆記-證書(shū)詳解
總結(jié)
以上是生活随笔為你收集整理的[kubernetes] 证书详细总结的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 魅族息屏显示费电吗
- 下一篇: [深度学习]自然语言处理 --- ELM