- Kubernetes權(quán)威指南:從Docker到Kubernetes實(shí)踐全接觸(第4版)
- 龔正等編著
- 2110字
- 2019-09-23 11:04:29
2.4 Kubernetes集群的安全設(shè)置
2.4.1 基于CA簽名的雙向數(shù)字證書認(rèn)證方式
在一個安全的內(nèi)網(wǎng)環(huán)境中,Kubernetes的各個組件與Master之間可以通過kube-apiserver的非安全端口http://<kube-apiserver-ip>:8080進(jìn)行訪問。但如果API Server需要對外提供服務(wù),或者集群中的某些容器也需要訪問API Server以獲取集群中的某些信息,則更安全的做法是啟用HTTPS安全機(jī)制。Kubernetes提供了基于CA簽名的雙向數(shù)字證書認(rèn)證方式和簡單的基于HTTP Base或Token的認(rèn)證方式,其中CA證書方式的安全性最高。本節(jié)先介紹如何以CA證書的方式配置Kubernetes集群,要求Master上的kube-apiserver、kube-controller-manager、kube-scheduler進(jìn)程及各Node上的kubelet、kube-proxy進(jìn)程進(jìn)行CA簽名雙向數(shù)字證書安全設(shè)置。
基于CA簽名的雙向數(shù)字證書的生成過程如下。
(1)為kube-apiserver生成一個數(shù)字證書,并用CA證書簽名。
(2)為kube-apiserver進(jìn)程配置證書相關(guān)的啟動參數(shù),包括CA證書(用于驗(yàn)證客戶端證書的簽名真?zhèn)危⒆约旱慕?jīng)過CA簽名后的證書及私鑰。
(3)為每個訪問Kubernetes API Server的客戶端(如kube-controller-manager 、kube-scheduler、kubelet、kube-proxy及調(diào)用API Server的客戶端程序kubectl等)進(jìn)程都生成自己的數(shù)字證書,也都用CA證書簽名,在相關(guān)程序的啟動參數(shù)里增加CA證書、自己的證書等相關(guān)參數(shù)。
1.設(shè)置kube-apiserver的CA證書相關(guān)的文件和啟動參數(shù)
使用OpenSSL工具在Master服務(wù)器上創(chuàng)建CA證書和私鑰相關(guān)的文件:
# openssl genrsa -out ca.key 2048 # openssl req -x509-new -nodes -key ca.key -subj "/CN=k8s-master" -days 5000 -out ca.crt # openssl genrsa -out server.key 2048
注意:在生成ca.crt時,-subj參數(shù)中“/CN”的值為Master主機(jī)名。
準(zhǔn)備master_ssl.cnf文件,該文件用于x509 v3版本的證書。在該文件中主要需要設(shè)置Master服務(wù)器的hostname(k8s-master)、IP地址(192.168.18.3),以及Kubernetes Master Service的虛擬服務(wù)名稱(kubernetes.default等)和該虛擬服務(wù)的ClusterIP地址(169.169.0.1)。
master_ssl.cnf文件的示例如下:
[req] req_extensions = v3_req distinguished_name = req_distinguished_name [req_distinguished_name] [ v3_req ] basicConstraints = CA:FALSE keyUsage = nonRepudiation, digitalSignature, keyEncipherment subjectAltName = @alt_names [alt_names] DNS.1 = kubernetes DNS.2 = kubernetes.default DNS.3 = kubernetes.default.svc DNS.4 = kubernetes.default.svc.cluster.local DNS.5 = k8s-master IP.1 = 169.169.0.1 IP.2 = 192.168.18.3
基于master_ssl.cnf創(chuàng)建server.csr和server.crt文件。在生成server.csr時,-subj參數(shù)中“/CN”的值需為Master的主機(jī)名:
# openssl req -new -key server.key -subj "/CN=k8s-master" -config master_ssl.cnf -out server.csr # openssl x509-req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -days 5000-extensions v3_req -extfile master_ssl.cnf-out server.crt
在全部執(zhí)行完后會生成6個文件:ca.crt、ca.key、ca.srl、server.crt、server.csr、server.key。
將這些文件復(fù)制到一個目錄下(例如/var/run/kubernetes/),然后設(shè)置kube-apiserver的三個啟動參數(shù)“--client-ca-file”“--tls-cert-file”和“--tls-private-key-file”,分別代表CA根證書文件、服務(wù)端證書文件和服務(wù)端私鑰文件:
--client-ca-file=/var/run/kubernetes/ca.crt --tls-private-key-file=/var/run/kubernetes/server.key --tls-cert-file=/var/run/kubernetes/server.crt
同時,可以關(guān)閉非安全端口(設(shè)置--insecure-port=0),設(shè)置安全端口為6443(默認(rèn)值):
--insecure-port=0 --secure-port=6443
最后重啟kube-apiserver服務(wù)。
2.設(shè)置kube-controller-manager的客戶端證書、私鑰和啟動參數(shù)
代碼如下:
$ openssl genrsa -out cs_client.key2048 $ openssl req -new -key cs_client.key -subj "/CN=k8s-master"-out cs_client.csr $ openssl x509-req -in cs_client.csr -CA ca.crt -CAkey ca.key-CAcreateserial -out cs_client.crt-days 5000
其中,在生成cs_client.crt時,-CA參數(shù)和-CAkey參數(shù)使用的是API Server的ca.crt和ca.key文件。然后將這些文件復(fù)制到一個目錄下(例如/var/run/kubernetes/)。
接下來創(chuàng)建/etc/kubernetes/kubeconfig文件(kube-controller-manager與kube-scheduler共用),配置客戶端證書等相關(guān)參數(shù),內(nèi)容如下:
apiVersion: v1 kind: Config users: - name: controllermanager user: client-certificate: /var/run/kubernetes/cs_client.crt client-key: /var/run/kubernetes/cs_client.key clusters: - name: local cluster: certificate-authority: /var/run/kubernetes/ca.crt server: https://192.168.18.3:6443 contexts: - context: cluster: local user: controllermanager name: my-context current-context: my-context
然后設(shè)置kube-controller-manager服務(wù)的啟動參數(shù):
--service-account-key-file=/var/run/kubernetes/server.key --root-ca-file=/var/run/kubernetes/ca.crt --kubeconfig=/etc/kubernetes/kubeconfig
最后重啟kube-controller-manager服務(wù)。
3.設(shè)置kube-scheduler啟動參數(shù)
kube-scheduler復(fù)用上一步kube-controller-manager創(chuàng)建的客戶端證書,配置啟動參數(shù):
--kubeconfig=/etc/kubernetes/kubeconfig
重啟kube-scheduler服務(wù)。
4.設(shè)置每個Node上kubelet的客戶端證書、私鑰和啟動參數(shù)
首先,復(fù)制kube-apiserver的ca.crt和ca.key文件到Node上,在生成kubelet_client.crt時-CA參數(shù)和-CAkey參數(shù)使用的是API Server的ca.crt和ca.key文件;在生成kubelet_client.csr時,將-subj參數(shù)中的“/CN”設(shè)置為本Node的IP地址:
$ openssl genrsa -out kubelet_client.key2048 $ openssl req -new -key kubelet_client.key -subj "/CN=192.168.18.4"-out kubelet_client.csr $ openssl x509-req -in kubelet_client.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out kubelet_client.crt-days 5000
將這些文件復(fù)制到一個目錄下(例如/var/run/kubernetes/)。
接下來創(chuàng)建/etc/kubernetes/kubeconfig文件(kubelet和kube-proxy進(jìn)程共用),配置客戶端證書等相關(guān)參數(shù),內(nèi)容如下:
apiVersion: v1 kind: Config users: - name: kubelet user: client-certificate: /etc/kubernetes/ssl_keys/kubelet_client.crt client-key: /etc/kubernetes/ssl_keys/kubelet_client.key clusters: - name: local cluster: certificate-authority: /etc/kubernetes/ssl_keys/ca.crt server: https://192.168.18.3:6443 contexts: - context: cluster: local user: kubelet name: my-context current-context: my-context
然后設(shè)置kubelet服務(wù)的啟動參數(shù):
--kubeconfig=/etc/kubelet/kubeconfig
最后重啟kubelet服務(wù)。
5.設(shè)置kube-proxy的啟動參數(shù)
kube-proxy復(fù)用上一步kubelet創(chuàng)建的客戶端證書,配置啟動參數(shù):
--kubeconfig=/etc/kubernetes/kubeconfig
重啟kube-proxy服務(wù)。
至此,一個基于CA的雙向數(shù)字證書認(rèn)證的Kubernetes集群環(huán)境就搭建完成了。
6.設(shè)置kubectl客戶端使用安全方式訪問API Server
在使用kubectl對Kubernetes集群進(jìn)行操作時,默認(rèn)使用非安全端口8080對API Server進(jìn)行訪問,也可以設(shè)置為安全訪問API Server的模式,需要設(shè)置3個證書相關(guān)的參數(shù)“——certificate -authority”“--client-certificate”和“--client-key”,分別表示用于CA授權(quán)的證書、客戶端證書和客戶端密鑰。
◎ --certificate-authority:使用為kube-apiserver生成的ca.crt文件。
◎ --client-certificate:使用為kube-controller-manager生成的cs_client.crt文件。
◎ --client-key:使用為kube-controller-manager生成的cs_client.key文件。
同時,指定API Server的URL地址為HTTPS安全地址(例如https://k8s-master:443),最后輸入需要執(zhí)行的子命令,即可對API Server進(jìn)行安全訪問了:
# kubectl --server=https://192.168.18.3:6443 --certificate-authority=/etc/kubernetes/ssl_keys/ca.crt --client-certificate=/etc/kubernetes/ssl_keys/cs_client.crt --client-key=/etc/kubernetes/ssl_keys/cs_client.key get nodes NAME STATUS AGE k8s-node-1 Ready 1h
2.4.2 基于HTTP Base或Token的簡單認(rèn)證方式
除了提供了基于CA的雙向數(shù)字證書認(rèn)證方式,Kubernetes也提供了基于HTTP Base或Token的簡單認(rèn)證方式。各組件與API Server之間的通信方式仍然采用HTTPS,但不使用CA數(shù)字證書。
采用基于HTTP Base或Token的簡單認(rèn)證方式時,API Server對外暴露HTTPS端口,客戶端提供用戶名、密碼或Token來完成認(rèn)證過程。需要說明的是,kubectl命令行工具比較特殊,它同時支持CA雙向認(rèn)證和簡單認(rèn)證兩種模式與API Server通信,其他客戶端組件只能配置為雙向安全認(rèn)證或非安全模式與API Server通信。
1.基于HTTP Base認(rèn)證的配置過程
(1)創(chuàng)建包括用戶名、密碼和UID的文件basic_auth_file,放置在合適的目錄下,例如/etc/kuberntes目錄。需要注意的是,這是一個純文本文件,用戶名、密碼都是明文。
# vi /etc/kubernetes/basic_auth_file admin,admin,1 system,system,2
(2)設(shè)置kube-apiserver的啟動參數(shù)“--basic-auth-file”,使用上述文件提供安全認(rèn)證:
--secure-port=6443 --basic-auth-file=/etc/kubernetes/basic_auth_file
然后,重啟API Server服務(wù)。
(3)使用kubectl通過指定的用戶名和密碼來訪問API Server:
# kubectl --server=https://192.168.18.3:6443--username=admin --password=admin --insecure-skip-tls-verify=trueget nodes NAME STATUS AGE k8s-node-1 Ready 1h
2.基于Token認(rèn)證的配置過程
(1)創(chuàng)建包括用戶名、密碼和UID的文件token_auth_file,放置在合適的目錄下,例如/etc/kuberntes目錄。需要注意的是,這是一個純文本文件,用戶名、密碼都是明文。
$ cat /etc/kubernetes/token_auth_file admin,admin,1 system,system,2
(2)設(shè)置kube-apiserver的啟動參數(shù)“--token-auth-file”,使用上述文件提供安全認(rèn)證:
--secure-port=6443 --token-auth-file=/etc/kubernetes/token_auth_file
然后,重啟API Server服務(wù)。
(3)用curl驗(yàn)證和訪問API Server:
$ curl -k --header "Authorization:Bearer admin" https://192.168.18.3:6443/version { "major": "1", "minor": "14", "gitVersion": "v1.14.0", "gitCommit": "641856db18352033a0d96dbc99153fa3b27298e5", "gitTreeState": "clean", "buildDate": "2019-03-25T15:45:25Z", "goVersion": "go1.12.1", "compiler": "gc", "platform": "linux/amd64" }
- 文心一言從新手到高手(寫作+繪畫+教育+編程+助手)
- 計(jì)算機(jī)應(yīng)用基礎(chǔ)
- 計(jì)算機(jī)應(yīng)用基礎(chǔ)實(shí)訓(xùn)指導(dǎo)與練習(xí)
- 大學(xué)計(jì)算機(jī)基礎(chǔ)
- 贏在測試2:中國軟件測試專家訪談錄
- 大學(xué)計(jì)算機(jī):面向?qū)嵺`與創(chuàng)新能力培養(yǎng)
- 優(yōu)化理論與實(shí)用算法
- 大學(xué)計(jì)算機(jī)應(yīng)用基礎(chǔ)(Windows 7+Office 2013)
- 全國高等院校計(jì)算機(jī)基礎(chǔ)教育研究會2016年會學(xué)術(shù)論文集(高職)
- 群智能算法在人腦功能劃分中的應(yīng)用
- 視覺鏈:互聯(lián)網(wǎng)產(chǎn)品的視覺設(shè)計(jì)理念與規(guī)范
- 計(jì)算機(jī)應(yīng)用基礎(chǔ)實(shí)訓(xùn)教程(Windows 7+Office 2010)
- 大學(xué)計(jì)算機(jī)基礎(chǔ)實(shí)訓(xùn)指導(dǎo)
- 計(jì)算機(jī)輔助設(shè)計(jì) SOLIDWORKS(慕課版)
- 云計(jì)算安全與隱私