kubernetes ssl证书梳理
云計算
前言
kubernetes 集群安裝配置過程中,會使用各種證書,目的是為了加強(qiáng)集群安全性,但是會坑很多入門新手.
前期如果手動部署集群, 想了解集群組件配合工作原理,各種不通,報很多奇葩的錯,很多是證書配置錯誤導(dǎo)致的。
推薦報錯時多看master節(jié)點和調(diào)試服務(wù)節(jié)點的日志. 基本都能發(fā)現(xiàn)有用的錯誤日志,k8s打印的錯誤日志,指引的錯誤方向還是靠譜的.
為了少踩坑,個人簡單梳理了一下集群配置過程中使用的證書信息,詳細(xì)如下:
集群使用證書
etcd: 使用 ca.pem、server-key.pem、server.pem;
kube-apiserver: 使用 ca.pem、server-key.pem、server.pem;
kubelet: 使用 ca.pem;
kube-proxy: 使用 ca.pem、kube-proxy-key.pem、kube-proxy.pem;
kubectl: 使用 ca.pem、admin-key.pem、admin.pem;
kube-controller-manager:使用 ca-key.pem、ca.pem
注意:
證書生成操作都可以在master節(jié)點主機(jī)上執(zhí)行,證書只需要創(chuàng)建一次即可。然后將證書copy到新添加節(jié)點,
根據(jù)不同服務(wù)使用的證書的不同單獨(dú)配置即可。
其它幾個類證書文件
token.csv
該文件為一個用戶的描述文件,基本格式為 Token,用戶名,UID,用戶組;這個文件在 apiserver 啟動時被 apiserver 加載,
然后就相當(dāng)于在集群內(nèi)創(chuàng)建了一個這個用戶;接下來就可以用 RBAC 給他授權(quán)
bootstrap.kubeconfig
該文件中內(nèi)置了 token.csv 中用戶的 Token,以及 apiserver CA 證書;kubelet 首次啟動會加載此文件,
使用 apiserver CA 證書建立與 apiserver 的 TLS 通訊,使用其中的用戶 Token 作為身份標(biāo)識像 apiserver 發(fā)起 CSR 請求
生成證書過程簡介
安裝cfssl
CFSSL是CloudFlare開源的一款PKI/TLS工具。CFSSL 包含一個命令行工具和一個用于 簽名,驗證并且捆綁TLS證書的 HTTP API 服務(wù).
使用Go語言編寫。
CFSSL包括:
一組用于生成自定義 TLS PKI 的工具;
cfssl程序,是CFSSL的命令行工具;
multirootca程序是可以使用多個簽名密鑰的證書頒發(fā)機(jī)構(gòu)服務(wù)器;
mkbundle程序用于構(gòu)建證書池;
cfssljson程序,從cfssl和multirootca程序獲取JSON輸出,并將證書,密鑰,CSR和bundle寫入磁盤;
PKI借助數(shù)字證書和公鑰加密技術(shù)提供可信任的網(wǎng)絡(luò)身份。通常,證書就是一個包含如下身份信息的文件:
證書所有組織的信息
公鑰
證書頒發(fā)組織的信息
證書頒發(fā)組織授予的權(quán)限,如證書有效期、適用的主機(jī)名、用途等
使用證書頒發(fā)組織私鑰創(chuàng)建的數(shù)字簽名
下載
wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64
wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64
wget https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64
安裝
chmod +x cfssl_linux-amd64 cfssljson_linux-amd64 cfssl-certinfo_linux-amd64
mv cfssl_linux-amd64 /usr/local/bin/cfssl
mv cfssljson_linux-amd64 /usr/local/bin/cfssljson
mv cfssl-certinfo_linux-amd64 /usr/bin/cfssl-certinfo
證書生成過程演示
制作server ca證書
cat << EOF | tee ca-config.json
{
signing: {
default: {
expiry: 87600h
},
profiles: {
server: {
expiry: 87600h,
usages: [
signing,
key encipherment,
server auth,
client auth
]
}
}
}
}
EOF
字段說明:
expiry : 87600h 10 年
ca-config.json:可以定義多個 profiles,分別指定不同的過期時間、使用場景等參數(shù);后續(xù)在簽名證書時使用某個 profile;
signing:表示該證書可用于簽名其它證書;生成的 ca.pem 證書中 CA=TRUE;
server auth:表示client可以用該 CA 對server提供的證書進(jìn)行驗證;
client auth:表示server可以用該CA對client提供的證書進(jìn)行驗證;
cat << EOF | tee ca-csr.json
{
CN: server,
key: {
algo: rsa,
size: 2048
},
names: [
{
C: CN,
L: Beijing,
ST: Beijing,
O: k8s,
OU: System
}
]
}
EOF
字段說明:
CN:Common Name,kube-apiserver 從證書中提取該字段作為請求的用戶名 (User Name);瀏覽器使用該字段驗證網(wǎng)站是否合法;
O:Organization,kube-apiserver 從證書中提取該字段作為請求用戶所屬的組 (Group);
生成CA證書和私鑰
cfssl gencert -initca ca-csr.json | cfssljson -bare ca -
驗證ca 證書
k8s-ssl]# ls
ca-config.json
ca-csr.json
ca.csr
ca-key.pem
ca.pem
制作server證書
cat << EOF | tee server-csr.json
{
CN: server,
hosts: [
10.254.0.1,
127.0.0.1,
172.20.101.157,
172.20.101.165,
172.20.101.164,
172.20.101.160,
172.20.101.166,
172.20.101.167,
server,
server.default,
server.default.svc,
server.default.svc.cluster,
server.default.svc.cluster.local
],
key: {
algo: rsa,
size: 2048
},
names: [
{
C: CN,
L: Beijing,
ST: Beijing,
O: k8s,
OU: System
}
]
}
EOF
字段說明:
如果hosts字段不為空則需要指定授權(quán)使用該證書的IP或域名列表,該證書后續(xù)被 etcd 集群和 kubernetes master 集群使用,
上面分別指定了 etcd 集群:
172.20.101.157,
172.20.101.165,
172.20.101.164,
kubernetes master 集群的主機(jī) IP:
172.20.101.157,
172.20.101.165,
172.20.101.164,
kubernetes node 節(jié)點 IP:
172.20.101.160,
172.20.101.166,
172.20.101.167,
service-cluster-ip-range 網(wǎng)段和第一個IP,
10.254.0.1,
也可以寫物理節(jié)點的主機(jī)名。
另外集群配置高可用使用vip的IP地址也填上。
生成 kubernetes 證書和私鑰
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=server server-csr.json | cfssljson -bare server
驗證
ll server*
server.csr
server-csr.json
server-key.pem
server.pem
制作kube-proxy證書
cat << EOF | tee kube-proxy-csr.json
{
CN: system:kube-proxy,
hosts: [],
key: {
algo: rsa,
size: 2048
},
names: [
{
C: CN,
L: Beijing,
ST: Beijing,
O: k8s,
OU: System
}
]
}
EOF
字段說明:
CN 指定該證書的Use為system:kube-proxy;
kube-apiserver 預(yù)定義的 RoleBinding system:node-proxier 將User system:kube-proxy 與 Role system:node-proxier 綁定,該 Role 授予了調(diào)用 kube-apiserver Proxy 相關(guān) API 的權(quán)限;
創(chuàng)建 kube-proxy 證書
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=server kube-proxy-csr.json | cfssljson -bare kube-proxy
驗證
kube-*
kube-proxy.csr
kube-proxy-csr.json
kube-proxy-key.pem
kube-proxy.pem
創(chuàng)建 admin 證書
cat >admin-csr.json<<EOF
{
CN: admin,
key: {
algo: rsa,
size: 2048
},
names: [
{
C: CN,
ST: BeiJing,
L: BeiJing,
O: system:masters,
OU: System
}
]
}
EOF
字段說明:
O 指定該證書的 Group 為 system:masters,kubelet 使用該證書訪問 kube-apiserver 時 ,由于證書被 CA 簽名,所以認(rèn)證通過,
同時由于證書用戶組為經(jīng)過預(yù)授權(quán)的 system:masters,所以被授予訪問所有 API 的權(quán)限;
生成 admin ca
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=server admin-csr.json | cfssljson -bare admin
驗證
ll admin*
admin.csr
admin-csr.json
admin-key.pem
admin.pem
清理 csr srl
find . -name *.csr -o -name *.srl|xargs rm -f
驗證證書:
使用 opsnssl 命令驗證key內(nèi)容
openssl x509 -noout -text -in server.pem
cfssl-certinfo -cert server.pem
后面的pem可以換成已生成key文件,然后核對key內(nèi)容。
集群核對key信息
集群搭建完成,通過命令: kubectl get clusterrolebinding cluster-admin -o yaml ,查看 clusterrolebinding cluster-admin 的 subjects 的 kind 是 Group,name 是 system:masters。 roleRef 對象是 ClusterRole cluster-admin。
即:system:masters Group 的 user 或者 serviceAccount 都擁有 cluster-admin 的角色。 因此在使用 kubectl 命令時候,
才擁有整個集群的管理權(quán)限。可以使用 kubectl get clusterrolebinding cluster-admin -o yaml 來查看。
參考文檔:
https://blog.51cto.com/lookingdream/2176846
https://jimmysong.io/kubernetes-handbook/practice/create-tls-and-secret-key.html
總結(jié)
以上是生活随笔為你收集整理的kubernetes ssl证书梳理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 从Javascript单线程谈Event
- 下一篇: linux中du与df有什么不同