通過etcd集群搭建了解pki安全認(rèn)證-02

上一篇文章中介紹了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)

步驟如下:

  1. 查看節(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
  1. 修改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
  1. 重新檢查節(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é)果如下:

etcd2380-fallback-http1.PNG

客戶端不斷發(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 "")
etcd2380-fallback-http2.PNG

可以看到服務(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證書交互建立連接的過程。

etcd2380-fallback-https.PNG

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。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Mat文件的保存 MatFileName = '文件名.mat'; %保存現(xiàn)文件夾的下面save( MatFil...
    墨墨莫默閱讀 417評(píng)論 0 0
  • 夕陽拄杖下山崗, 一片蘆花探風(fēng)向。 身子細(xì)細(xì)長得高, 只為風(fēng)吹落遠(yuǎn)方。 秋來林中一路紅, 水至橋邊兩岸楓。 不喜秋...
    簡村小吹閱讀 337評(píng)論 23 18
  • 干貨一詞,原本是說風(fēng)干、晾曬等方法去除了水分的調(diào)味品、食品。不過隨著電子商務(wù)的發(fā)展,其從業(yè)工作者發(fā)表、分享的一些網(wǎng)...
    陳迂閱讀 1,742評(píng)論 1 7
  • 陸_志東閱讀 279評(píng)論 0 0

友情鏈接更多精彩內(nèi)容