如何使用Hashicorp工具創(chuàng)建安全的邊緣基礎(chǔ)設(shè)施
譯文譯者 | 李睿
審校 | 重樓?
本文解釋了如何使用HashiCorp的堆棧構(gòu)建一個(gè)安全的平臺(tái);許多步驟都有良好的文檔記錄。我們將詳細(xì)強(qiáng)調(diào)最關(guān)鍵的部分,解釋在哪里發(fā)現(xiàn)問題以及如何解決問題,并在官方教程中保留參考資料,以防止本文過長且難以理解。?
物理架構(gòu)
如下圖所示,我們想要實(shí)現(xiàn)的物理架構(gòu)由五個(gè)節(jié)點(diǎn)的Consul和Nomad集群組成:其中三個(gè)是配置為高可用性(HA)的控制平臺(tái)節(jié)點(diǎn),其余兩個(gè)是數(shù)據(jù)平臺(tái)節(jié)點(diǎn)。 ?
考慮到我們處于邊緣環(huán)境,安裝集群服務(wù)器的最終位置至關(guān)重要:?
- 控制平臺(tái)節(jié)點(diǎn)(服務(wù)器)分布在展會(huì)展館或安裝在主樓的專用機(jī)柜上。 ?
- 數(shù)據(jù)平臺(tái)節(jié)點(diǎn)(客戶端)位于每個(gè)展館。 ?
在默認(rèn)情況下,服務(wù)器的角色是維護(hù)集群的狀態(tài),而客戶機(jī)則為物理上位于群集附近的用戶提供服務(wù)。?
基本要求及節(jié)點(diǎn)部署
在自動(dòng)化和虛擬化時(shí)代,繼續(xù)前進(jìn)的方法是創(chuàng)建一個(gè)“測(cè)試并銷毀”的虛擬化環(huán)境,以便在進(jìn)入生產(chǎn)環(huán)境之前嘗試配置,并在物理基礎(chǔ)設(shè)施上部署所有內(nèi)容。?
DevOps工具箱由Ansible、Terraform和Git等工具組成,在構(gòu)建如此復(fù)雜的環(huán)境的過程中,它一直是一個(gè)嚴(yán)格的配置和流程要求。Ansible Vault是我們的選擇,以確保與特定環(huán)境相關(guān)的敏感內(nèi)容(如密碼、密鑰、配置變量和引導(dǎo)令牌或TLS證書)受到保護(hù)和加密,而不是以純文本形式從我們存儲(chǔ)用于構(gòu)建基礎(chǔ)設(shè)施的代碼的Git存儲(chǔ)庫中可見。 ?
我們首先創(chuàng)建五臺(tái)虛擬機(jī)。對(duì)于測(cè)試使用了以下規(guī)范:?
- 操作系統(tǒng):Ubuntu 22.04 LTS?
- 磁盤:20GB ?
- 內(nèi)存:2GB ?
- vCPU:2?
用戶可以選擇其喜歡的公共云提供商,在那里部署大量的虛擬機(jī)與Terraform?;蛘?,為了加快部署過程,可以使用VirtualBox和Vagrant在他們的筆記本電腦上創(chuàng)建它們,但最終,將得到一個(gè)與此類似的Ansible清單:?
配置Consul和Nomad集群
在這個(gè)引導(dǎo)階段,開源Ansible社區(qū)提供了一個(gè)經(jīng)過廣泛測(cè)試的、安全的公共劇本。得益于Ansible Galaxy實(shí)用程序,我們可以提取兩個(gè)角色的代碼,分別部署Consul和Nomad。 ?
我們將上述角色制作成一個(gè)專有的劇本,首先,使用虛擬網(wǎng)絡(luò)接口配置和設(shè)置服務(wù)器網(wǎng)絡(luò)。該接口映射到保留IP地址169.254.1.1,用于解析集群中的*.consol域名,我們稱其為dummy0接口。我們依靠Ansible在目標(biāo)節(jié)點(diǎn)上配置它,最后,我們將在每臺(tái)服務(wù)器上有以下文件:/etc/systemd/network/dummy0.network::?
此外,公共劇本還在服務(wù)器上配置了一些基本的自定義,比如更新操作系統(tǒng)、設(shè)置節(jié)點(diǎn)用戶導(dǎo)入相關(guān)的SSH authorized_keys、安裝容器運(yùn)行時(shí)以及一些調(diào)試CLI工具。 ?
最后,應(yīng)該通過設(shè)置適當(dāng)?shù)腁nsible變量來注意配置Consul和Nomad角色。它們的大多數(shù)名稱是不言自明的,但是必須指定consul_version和nomad_version(在本例中分別為1.12.2和1.2.8)。三個(gè)客戶機(jī)節(jié)點(diǎn)應(yīng)該使用consul_node_role和nomad_node_role變量,而其他節(jié)點(diǎn)應(yīng)該使用服務(wù)器變量。另一個(gè)需要設(shè)置的有用變量是nomad_cni_enable:true,否則,將不得不人工在任何Nomad節(jié)點(diǎn)上安裝CNI。?
通過這種方式,我們還能夠以最小的工作量支持不同環(huán)境庫存的快速供應(yīng)和部署,從生產(chǎn)裸服務(wù)器或邊緣的cloudlet到在云中開發(fā)和測(cè)試虛擬機(jī)。?
配置Vault群集
此時(shí),我們已經(jīng)為Consul+Nomad集群做好了準(zhǔn)備,應(yīng)該能夠訪問各自的用戶界面(UI)并啟動(dòng)一些測(cè)試工作負(fù)載。如果一切正常,那么就是配置Vault集群的時(shí)候了。為了簡單起見,它將被安裝在運(yùn)行Nomad和Consul控制平臺(tái)的高可用性(HA)服務(wù)器節(jié)點(diǎn)上。 ?
如果是Vault初學(xué)者,可以從這里開始進(jìn)行嘗試,然后可以移動(dòng)到Ansible Vault角色來安裝這個(gè)組件,但是在進(jìn)入劇本之前,需要一些人工步驟來為我們的Vault集群引導(dǎo)PKI。 ?
如果企業(yè)提供現(xiàn)有的PKI配置,可以依賴它。這里,我們將從頭開始,創(chuàng)建根證書(CA)頒發(fā)機(jī)構(gòu)和證書。 ?
首先,創(chuàng)建根密鑰(這是CA私鑰,可用于簽署證書請(qǐng)求),然后使用根密鑰創(chuàng)建需要分發(fā)給所有必須信任客戶端的根證書,可以根據(jù)需要調(diào)整-days標(biāo)志的值。 ?
必須在提示符上自定義字段,例如,使用如下內(nèi)容:C=IT, O=CompanyName, CN=company.com/emailAddress=example@company.com,并可選地檢查根CA證書:?
此時(shí),我們需要為每個(gè)服務(wù)器、設(shè)備或應(yīng)用程序創(chuàng)建證書,這些服務(wù)器、設(shè)備或應(yīng)用程序需要通過CA信任的證書公開TLS加密的服務(wù)。在本例中,我們將把該證書分配給Vault集群,因此將在每個(gè)Vault節(jié)點(diǎn)上使用相同的證書。?
要完成這一過程,使用所有可選名稱(可以是URL或IP)創(chuàng)建一個(gè)extfile;在本例中,使用每個(gè)Vault節(jié)點(diǎn)的IP,然后使用CSR和密鑰以及CA根密鑰生成證書。?
除其他次要文件外,現(xiàn)在應(yīng)確保在當(dāng)前工作文件夾中包含以下生成的文件:?
PKI文件必須通過專用變量傳遞給Ansible角色以及下面建議的一些其他配置,然后通過將Vault角色分配給服務(wù)器節(jié)點(diǎn)來啟動(dòng)Vault配置。?
如果使用自簽名CA,還需要一個(gè)步驟:必須將其復(fù)制并安裝到每個(gè)節(jié)點(diǎn)中,可以通過以下方法輕松完成此任務(wù):?
最后,初始化Vault集群,打開它,使用初始化階段返回的令牌登錄,并檢查它的狀態(tài);如果一切正常,那么轉(zhuǎn)到下一個(gè)陷阱:在新的集群上啟用和配置TLS。?
配置TLS
在本節(jié)中,將詳細(xì)介紹為在集群中運(yùn)行的基礎(chǔ)設(shè)施組件(例如Consul和Nomad代理)和應(yīng)用程序容器啟用安全集群通信的過程。因此,我們將在mTLS驗(yàn)證之上,使用TLS加密和服務(wù)驗(yàn)證來保護(hù)Consul Agent通信。這可以使用從Vault集群生成的證書來完成;此外,在本例中,證書將在服務(wù)器上通過Consul Template分發(fā),在客戶端通過自動(dòng)加密方法分發(fā)。 ?
需求
所有與證書更新和Consul、Nomad代理以及Vault之間的輪換相關(guān)的秘訣都掌握在Consul Template所需的組件中??梢苑窒硪幌翯itHub頁面的參考,并簡要地給一些關(guān)于如何安裝和配置它的提示,因?yàn)榈侥壳盀橹?,在網(wǎng)上找不到完整的指南: ?
在每個(gè)集群節(jié)點(diǎn)的主節(jié)點(diǎn)中下載并解壓縮二進(jìn)制文件?
在systemd的每個(gè)節(jié)點(diǎn)上創(chuàng)建單元文件:?
最后,將其提升為systemd下的系統(tǒng)服務(wù),并為consul-template配置文件創(chuàng)建一個(gè)文件夾。?
Consul模板的主框架現(xiàn)在準(zhǔn)備好了。在接下來的步驟中,需要做的就是為每個(gè)請(qǐng)求證書輪換的服務(wù)創(chuàng)建配置文件和模板文件。?
配置Consul TLS和Consul Connect
可以很容易地遵循下面的循序漸進(jìn)的教程,這些教程非常詳細(xì),只需要針對(duì)具體情況進(jìn)行微小而明顯的調(diào)整:?
- 配置Vault的PKI機(jī)密引擎。 ?
- 配置Vault為Consul的CA,在每個(gè)節(jié)點(diǎn)上安裝Consul中間CA。?
- 生成服務(wù)器證書。?
現(xiàn)在,在繼續(xù)Consul配置之前,我們需要啟用和配置Consul Connect功能,為此,我們首先需要啟用Vault作為Consul Connect認(rèn)證機(jī)構(gòu)提供商:Consul Connect創(chuàng)建的服務(wù)網(wǎng)格網(wǎng)絡(luò)中使用的證書將由Vault生成和管理。跳轉(zhuǎn)到以下教程,并確保選擇“自我管理”選項(xiàng)卡下的說明:Vault作為領(lǐng)事服務(wù)網(wǎng)格認(rèn)證機(jī)構(gòu)提供商。?
此時(shí),需要通過以下方式配置Consul:首先在/opt/consult/agent certs/下的客戶端和服務(wù)器上分發(fā)引導(dǎo)證書,然后使用update-ca-certificates實(shí)用程序?qū)onsul中間CA安裝到每個(gè)節(jié)點(diǎn)中,其方法與我們?cè)谏弦还?jié)中對(duì)Vault CA所做的類似。對(duì)于這些步驟,可以輕松地遵循Configure Consul教程。?
現(xiàn)在已經(jīng)在節(jié)點(diǎn)上分發(fā)了引導(dǎo)證書,可以通過將Consul配置分別放置在/etc/Consul中的服務(wù)器和客戶端上。首先在服務(wù)器上啟用TLS,然后在客戶端上啟用TLS。d/folder并重新啟動(dòng)Consul代理。?
在每個(gè)節(jié)點(diǎn)上重新啟動(dòng)Consul代理,TLS上的API應(yīng)位于https://169.254.1.1:8501,但仍然需要通過Consul模板配置證書續(xù)訂,并設(shè)置mTLS身份驗(yàn)證。
配置Consul模板頁面將指導(dǎo)設(shè)置模板文件,這里應(yīng)該注意一個(gè)小細(xì)節(jié):鑒于在我們的集群中,Consul代理正在監(jiān)聽特殊的dummy0接口,我們需要通過模板機(jī)制創(chuàng)建適當(dāng)?shù)淖C書,在每個(gè)模板文件中添加自定義的ip_sans。為方便起見,以下是服務(wù)器代理證書的模板示例:?
最后,只需要?jiǎng)?chuàng)建一個(gè)consul-template配置文件,這里唯一的建議是對(duì)服務(wù)器節(jié)點(diǎn)使用address="http://localhost:8200"和address="https://active.vault.service。Consul:客戶節(jié)點(diǎn)為8200英寸。通過這種方式,服務(wù)器將擁有更穩(wěn)定的配置,因?yàn)樵贑onsul無法工作和DNS解析不可用的情況下,與Vault的通信也可以工作。 ?
要執(zhí)行最終檢查TLS證書輪換是否按預(yù)期工作,應(yīng)該等待24小時(shí),等待在Vault中創(chuàng)建證書時(shí)選擇的TTL。測(cè)試每個(gè)節(jié)點(diǎn)上已覆蓋的證書可以用這個(gè)相當(dāng)簡單的Ansible命令完成。?
此外,還可以使用OpenSSL,檢查RPC或API端口上使用的證書。?
最后,嘗試使用來自服務(wù)器節(jié)點(diǎn)的正確證書在API上進(jìn)行連接。?
配置Nomad TLS
將Nomad配置為使用TLS的過程非常簡單,因?yàn)槲覀冃枰獔?zhí)行與Consul配置相同的步驟。供參考的官方教程是使用Vault為Nomad生成mTLS證書,我們將在下面描述一些將省去一些麻煩的調(diào)整。?
首先,就像我們?yōu)镃onsul所做的那樣,在Consul模板中,我們需要添加ip_sans,但在這種情況下,我們還需要添加127.0.0.1,因?yàn)镹omad也將在該接口上從服務(wù)(例如:Nomad Autoscaler)聯(lián)系。以下是我們的例子:?
值得注意的是,Nomad的Consul模板配置可以附加到現(xiàn)有的配置文件中,因?yàn)槲覀円呀?jīng)將其用于Consul了。?
假設(shè)Consul Template將用于從不同的Vault路徑檢索Consul和Nomad證書,最好創(chuàng)建一個(gè)新策略,并創(chuàng)建一個(gè)具有這兩種權(quán)限的新令牌。?
當(dāng)然,這個(gè)令牌必須在每個(gè)節(jié)點(diǎn)上的Consul Template配置文件中替換。 ?
就像我們?yōu)镃onsul所做的那樣,為了方便,我們共享了應(yīng)該放在/etc/nomad中的文件。d/以便在服務(wù)器節(jié)點(diǎn)上啟用NomadTLS。對(duì)于客戶機(jī)節(jié)點(diǎn),只需刪除最后一行。 ?
當(dāng)?shù)谝淮沃匦录虞dNomad代理時(shí),記住在服務(wù)器節(jié)點(diǎn)上將rpc_upgrade_mode選項(xiàng)更改為false,以便Nomad服務(wù)器將只接受TLS連接,然后再次重新啟動(dòng)服務(wù)。?
只需要幾個(gè)步驟就可以完全完成Nomad配置:i)允許訪問webUI,ii)啟用邊車使用TLS,以及iii)測(cè)試是否一切都按預(yù)期工作。 ?
啟用TLS時(shí),為了訪問Web-UI,需要在服務(wù)器上將verify_https_client設(shè)置為false,并重新啟動(dòng)nomad服務(wù)。要了解更多信息,發(fā)現(xiàn)這篇文章非常有用。?
現(xiàn)在應(yīng)該能夠連接到https://localhost:4646/ui,但是要記住的是,對(duì)于生產(chǎn)環(huán)境,應(yīng)該使用Vault根CA配置其瀏覽器,以便提供受支持的對(duì)等身份驗(yàn)證。?
第二步是讓邊車使用Consul connect提供的TLS保護(hù)網(wǎng)格:為了初始化TLS保護(hù)網(wǎng)格中的通道,Nomad需要與Consul通信,并在邊車中注入正確的證書,以建立受保護(hù)的連接。?
為此,更新/etc/nomad.d/base.中的Nomad配置并允許Nomad通過TLS與Consul API通信,添加以下行:?
希望是到了最后的測(cè)試階段。實(shí)際上,如果輸入了nomad status命令,會(huì)收到一個(gè)錯(cuò)誤消息,因?yàn)樾枰_配置CLI。?
導(dǎo)出端點(diǎn)和證書變量:?
最后,通過TLS再次檢查狀態(tài),nomadstatus命令現(xiàn)在應(yīng)該無縫工作了。 ?
配置Consul ACL
下面的最后一步將在我們的集群上啟用Consul訪問控制列表系統(tǒng)。該任務(wù)的主要參考資料是HashiCorp關(guān)于引導(dǎo)ACL系統(tǒng)的教程。 ?
啟用ACL
在啟用ACL系統(tǒng)的過程中,遇到了一個(gè)小問題,如果多個(gè)節(jié)點(diǎn)同時(shí)處于活動(dòng)狀態(tài),則無法引導(dǎo)它。小問題可以用簡單的解決方案解決:為什么不在啟用ACL之前暫時(shí)將集群縮小到一個(gè)節(jié)點(diǎn)?作為“懶惰的開發(fā)人員”,所以一個(gè)粗糙但有效的bash循環(huán)和SSH幫助我們做到了這一點(diǎn):?
現(xiàn)在復(fù)制以下Consul HCL配置文件,然后將ACL引導(dǎo)到單節(jié)點(diǎn)Consul集群中:?
Consul將回復(fù)一條成功的消息,并允許我們繼續(xù)保存Consul引導(dǎo)令牌,并通過重新啟動(dòng)Consul代理將其他節(jié)點(diǎn)重新加入原始集群。?
此時(shí),如果集群中只有服務(wù)器節(jié)點(diǎn)可用(使用:consul成員進(jìn)行檢查),并且看到Vault、Consul和Nomad代理不再工作;這很正常,因?yàn)樗鼈儧]有適當(dāng)?shù)腁CL策略和相對(duì)令牌。按照下面的步驟,將修復(fù)它。 ?
ACL與Vault集成
與Vault的集成非常簡單。只需要從適當(dāng)?shù)腃onsul策略生成一個(gè)令牌,并再次運(yùn)行Ansible Vault角色,在設(shè)置一個(gè)額外的Ansible額外變量后,一次更新所有的節(jié)點(diǎn):?
與Consul和Nomad代理集成ACL
與其他組件的集成可以遵循官方教程按照以下順序輕松完成。?
(1)為Consul節(jié)點(diǎn)和代理創(chuàng)建規(guī)則、策略和令牌。 ?
(2)為用戶界面(UI)創(chuàng)建規(guī)則、策略和令牌。 ?
(3)為DNS創(chuàng)建規(guī)則、策略和令牌;為簡單起見,我們只是將這個(gè)策略與點(diǎn)1)處的策略合并,并為下面模板開始的每個(gè)節(jié)點(diǎn)生成: ?
(4)為Nomad創(chuàng)建規(guī)則、策略和令牌?
ACL策略完全啟用
現(xiàn)在強(qiáng)制ACL在默認(rèn)情況下拒絕通信,最后在每個(gè)節(jié)點(diǎn)上重新啟動(dòng)Consul。?
結(jié)論
此時(shí),基于HashiCorp產(chǎn)品的“安全邊緣基礎(chǔ)設(shè)施”應(yīng)該已經(jīng)啟動(dòng)并運(yùn)行,可以開始安裝首選的工作負(fù)載。在這個(gè)例子中,在這個(gè)部署上安裝了一層中間件,支持負(fù)載平衡、監(jiān)視和自動(dòng)擴(kuò)展等特性。為了實(shí)現(xiàn)最后一個(gè)目標(biāo),我們分別使用Traefik、Prometheus和Nomad自動(dòng)擴(kuò)展器,可以想象,為了讓這些工具在完整的TLS基礎(chǔ)設(shè)施上正常工作,還需要額外的配置,但這將是另一篇文章的主題。 ?
總之,我們分享這項(xiàng)工作的可能演變,我們認(rèn)為這是很自然的:鑒于在跨組件的通信和身份驗(yàn)證方面,基礎(chǔ)設(shè)施被認(rèn)為是相當(dāng)安全的,為什么不將其用作構(gòu)建混合基礎(chǔ)設(shè)施的支柱,其中控制平臺(tái)節(jié)點(diǎn)位于所選擇的云中,而數(shù)據(jù)平臺(tái)服務(wù)器位于邊緣? ?
有了這樣的架構(gòu),將擁有一個(gè)毫無疑問的優(yōu)勢(shì),即能夠通過一個(gè)控制平臺(tái)來控制多個(gè)邊緣站點(diǎn),從而消除開銷,并實(shí)現(xiàn)企業(yè)的規(guī)模經(jīng)濟(jì)。當(dāng)然,應(yīng)該對(duì)系統(tǒng)進(jìn)行適當(dāng)?shù)姆謪^(qū),以支持多租戶,這肯定是下一個(gè)令人興奮的項(xiàng)目。
原文標(biāo)題:??How To Use Hashicorp Tools To Create a Secured Edge Infrastructure??,作者:Daniele Santoro