如果您的組織使用SSH公鑰,則你完全可能已經(jīng)遺失一個(gè)了。備份文件或前雇員的計(jì)算機(jī)上有一個(gè)文件,該文件允許持有者訪問(wèn)您的基礎(chǔ)設(shè)施。如果您在員工之間共享SSH密鑰,那么很可能只有幾個(gè)密鑰就足以讓攻擊者訪問(wèn)您的整個(gè)系統(tǒng)。如果您不共享它們,很可能您的團(tuán)隊(duì)已經(jīng)生成了太多的密鑰,以至于至少有一個(gè)是您很長(zhǎng)時(shí)間都找不到的了。
如果攻擊者可以破壞您的一個(gè)客戶端設(shè)備,那么很可能存在一個(gè)known_hosts文件,其中列出了可以通過(guò)計(jì)算機(jī)已經(jīng)包含的密鑰輕松訪問(wèn)的每個(gè)目標(biāo)。如果有人能夠侵入團(tuán)隊(duì)成員的筆記本電腦,他們可以使用設(shè)備上缺乏密碼保護(hù)的密鑰到達(dá)敏感目的地。
如果發(fā)生了這種情況,您將如何響應(yīng)并撤銷丟失的SSH密鑰呢?您是否對(duì)生成的密鑰有所了解?您是否旋轉(zhuǎn)SSH密鑰?您如何在整個(gè)組織中管理秘鑰,從而使得在忙于為客戶提供服務(wù)的過(guò)程中可以毫不費(fèi)力地確保安全性?
Cloudflare Access去年推出了對(duì)SSH連接的支持,為團(tuán)隊(duì)連接基礎(chǔ)設(shè)施帶來(lái)了零信任安全。Access與IdP集成在一起,通過(guò)在用戶每次嘗試連接目標(biāo)資源時(shí)強(qiáng)制執(zhí)行基于身份的規(guī)則,將SSO(Single-Sign-On,單點(diǎn)登錄)安全性引入SSH連接。
但是,一旦Access將用戶連接到服務(wù)器,他們?nèi)匀槐仨氁蕾囘z留的SSH密鑰來(lái)授權(quán)他們的帳戶。從今天開(kāi)始,我們很高興能夠幫助團(tuán)隊(duì)刪除該要求,并使用短期證書(shū)替換靜態(tài)SSH密鑰。
使用Cloudflare Access替換私有網(wǎng)絡(luò)
在傳統(tǒng)的網(wǎng)絡(luò)邊界模型中,團(tuán)隊(duì)使用兩個(gè)門(mén)來(lái)保護(hù)其基礎(chǔ)設(shè)施:私有網(wǎng)絡(luò)和SSH密鑰。
私有網(wǎng)絡(luò)要求任何試圖連接到服務(wù)器的用戶必須位于相同的網(wǎng)絡(luò)上,或者處于相同的位置(例如VPN)。然而,這也帶來(lái)了一些風(fēng)險(xiǎn)。私有網(wǎng)絡(luò)默認(rèn)信任網(wǎng)絡(luò)上的用戶可以訪問(wèn)計(jì)算機(jī)。管理員必須主動(dòng)對(duì)網(wǎng)絡(luò)進(jìn)行分段,或者使用控制列表保護(hù)基礎(chǔ)設(shè)施的每個(gè)部分,以便從該默認(rèn)狀態(tài)往后工作。
Cloudflare Access則從另一個(gè)方向開(kāi)始來(lái)保護(hù)基礎(chǔ)架構(gòu)的安全:不信任任何用戶。相反,用戶必須證明,在默認(rèn)情況下,他們應(yīng)該能夠訪問(wèn)任何唯一的機(jī)器或目的地。
我們?nèi)ツ暝贑loudflare Access中發(fā)布了對(duì)SSH連接的支持,以幫助團(tuán)隊(duì)離開(kāi)網(wǎng)絡(luò)邊界模型,并將其替換為評(píng)估對(duì)服務(wù)器的每個(gè)用戶身份請(qǐng)求的模型。通過(guò)與流行的身份提供程序集成,該解決方案還允許團(tuán)隊(duì)將其SSO管道引入SSH流中。
用短期證書(shū)替換靜態(tài)SSH密鑰
一旦用戶通過(guò)SSH連接到服務(wù)器,他們通常需要授權(quán)他們的會(huì)話。他們嘗試訪問(wèn)的計(jì)算機(jī)將具有一組配置文件,其中包含用戶或角色標(biāo)識(shí)。這些配置文件定義了用戶可以執(zhí)行的操作。
SSH進(jìn)程為用戶登錄配置文件提供了一些選項(xiàng)。在某些情況下,用戶可以使用用戶名和密碼組合登錄。然而,大多數(shù)團(tuán)隊(duì)依賴于公鑰——私鑰證書(shū)來(lái)處理登錄。要使用該流,管理員和用戶需要采取必要的步驟。
在連接之前,用戶將生成一個(gè)證書(shū)并將公鑰提供給管理員,管理員將配置服務(wù)器以信任該證書(shū),并將其與某個(gè)用戶和一組權(quán)限關(guān)聯(lián)起來(lái)。用戶將該證書(shū)存儲(chǔ)在其設(shè)備上,并在最后一英里內(nèi)出示該證書(shū)。然而,這留下了SSO試圖解決的所有問(wèn)題:
大多數(shù)團(tuán)隊(duì)從不強(qiáng)迫用戶更換證書(shū)。如果他們這樣做了,可能每年最多需要一次。這使得對(duì)應(yīng)核心基礎(chǔ)設(shè)施的靜態(tài)憑證滯留在數(shù)千臺(tái)設(shè)備上。
用戶有責(zé)任在他們的設(shè)備上保護(hù)他們的證書(shū)。用戶也要對(duì)密碼負(fù)責(zé),但是組織可以集中執(zhí)行請(qǐng)求和撤銷。
證書(shū)吊銷是不易操作的。團(tuán)隊(duì)必須管理一個(gè)CRL(證書(shū)吊銷列表)或OCSP(在線證書(shū)狀態(tài)協(xié)議)平臺(tái),以確保丟失或被盜的證書(shū)不會(huì)被使用。
借助Cloudflare Access,您可以將SSO帳戶帶入基礎(chǔ)架構(gòu)中的用戶身份驗(yàn)證。不需要靜態(tài)密鑰。
它是如何工作的?
為了構(gòu)建這個(gè)平臺(tái),我們求助于已有的三個(gè)工具:Cloudflare Access、Argo Tunnel和Workers。
Access是一個(gè)策略引擎,它將您的身份提供程序(如Okta或AzureAD)中的員工數(shù)據(jù)與您制定的策略結(jié)合在一起?;谶@些策略,Access能夠?qū)?duì)內(nèi)部應(yīng)用程序的訪問(wèn)限制在您選擇的用戶范圍內(nèi)。不難看出使用相同的策略概念通過(guò)SSH控制對(duì)服務(wù)器的訪問(wèn)也是可行的。您編寫(xiě)了一項(xiàng)政策,我們將使用它來(lái)決定您的哪些雇員應(yīng)該能夠訪問(wèn)哪些資源。然后,我們生成一個(gè)短期證書(shū),允許他們僅在最短的時(shí)間內(nèi)訪問(wèn)該資源。如果您從IdP中刪除一個(gè)用戶,他們對(duì)您的基礎(chǔ)設(shè)施的訪問(wèn)權(quán)也將被無(wú)縫地刪除。
為了讓流量通過(guò)我們的網(wǎng)絡(luò),我們使用了另一個(gè)現(xiàn)有的Cloudflare工具:Argo隧道。Argo隧道顛覆了傳統(tǒng)的將服務(wù)器連接到互聯(lián)網(wǎng)的模式。當(dāng)您在一臺(tái)機(jī)器上啟動(dòng)我們的守護(hù)進(jìn)程時(shí),它會(huì)向Cloudflare發(fā)出出站連接,然后您的所有流量都將流經(jīng)這些連接。這允許計(jì)算機(jī)成為Cloudflare網(wǎng)絡(luò)的一部分,而不必直接將計(jì)算機(jī)暴露給互聯(lián)網(wǎng)。
對(duì)于HTTP用例,Argo隧道僅需要在服務(wù)器上運(yùn)行。對(duì)于Access SSH流,我們?cè)诜?wù)器和最終用戶筆記本電腦上運(yùn)行Argo Tunnel客戶端——cloudflared,通過(guò)Cloudflare代理SSH流量。
當(dāng)用戶通過(guò)SSH連接到受Access for Infrastructure保護(hù)的資源時(shí),他們將使用命令行工具cloudflared。cloudflared接收綁定到該主機(jī)名的SSH流量,并根據(jù)SSH配置設(shè)置通過(guò)Cloudflare轉(zhuǎn)發(fā)該流量。無(wú)需管道或命令包裝。cloudflared啟動(dòng)瀏覽器窗口,并提示用戶使用其SSO憑據(jù)進(jìn)行身份驗(yàn)證。
一旦通過(guò)身份驗(yàn)證,Access將根據(jù)您為該應(yīng)用程序配置的策略檢查用戶的身份。如果允許用戶訪問(wèn)資源,則Access將生成一個(gè)JSON Web令牌(JWT),該令牌由Cloudflare簽名,作用域?yàn)橛脩艉蛻?yīng)用程序。Access通過(guò)cloudflared將該令牌分發(fā)給用戶的設(shè)備,該工具將其存儲(chǔ)在本地。
像核心訪問(wèn)身份驗(yàn)證流程一樣,令牌驗(yàn)證是通過(guò)在我們每個(gè)數(shù)據(jù)中心中運(yùn)行的Cloudflare Worker構(gòu)建的,這使得它既快速又高度可用。Worker使我們能夠?qū)⑦@種SSH代理部署到Cloudflare的所有194個(gè)數(shù)據(jù)中心,這意味著對(duì)基礎(chǔ)設(shè)施的訪問(wèn)通常會(huì)加快SSH會(huì)話,而不是減慢它們。
啟用了短期證書(shū)后,在客戶端上運(yùn)行cloudflared實(shí)例需要執(zhí)行一個(gè)額外的步驟。cloudflared將該令牌發(fā)送到創(chuàng)建臨時(shí)證書(shū)的Cloudflare證書(shū)簽名端點(diǎn)。然后,用戶的SSH流將同時(shí)發(fā)送令牌(用于通過(guò)Access進(jìn)行身份驗(yàn)證)和短期證書(shū)(用于對(duì)服務(wù)器進(jìn)行身份驗(yàn)證)。
當(dāng)服務(wù)器接收到請(qǐng)求時(shí),它將根據(jù)該公鑰驗(yàn)證生存期較短的證書(shū),如果證書(shū)是真實(shí)的,則將用戶標(biāo)識(shí)授權(quán)給匹配的Unix用戶。證書(shū)一旦發(fā)出,有效期只有2分鐘,但是一旦會(huì)話啟動(dòng),SSH連接可以持續(xù)更長(zhǎng)時(shí)間。
最終用戶體驗(yàn)如何?
Cloudflare Access的SSH功能對(duì)最終用戶完全透明,并且不需要任何唯一的SSH命令,包裝程序或標(biāo)志。相反,Access要求您的團(tuán)隊(duì)成員采取幾個(gè)一次性的步驟來(lái)開(kāi)始:
1.安裝cloudflared守護(hù)程序
這是在目標(biāo)服務(wù)器上運(yùn)行的相同的輕量級(jí)軟件,用于通過(guò)Cloudflare代理來(lái)自團(tuán)隊(duì)成員設(shè)備的SSH連接。用戶可以使用流行的軟件包管理器(例如brew)或通過(guò)此處的鏈接進(jìn)行安裝。另外,該軟件是開(kāi)源的,可以由管理員構(gòu)建和分發(fā)。
2.打印SSH配置更新并保存
最終用戶安裝后cloudflared,他們需要運(yùn)行一個(gè)命令來(lái)生成新的行來(lái)添加到其SSH配置文件中:
cloudflared access ssh-config--hostname vm.example.com--short-lived-cert
該——hostname字段將包含訪問(wèn)后受保護(hù)的資源的主機(jī)名或通配符子域。一旦運(yùn)行,cloudflared將打印以下詳細(xì)配置信息:
Host vm.example.com ProxyCommand bash -c '/usr/local/bin/cloudflared access ssh-gen --hostname %h; ssh -tt %r@cfpipe-vm.example.com >&2 <&1' Host cfpipe-vm.example.com HostName vm.example.com ProxyCommand /usr/local/bin/cloudflared access ssh --hostname %h IdentityFile ~/.cloudflared/vm.example.com-cf_key CertificateFile ~/.cloudflared/vm.example.com-cf_key-cert.pup
用戶需要將輸出附加到他們的SSH配置文件中。一旦保存,它們就可以通過(guò)SSH連接到受保護(hù)的資源。Access將提示他們使用瀏覽器中的SSO憑據(jù)進(jìn)行身份驗(yàn)證,就像他們登錄到其他任何基于瀏覽器的工具一樣。如果他們已經(jīng)使用其憑據(jù)進(jìn)行了有效的瀏覽器會(huì)話,則只會(huì)看到成功頁(yè)面。
在他們的終端中,cloudflared將建立會(huì)話并頒發(fā)與其身份相對(duì)應(yīng)的客戶端證書(shū)。