隨著容器的持續(xù)流行,將應(yīng)用改造成云上的微服務(wù),對(duì)于很多希望IT運(yùn)營(yíng)更加敏捷高效的企業(yè)來說是顯而易見的下一步。但是,在容器化應(yīng)用并且部署之前,需要首先確保你的應(yīng)用是安全的。云托管的微服務(wù)所帶來的安全挑戰(zhàn),和傳統(tǒng)應(yīng)用情況并不完全一樣,我們必須妥善解決這些問題,避免暴露重大的安全漏洞。
1.什么讓微服務(wù)如此不同
要理解為什么必須保護(hù)微服務(wù),比如那些運(yùn)行在Docker容器里的應(yīng)用,你首先需要理解微服務(wù)和傳統(tǒng)應(yīng)用之間的主要區(qū)別。
傳統(tǒng)來說,程序員構(gòu)建“單體”應(yīng)用。也就是說應(yīng)用使用的整個(gè)軟件堆棧被組織成一個(gè)單一的可交付的實(shí)體。比如,你的團(tuán)隊(duì)可能已經(jīng)通過編寫前端代碼為應(yīng)用構(gòu)建了web應(yīng)用,將其和MySQL數(shù)據(jù)庫(kù)集成來存儲(chǔ)數(shù)據(jù),并且將所有東西打包到一個(gè)基于Linux的虛擬機(jī)鏡像里,從而可以將其部署到公有云服務(wù),比如AWS或者Azure上。
微服務(wù)方案通過將應(yīng)用分解成模塊化碎片改變了這一切。它們是分布式的,并且通常并不依賴于特定類型的操作系統(tǒng)來運(yùn)行。這意味著上述描述的應(yīng)用并不會(huì)以虛擬機(jī)鏡像的形式分發(fā)。相反,前端代碼可以被打包進(jìn)一個(gè)容器鏡像。數(shù)據(jù)庫(kù)可以運(yùn)行在單獨(dú)的容器里。所有這些容器都在Docker或者其他容器平臺(tái)上運(yùn)行,并且底層操作系統(tǒng)或者托管它們的云環(huán)境和容器本身并不相關(guān)。
2.微服務(wù)和安全
微服務(wù)消除了一些和單體應(yīng)用相關(guān)的安全挑戰(zhàn)。它們讓應(yīng)用環(huán)境更加一致,簡(jiǎn)化了安全監(jiān)控。它們還增加了應(yīng)用不同部分之間的隔離性,降低了入侵應(yīng)用的一部分就可以控制整個(gè)堆棧的風(fēng)險(xiǎn)。并且它們可以幫助提供抵御分布式拒絕服務(wù)攻擊的彈性,因?yàn)槿萜骺梢詭砀蟮撵`活性和可擴(kuò)展性,并且能夠更好地抵御通過向服務(wù)器發(fā)送過多請(qǐng)求來摧毀其基礎(chǔ)架構(gòu)的攻擊。
保護(hù)微服務(wù)架構(gòu)時(shí)也會(huì)遇到一些挑戰(zhàn)。包括:
更大的攻擊面。有更多的組件意味著有更多黑客可以利用的可能漏洞。比如,單體軟件堆棧可能不依賴于網(wǎng)絡(luò)在前端應(yīng)用和數(shù)據(jù)庫(kù)之間發(fā)送信息,而容器通常是這么做的。這帶來了新的可能的攻擊向量。
更少的內(nèi)部一致性。微服務(wù)的優(yōu)勢(shì)之一是它們?cè)试S開發(fā)人員在開發(fā)語(yǔ)言和框架間輕松改變。比如,如果你目前用PHP開發(fā)應(yīng)用,但是想切換成Go,那么當(dāng)應(yīng)用前端和堆棧其他部分解耦合時(shí)就很容易完成這樣的切換。但是應(yīng)用內(nèi)部可以按照開發(fā)人員喜好頻繁改動(dòng)的事實(shí)也意味著更少的一致性。無(wú)論何時(shí)發(fā)生變化,也正是新的安全漏洞可能產(chǎn)生之時(shí)。
現(xiàn)有工具無(wú)法保護(hù)微服務(wù)。大部分目前可用的久經(jīng)考驗(yàn)的安全工具都是在微服務(wù)變革之前設(shè)計(jì)的。新的方案正在涌現(xiàn),但是目前的事實(shí)是,很多漏洞掃描工具在容器或者其他基于微服務(wù)的應(yīng)用上無(wú)法正常工作。
全新的信任關(guān)系。容器化基礎(chǔ)架構(gòu)的優(yōu)勢(shì)之一是可以從公開存儲(chǔ)庫(kù)里免費(fèi)快速地下載并且部署容器鏡像。想要搭建MySQL數(shù)據(jù)庫(kù)或者Ubuntu Linux服務(wù)器?一個(gè)簡(jiǎn)單的docker --pull 命令就能夠在幾秒內(nèi)獲得所需的容器鏡像。缺點(diǎn)正是這些來自于公開存儲(chǔ)庫(kù)的容器鏡像。這并不意味著這些鏡像不安全,但是的確意味著如果使用這些鏡像,你就和堆棧里的第三方軟件合并了。你無(wú)法保證不受你控制的代碼的安全性。
3.保護(hù)微服務(wù)的步驟
制定正確的策略,可以減輕在云上運(yùn)行微服務(wù)架構(gòu)的應(yīng)用程序相關(guān)的安全風(fēng)險(xiǎn)。如下步驟特別有效:
保護(hù)內(nèi)部環(huán)境。雖然微服務(wù)涉及更多部分,但是可以通過確保托管微服務(wù)的環(huán)境的盡可能安全來降低總體安全風(fēng)險(xiǎn)。如果在云上運(yùn)行Docker 環(huán)境,這意味著確保除了你沒有其他人能夠訪問你的云主機(jī),并且除非必要,將 Docker容器配置成拒絕公開網(wǎng)絡(luò)的連接。
使用安全掃描器。大部分傳統(tǒng)的安全工具仍然在嘗試適用微服務(wù)的過程中。但是已經(jīng)有一些好用的工具可用,比如Docker Security Scanning和CoreOS的Clair。這些工具幫助你尋找并且解決容器內(nèi)的安全漏洞。
使用訪問控制。可以在軟件堆棧的不同層面使用訪問控制限制來降低安全風(fēng)險(xiǎn)。比如,在管理層面,必須確保能夠運(yùn)行Docker命令的用戶才有執(zhí)行Unix系統(tǒng)的Docker CLI工具的權(quán)限。還可以在大部分容器存儲(chǔ)庫(kù)里配置訪問權(quán)限,避免公開的訪問。
確保溝通。確保負(fù)責(zé)構(gòu)建并且部署企業(yè)軟件的團(tuán)隊(duì)的所有成員不斷地溝通,而不是各自為戰(zhàn)。這樣能夠確保運(yùn)維的所有人都知道upstream或者downstream所發(fā)生的變化——以及可能的安全隱患。
越來越多的企業(yè)開始向基于DevOps的工作流和容器這樣的技術(shù)轉(zhuǎn)變,微服務(wù)的安全會(huì)變得越來越容易管理。但是,現(xiàn)在,微服務(wù)能使用的安全工具的缺失意味著企業(yè)需要特別前瞻性地保護(hù)計(jì)劃在微服務(wù)架構(gòu)下運(yùn)行的軟件。