上一篇文章中介紹了etcd集群的搭建已經(jīng)將對(duì)外的服務(wù)接口http轉(zhuǎn)為https,本文將繼續(xù)介紹在如何將集群間的peer通信從http轉(zhuǎn)換成https。
0. 實(shí)驗(yàn)環(huán)境
參考《通過etcd集群搭建了解pki安全認(rèn)證-01》建立etcd集群。本文介紹重建集群和不重建集群兩種情況下啟用節(jié)點(diǎn)間https通信的方法。
1. 準(zhǔn)備peer證書
和server證書一樣,3個(gè)節(jié)點(diǎn)的peer證書其實(shí)也可以共用一個(gè),但是同樣會(huì)帶來之前提到的集群節(jié)點(diǎn)變化時(shí)的證書管理問題。并且集群間通信雙方就是物理節(jié)點(diǎn),不可能使用統(tǒng)一的域名或者虛擬IP,因此,好的實(shí)踐是為每個(gè)節(jié)點(diǎn)配置自己的peer證書。
為3個(gè)節(jié)點(diǎn)創(chuàng)建peer證書請(qǐng)求文件所需配置:
# cfssl print-defaults csr > etcd1-peer-csr.json
# vi etcd1-peer-csr.json
修改后內(nèi)容如下,以節(jié)點(diǎn)k8s1為例:
# cat etcd1-peer-csr.json
{
"CN": "ETCD Peer on k8s1",
"hosts": [
"192.168.56.41"
],
"key": {
"algo": "ecdsa",
"size": 256
},
"names": [
{
"C": "US",
"L": "CA",
"ST": "San Francisco"
}
]
}
創(chuàng)建服務(wù)器peer證書, 并拷貝到相應(yīng)的節(jié)點(diǎn)上:
# cfssl gencert -ca=rootca.pem -ca-key=rootca-key.pem -config=ca-config.json -profile=peer etcd1-peer-csr.json | cfssljson -bare etcd1-peer
# cfssl gencert -ca=rootca.pem -ca-key=rootca-key.pem -config=ca-config.json -profile=peer etcd2-peer-csr.json | cfssljson -bare etcd2-peer
# cfssl gencert -ca=rootca.pem -ca-key=rootca-key.pem -config=ca-config.json -profile=peer etcd3-peer-csr.json | cfssljson -bare etcd3-peer
# scp /etc/etcd/pki/etcd2-peer*.pem k8s2:/etc/etcd/pki/
# scp /etc/etcd/pki/etcd3-peer*.pem k8s3:/etc/etcd/pki/
2. 重建集群以啟用https
集群節(jié)點(diǎn)的peer訪問端點(diǎn)存儲(chǔ)在數(shù)據(jù)目錄,因此修改ETCD_INITIAL_CLUSTER參數(shù)后,最簡單讓其生效的方法就是重建集群。
注意:這種方法將丟失已有數(shù)據(jù),一般在新建集群時(shí)使用。
在所有節(jié)點(diǎn)上修改etcd配置文件,將peer的url修改為https,配置相關(guān)證書,以k8s1為例,涉及參數(shù)如下:
ETCD_LISTEN_PEER_URLS="https://192.168.56.41:2380"
ETCD_INITIAL_ADVERTISE_PEER_URLS="https://192.168.56.41:2380"
ETCD_INITIAL_CLUSTER="k8s1=https://192.168.56.41:2380,k8s2=https://192.168.56.42:2380,k8s3=https://192.168.56.43:2380"
ETCD_PEER_CERT_FILE="/etc/etcd/pki/etcd1-peer.pem"
ETCD_PEER_KEY_FILE="/etc/etcd/pki/etcd1-peer-key.pem"
ETCD_PEER_CLIENT_CERT_AUTH="true"
ETCD_PEER_TRUSTED_CA_FILE="/etc/etcd/pki/rootca.pem"
在所有節(jié)點(diǎn)上刪除已有實(shí)例,重啟etcd。
# systemctl stop etcd
# rm -rf /var/lib/etcd/default.etcd
# systemctl start etcd
3. 不重建集群啟用https
3.1 修改1個(gè)節(jié)點(diǎn)的peer通信端點(diǎn)
步驟如下:
- 查看節(jié)點(diǎn)列表,獲取節(jié)點(diǎn)標(biāo)識(shí)
[root@k8s1 pki]# etcdctl --ca-file /etc/etcd/pki/rootca.pem --cert-file /etc/etcd/pki/etcdctl.pem --key-file /etc/etcd/pki/etcdctl-key.pem member list
1a3c142a6a5e6e84: name=k8s3 peerURLs=http://192.168.56.43:2380 clientURLs=https://192.168.56.43:2379 isLeader=false
7c1dfc5e13a8008a: name=k8s2 peerURLs=http://192.168.56.42:2380 clientURLs=https://192.168.56.42:2379 isLeader=true
c920522ba9a75e17: name=k8s1 peerURLs=http://192.168.56.41:2380 clientURLs=https://192.168.56.41:2379 isLeader=false
- 修改k8s3節(jié)點(diǎn)的peer url為https
[root@k8s1 pki]# etcdctl --ca-file /etc/etcd/pki/rootca.pem --cert-file /etc/etcd/pki/etcdctl.pem --key-file /etc/etcd/pki/etcdctl-key.pem member update 1a3c142a6a5e6e84 https://192.168.56.43:2380
Updated member with ID 1a3c142a6a5e6e84 in cluster
- 重新檢查節(jié)點(diǎn)列表和集群健康狀態(tài)
[root@k8s1 pki]# etcdctl --ca-file /etc/etcd/pki/rootca.pem --cert-file /etc/etcd/pki/etcdctl.pem --key-file /etc/etcd/pki/etcdctl-key.pem member list
1a3c142a6a5e6e84: name=k8s3 peerURLs=https://192.168.56.43:2380 clientURLs=https://192.168.56.43:2379 isLeader=false
7c1dfc5e13a8008a: name=k8s2 peerURLs=http://192.168.56.42:2380 clientURLs=https://192.168.56.42:2379 isLeader=true
c920522ba9a75e17: name=k8s1 peerURLs=http://192.168.56.41:2380 clientURLs=https://192.168.56.41:2379 isLeader=false
[root@k8s1 pki]# etcdctl --ca-file /etc/etcd/pki/rootca.pem --cert-file /etc/etcd/pki/etcdctl.pem --key-file /etc/etcd/pki/etcdctl-key.pem cluster-health
member 1a3c142a6a5e6e84 is healthy: got healthy result from https://192.168.56.43:2379
member 7c1dfc5e13a8008a is healthy: got healthy result from https://192.168.56.42:2379
member c920522ba9a75e17 is healthy: got healthy result from https://192.168.56.41:2379
可以看到k8s3的peer地址已經(jīng)是https了,但實(shí)際上此時(shí)k8s3的偵聽地址沒有修改,https所需要的相關(guān)證書都沒有配置,https通信是不可能建立的,因此事實(shí)上此時(shí)與k8s3的通信仍然是fallback到http上。在k8s3上抓包分析,可以看到結(jié)果如下:
客戶端不斷發(fā)出https請(qǐng)求,但是作為服務(wù)器的k8s3沒有任何響應(yīng),最后使用http進(jìn)行發(fā)送raft協(xié)議消息。
3.2 修改k8s3的peer工作端口為https
修改k8s3配置中的工作端口和相關(guān)證書,這些證書的生成方法參考上一篇文章的第6節(jié)。
涉及參數(shù)如下:
ETCD_LISTEN_PEER_URLS="https://192.168.56.43:2380"
ETCD_INITIAL_ADVERTISE_PEER_URLS="https://192.168.56.43:2380"
ETCD_PEER_CERT_FILE="/etc/etcd/pki/etcd3-peer.pem"
ETCD_PEER_KEY_FILE="/etc/etcd/pki/etcd3-peer-key.pem"
ETCD_PEER_CLIENT_CERT_AUTH="true"
ETCD_PEER_TRUSTED_CA_FILE="/etc/etcd/pki/rootca.pem"
然后重啟k8s3上的etcd。上述配置在k8s3啟動(dòng)了服務(wù)器端的https通信,并且要求進(jìn)行客戶端驗(yàn)證,而作為客戶端的k8s1和k8s2還沒有相關(guān)配置,因此https通信仍然會(huì)失敗,與k8s3的通信仍然fallback到http上。
在k8s3上可看到如下出錯(cuò)日志和數(shù)據(jù)包:
Oct 26 08:15:56 k8s3 etcd[2857]: rejected connection from "192.168.56.41:41164" (error "remote error: tls: bad certificate", ServerName "")
可以看到服務(wù)器端已經(jīng)返回了peer證書,但客戶端無法驗(yàn)證該證書導(dǎo)致https失敗。
3.3 在k8s1和k8s2上配置上客戶端所需證書
涉及的參數(shù)主要是客戶端自身的證書和私鑰,以及用于驗(yàn)證k8s3的根CA證書:
ETCD_PEER_CERT_FILE="/etc/etcd/pki/etcd1-peer.pem"
ETCD_PEER_KEY_FILE="/etc/etcd/pki/etcd1-peer-key.pem"
ETCD_PEER_TRUSTED_CA_FILE="/etc/etcd/pki/rootca.pem"
然后重啟兩個(gè)節(jié)點(diǎn)上的etcd,發(fā)現(xiàn)k8s3上的報(bào)錯(cuò)隨即停止,至此,完成了k8s3上https通信的轉(zhuǎn)換。在k8s3上抓包分析,可看到完整的https證書交互建立連接的過程。
3.4. 對(duì)其余節(jié)點(diǎn)到重復(fù)上述步驟
如果先在節(jié)點(diǎn)上修改配置文件啟用https URL,再使用etcdctl指令修改集群的peer訪問端點(diǎn),在兩步之間的時(shí)間里,實(shí)際上是客戶端使用http協(xié)議訪問服務(wù)器的https服務(wù),這段時(shí)間實(shí)際集群間的通信是失敗的??稍诜?wù)器上看到https請(qǐng)求被拒絕的錯(cuò)誤:
Oct 26 08:34:50 k8s2 etcd[9579]: rejected connection from "192.168.56.41:39714" (error "tls: first record does not look like a TLS handshake", ServerName "")
因此,一個(gè)比較好的實(shí)踐是先使用etcdct指令修改訪問端點(diǎn),再修改服務(wù)器配置文件啟用https。