Linux容器安全的10個層面
應(yīng)用這些策略來保護容器解決方案的各個層面和容器生命周期的各個階段的安全。
容器提供了打包應(yīng)用程序的一種簡單方法,它實現(xiàn)了從開發(fā)到測試到投入生產(chǎn)系統(tǒng)的無縫傳遞。它也有助于確??绮煌h(huán)境的連貫性,包括物理服務(wù)器、虛擬機、以及公有云或私有云。這些好處使得一些組織為了更方便地部署和管理為他們提升業(yè)務(wù)價值的應(yīng)用程序,而快速地采用了容器技術(shù)。
企業(yè)需要高度安全,在容器中運行核心服務(wù)的任何人都會問,“容器安全嗎?”以及“我們能信任運行在容器中的應(yīng)用程序嗎?”
對容器進行安全保護就像是對運行中的進程進行安全保護一樣。在你部署和運行你的容器之前,你需要去考慮整個解決方案各個層面的安全。你也需要去考慮貫穿了應(yīng)用程序和容器整個生命周期的安全。
請嘗試從這十個關(guān)鍵的因素去確保容器解決方案棧不同層面、以及容器生命周期的不同階段的安全。
1. 容器宿主機操作系統(tǒng)和多租戶環(huán)境
由于容器將應(yīng)用程序和它的依賴作為一個單元來處理,使得開發(fā)者構(gòu)建和升級應(yīng)用程序變得更加容易,并且,容器可以啟用多租戶技術(shù)將許多應(yīng)用程序和服務(wù)部署到一臺共享主機上。在一臺單獨的主機上以容器方式部署多個應(yīng)用程序、按需啟動和關(guān)閉單個容器都是很容易的。為完全實現(xiàn)這種打包和部署技術(shù)的優(yōu)勢,運營團隊需要運行容器的合適環(huán)境。運營者需要一個安全的操作系統(tǒng),它能夠在邊界上保護容器安全、從容器中保護主機內(nèi)核,以及保護容器彼此之間的安全。
容器是隔離而資源受限的 Linux 進程,允許你在一個共享的宿主機內(nèi)核上運行沙盒化的應(yīng)用程序。保護容器的方法與保護你的 Linux 中運行的任何進程的方法是一樣的。降低權(quán)限是非常重要的,也是保護容器安全的最佳實踐。最好使用盡可能小的權(quán)限去創(chuàng)建容器。容器應(yīng)該以一個普通用戶的權(quán)限來運行,而不是 root 權(quán)限的用戶。在 Linux 中可以使用多個層面的安全加固手段,Linux 命名空間、安全強化 Linux(SELinux)、cgroups 、capabilities(LCTT 譯注:Linux 內(nèi)核的一個安全特性,它打破了傳統(tǒng)的普通用戶與 root 用戶的概念,在進程級提供更好的安全控制)、以及安全計算模式( seccomp ),這五種 Linux 的安全特性可以用于保護容器的安全。
2. 容器內(nèi)容(使用可信來源)
在談到安全時,首先要考慮你的容器里面有什么?例如 ,有些時候,應(yīng)用程序和基礎(chǔ)設(shè)施是由很多可用組件所構(gòu)成的。它們中的一些是開源的軟件包,比如,Linux 操作系統(tǒng)、Apache Web 服務(wù)器、Red Hat JBoss 企業(yè)應(yīng)用平臺、PostgreSQL,以及 Node.js。這些軟件包的容器化版本已經(jīng)可以使用了,因此,你沒有必要自己去構(gòu)建它們。但是,對于你從一些外部來源下載的任何代碼,你需要知道這些軟件包的原始來源,是誰構(gòu)建的它,以及這些包里面是否包含惡意代碼。
3. 容器注冊(安全訪問容器鏡像)
你的團隊的容器構(gòu)建于下載的公共容器鏡像,因此,訪問和升級這些下載的容器鏡像以及內(nèi)部構(gòu)建鏡像,與管理和下載其它類型的二進制文件的方式是相同的,這一點至關(guān)重要。許多私有的注冊庫支持容器鏡像的存儲。選擇一個私有的注冊庫,可以幫你將存儲在它的注冊中的容器鏡像實現(xiàn)策略自動化。
4. 安全性與構(gòu)建過程
在一個容器化環(huán)境中,軟件構(gòu)建過程是軟件生命周期的一個階段,它將所需的運行時庫和應(yīng)用程序代碼集成到一起。管理這個構(gòu)建過程對于保護軟件棧安全來說是很關(guān)鍵的。遵守“一次構(gòu)建,到處部署”的原則,可以確保構(gòu)建過程的結(jié)果正是生產(chǎn)系統(tǒng)中需要的。保持容器的恒定不變也很重要 — 換句話說就是,不要對正在運行的容器打補丁,而是,重新構(gòu)建和部署它們。
不論是因為你處于一個高強度監(jiān)管的行業(yè)中,還是只希望簡單地優(yōu)化你的團隊的成果,設(shè)計你的容器鏡像管理以及構(gòu)建過程,可以使用容器層的優(yōu)勢來實現(xiàn)控制分離,因此,你應(yīng)該去這么做:
- 運營團隊管理基礎(chǔ)鏡像
- 架構(gòu)師管理中間件、運行時、數(shù)據(jù)庫,以及其它解決方案
- 開發(fā)者專注于應(yīng)用程序?qū)用?,并且只寫代碼
最后,標記好你的定制構(gòu)建容器,這樣可以確保在構(gòu)建和部署時不會搞混亂。
5. 控制好在同一個集群內(nèi)部署應(yīng)用
如果是在構(gòu)建過程中出現(xiàn)的任何問題,或者在鏡像被部署之后發(fā)現(xiàn)的任何漏洞,那么,請在基于策略的、自動化工具上添加另外的安全層。
我們來看一下,一個應(yīng)用程序的構(gòu)建使用了三個容器鏡像層:內(nèi)核、中間件,以及應(yīng)用程序。如果在內(nèi)核鏡像中發(fā)現(xiàn)了問題,那么只能重新構(gòu)建鏡像。一旦構(gòu)建完成,鏡像就會被發(fā)布到容器平臺注冊庫中。這個平臺可以自動檢測到發(fā)生變化的鏡像。對于基于這個鏡像的其它構(gòu)建將被觸發(fā)一個預(yù)定義的動作,平臺將自己重新構(gòu)建應(yīng)用鏡像,合并該修復(fù)的庫。
一旦構(gòu)建完成,鏡像將被發(fā)布到容器平臺的內(nèi)部注冊庫中。在它的內(nèi)部注冊庫中,會立即檢測到鏡像發(fā)生變化,應(yīng)用程序在這里將會被觸發(fā)一個預(yù)定義的動作,自動部署更新鏡像,確保運行在生產(chǎn)系統(tǒng)中的代碼總是使用更新后的最新的鏡像。所有的這些功能協(xié)同工作,將安全功能集成到你的持續(xù)集成和持續(xù)部署(CI/CD)過程和管道中。
6. 容器編配:保護容器平臺安全
當然了,應(yīng)用程序很少會以單一容器分發(fā)。甚至,簡單的應(yīng)用程序一般情況下都會有一個前端、一個后端、以及一個數(shù)據(jù)庫。而在容器中以微服務(wù)模式部署的應(yīng)用程序,意味著應(yīng)用程序?qū)⒉渴鹪诙鄠€容器中,有時它們在同一臺宿主機上,有時它們是分布在多個宿主機或者節(jié)點上,如下面的圖所示:
在大規(guī)模的容器部署時,你應(yīng)該考慮:
- 哪個容器應(yīng)該被部署在哪個宿主機上?
- 那個宿主機應(yīng)該有什么樣的性能?
- 哪個容器需要訪問其它容器?它們之間如何發(fā)現(xiàn)彼此?
- 你如何控制和管理對共享資源的訪問,像網(wǎng)絡(luò)和存儲?
- 如何監(jiān)視容器健康狀況?
- 如何去自動擴展性能以滿足應(yīng)用程序的需要?
- 如何在滿足安全需求的同時啟用開發(fā)者的自助服務(wù)?
考慮到開發(fā)者和運營者的能力,提供基于角色的訪問控制是容器平臺的關(guān)鍵要素。例如,編配管理服務(wù)器是中心訪問點,應(yīng)該接受最高級別的安全檢查。API 是規(guī)?;淖詣尤萜髌脚_管理的關(guān)鍵,可以用于為 pod、服務(wù),以及復(fù)制控制器驗證和配置數(shù)據(jù);在入站請求上執(zhí)行項目驗證;以及調(diào)用其它主要系統(tǒng)組件上的觸發(fā)器。
7. 網(wǎng)絡(luò)隔離
在容器中部署現(xiàn)代微服務(wù)應(yīng)用,經(jīng)常意味著跨多個節(jié)點在多個容器上部署??紤]到網(wǎng)絡(luò)防御,你需要一種在一個集群中的應(yīng)用之間的相互隔離的方法。一個典型的公有云容器服務(wù),像 Google 容器引擎(GKE)、Azure 容器服務(wù),或者 Amazon Web 服務(wù)(AWS)容器服務(wù),是單租戶服務(wù)。他們讓你在你初始化建立的虛擬機集群上運行你的容器。對于多租戶容器的安全,你需要容器平臺為你啟用一個單一集群,并且分割流量以隔離不同的用戶、團隊、應(yīng)用、以及在這個集群中的環(huán)境。
使用網(wǎng)絡(luò)命名空間,容器內(nèi)的每個集合(即大家熟知的 “pod”)都會得到它自己的 IP 和綁定的端口范圍,以此來從一個節(jié)點上隔離每個 pod 網(wǎng)絡(luò)。除使用下面所述的方式之外,默認情況下,來自不同命名空間(項目)的 pod 并不能發(fā)送或者接收其它 pod 上的包和不同項目的服務(wù)。你可以使用這些特性在同一個集群內(nèi)隔離開發(fā)者環(huán)境、測試環(huán)境,以及生產(chǎn)環(huán)境。但是,這樣會導致 IP 地址和端口數(shù)量的激增,使得網(wǎng)絡(luò)管理更加復(fù)雜。另外,容器是被設(shè)計為反復(fù)使用的,你應(yīng)該在處理這種復(fù)雜性的工具上進行投入。在容器平臺上比較受歡迎的工具是使用 軟件定義網(wǎng)絡(luò) (SDN) 提供一個定義的網(wǎng)絡(luò)集群,它允許跨不同集群的容器進行通訊。
8. 存儲
容器即可被用于無狀態(tài)應(yīng)用,也可被用于有狀態(tài)應(yīng)用。保護外加的存儲是保護有狀態(tài)服務(wù)的一個關(guān)鍵要素。容器平臺對多種受歡迎的存儲提供了插件,包括網(wǎng)絡(luò)文件系統(tǒng)(NFS)、AWS 彈性塊存儲(EBS)、GCE 持久磁盤、GlusterFS、iSCSI、 RADOS(Ceph)、Cinder 等等。
一個持久卷(PV)可以通過資源提供者支持的任何方式裝載到一個主機上。提供者有不同的性能,而每個 PV 的訪問模式被設(shè)置為特定的卷支持的特定模式。例如,NFS 能夠支持多路客戶端同時讀/寫,但是,一個特定的 NFS 的 PV 可以在服務(wù)器上被發(fā)布為只讀模式。每個 PV 有它自己的一組反應(yīng)特定 PV 性能的訪問模式的描述,比如,ReadWriteOnce、ReadOnlyMany、以及 ReadWriteMany。
9. API 管理、終端安全、以及單點登錄(SSO)
保護你的應(yīng)用安全,包括管理應(yīng)用、以及 API 的認證和授權(quán)。
Web SSO 能力是現(xiàn)代應(yīng)用程序的一個關(guān)鍵部分。在構(gòu)建它們的應(yīng)用時,容器平臺帶來了開發(fā)者可以使用的多種容器化服務(wù)。
API 是微服務(wù)構(gòu)成的應(yīng)用程序的關(guān)鍵所在。這些應(yīng)用程序有多個獨立的 API 服務(wù),這導致了終端服務(wù)數(shù)量的激增,它就需要額外的管理工具。推薦使用 API 管理工具。所有的 API 平臺應(yīng)該提供多種 API 認證和安全所需要的標準選項,這些選項既可以單獨使用,也可以組合使用,以用于發(fā)布證書或者控制訪問。
這些選項包括標準的 API key、應(yīng)用 ID 和密鑰對,以及 OAuth 2.0。
10. 在一個聯(lián)合集群中的角色和訪問管理
在 2016 年 7 月份,Kubernetes 1.3 引入了 Kubernetes 聯(lián)合集群。這是一個令人興奮的新特性之一,它是在 Kubernetes 上游、當前的 Kubernetes 1.6 beta 中引用的。聯(lián)合是用于部署和訪問跨多集群運行在公有云或企業(yè)數(shù)據(jù)中心的應(yīng)用程序服務(wù)的。多個集群能夠用于去實現(xiàn)應(yīng)用程序的高可用性,應(yīng)用程序可以跨多個可用區(qū)域,或者去啟用部署公共管理,或者跨不同的供應(yīng)商進行遷移,比如,AWS、Google Cloud、以及 Azure。
當管理聯(lián)合集群時,你必須確保你的編配工具能夠提供你所需要的跨不同部署平臺的實例的安全性。一般來說,認證和授權(quán)是很關(guān)鍵的 —— 不論你的應(yīng)用程序運行在什么地方,將數(shù)據(jù)安全可靠地傳遞給它們,以及管理跨集群的多租戶應(yīng)用程序。Kubernetes 擴展了聯(lián)合集群,包括對聯(lián)合的秘密數(shù)據(jù)、聯(lián)合的命名空間、以及 Ingress objects 的支持。
選擇一個容器平臺
當然,它并不僅關(guān)乎安全。你需要提供一個你的開發(fā)者團隊和運營團隊有相關(guān)經(jīng)驗的容器平臺。他們需要一個安全的、企業(yè)級的基于容器的應(yīng)用平臺,它能夠同時滿足開發(fā)者和運營者的需要,而且還能夠提高操作效率和基礎(chǔ)設(shè)施利用率。
想從 Daniel 在 歐盟開源峰會 上的 容器安全的十個層面 的演講中學習更多知識嗎?這個峰會已于 10 月 23 - 26 日在 Prague 舉行。