譯者 | 晶顏
審校 | 重樓
安全并非“放之四海而皆準(zhǔn)”的解決方案,相反地,它更多的是一個(gè)范圍,受其應(yīng)用的特定上下文的影響。安全領(lǐng)域的專業(yè)人士很少宣稱什么產(chǎn)品是完全安全的,但總有方法可以實(shí)現(xiàn)更強(qiáng)的安全性。在本文中,我們將介紹各種方法來(lái)支持容器的安全性。
理解和緩解容器安全威脅
為了保證容器化系統(tǒng)的安全,了解它們所面臨的威脅至關(guān)重要。就像一個(gè)小缺口足以沉沒(méi)一艘船一樣,即便是一個(gè)微小的漏洞也可能導(dǎo)致大問(wèn)題。本節(jié)將幫助你更深入地了解容器安全性,并提供針對(duì)各種威脅的緩解方案。
容器安全的核心原則
攻擊者經(jīng)常以容器為目標(biāo)來(lái)劫持它們的計(jì)算能力——一個(gè)常見(jiàn)的例子是獲得未經(jīng)授權(quán)的加密貨幣挖掘的訪問(wèn)權(quán)。除此之外,受損的容器可能會(huì)暴露敏感數(shù)據(jù),包括客戶信息和工作負(fù)載詳細(xì)信息。在更高級(jí)的攻擊中,其目標(biāo)甚至可能是逃離容器并滲透底層節(jié)點(diǎn)。如果攻擊者獲得成功,他們便可以在集群中橫向移動(dòng),獲得對(duì)關(guān)鍵資源(如用戶代碼、處理能力和跨其他節(jié)點(diǎn)的有價(jià)值數(shù)據(jù))的持續(xù)訪問(wèn)能力。
一種特別危險(xiǎn)的攻擊方法是容器逃逸,在此場(chǎng)景中,攻擊者利用了容器共享主機(jī)內(nèi)核的事實(shí)。如果他們?cè)谑軗p容器中獲得提升的權(quán)限,他們就可能會(huì)訪問(wèn)同一主機(jī)上其他容器中的數(shù)據(jù)或進(jìn)程。此外,Kubernetes控制平面是一個(gè)主要目標(biāo)。如果攻擊者破壞了控制平面組件中的任何一個(gè),他們就可以操縱整個(gè)環(huán)境,可能使其脫機(jī)或造成嚴(yán)重的中斷。此外,如果etcd數(shù)據(jù)庫(kù)遭到破壞,攻擊者還可以更改或破壞集群,竊取秘密和憑據(jù),或者收集足夠的信息以在其他地方復(fù)制應(yīng)用程序。
縱深防御
維護(hù)安全的容器環(huán)境需要一種分層策略,強(qiáng)調(diào)縱深防御原則。這種方法涉及在不同級(jí)別實(shí)現(xiàn)多個(gè)安全控制。通過(guò)部署重疊的安全措施,你可以創(chuàng)建這樣一個(gè)系統(tǒng):每個(gè)防御層都加強(qiáng)了其他層。這樣一來(lái),即使一項(xiàng)安全措施被破壞,其他措施也會(huì)繼續(xù)保護(hù)環(huán)境。
圖1:縱深防御策略
了解攻擊面
安全策略的一部分是理解和管理攻擊面,它包含所有潛在的利用點(diǎn),包括容器映像、運(yùn)行時(shí)、編排工具、主機(jī)和網(wǎng)絡(luò)接口。減少攻擊面意味著簡(jiǎn)化系統(tǒng),減少不必要的組件、服務(wù)和代碼。通過(guò)限制正在運(yùn)行的內(nèi)容并實(shí)施嚴(yán)格的訪問(wèn)控制,可以減少漏洞存在或被利用的機(jī)會(huì),使系統(tǒng)更安全,攻擊者更難以滲透。
常見(jiàn)威脅和緩解策略
本節(jié)將重點(diǎn)聚焦容器安全中的日常威脅,以及可用于保護(hù)系統(tǒng)的工具。
脆弱的容器映像
依賴具有安全漏洞的容器映像會(huì)帶來(lái)重大風(fēng)險(xiǎn),因?yàn)檫@些易受攻擊的映像通常包含過(guò)時(shí)的軟件或具有公開(kāi)漏洞的組件。在這種情況下,漏洞本質(zhì)上是代碼中的一個(gè)缺陷,惡意行為者可以利用它來(lái)觸發(fā)有害的結(jié)果。這方面的一個(gè)例子是OpenSSL庫(kù)中臭名昭著的Heartbleed漏洞,它允許攻擊者通過(guò)利用編碼錯(cuò)誤來(lái)訪問(wèn)敏感數(shù)據(jù)。當(dāng)容器映像中存在此類缺陷時(shí),它們就會(huì)為攻擊者破壞系統(tǒng)創(chuàng)造機(jī)會(huì),從而導(dǎo)致潛在的數(shù)據(jù)盜竊或服務(wù)中斷。
保護(hù)容器映像的最佳實(shí)踐包括以下幾點(diǎn):
- 為了有效地減少攻擊面,首先使用最小的基礎(chǔ)映像,其中只包含應(yīng)用程序所需的基本組件。這種方法最大限度地減少了潛在的漏洞,并限制了攻擊者可以利用的工具。像Docker的FROM scratch或無(wú)損映像這樣的工具可以幫助創(chuàng)建這些最小的環(huán)境。
- 理解和管理容器映像層是至關(guān)重要的,因?yàn)槊恳粚佣伎赡芤肼┒础Mㄟ^(guò)最小化層數(shù)并只包含必要的內(nèi)容,可以減少潛在的攻擊向量。使用多階段構(gòu)建來(lái)保持最終的映像精簡(jiǎn),并定期檢查和更新你的Dockerfiles以刪除不必要的層。
重要的是要避免使用未經(jīng)驗(yàn)證或過(guò)時(shí)的映像。來(lái)自公共存儲(chǔ)庫(kù)的未經(jīng)驗(yàn)證的映像可能包含惡意軟件、后門或其他惡意組件。過(guò)時(shí)的映像通常存在未修補(bǔ)的漏洞,攻擊者可以利用這些漏洞作為突破口。為了緩解這些風(fēng)險(xiǎn),請(qǐng)始終從受信任的存儲(chǔ)庫(kù)中獲取映像,并定期將其更新為最新版本。
不安全的容器運(yùn)行時(shí)
不安全的容器運(yùn)行時(shí)也是一個(gè)嚴(yán)重的威脅,因?yàn)樗赡軐?dǎo)致特權(quán)升級(jí),允許攻擊者在系統(tǒng)內(nèi)獲得更高的訪問(wèn)權(quán)限。通過(guò)提升訪問(wèn)權(quán)限,攻擊者可以通過(guò)修改或終止關(guān)鍵進(jìn)程來(lái)破壞服務(wù),從而導(dǎo)致停機(jī)并影響基礎(chǔ)應(yīng)用程序的可用性。他們甚至可以獲得對(duì)容器環(huán)境的完全控制,操縱配置來(lái)部署惡意容器或引入惡意軟件,并將其用作進(jìn)一步攻擊的啟動(dòng)平臺(tái)。
加固容器運(yùn)行時(shí)的最佳實(shí)踐包括以下內(nèi)容:
- 實(shí)現(xiàn)嚴(yán)格的安全邊界和遵守最小特權(quán)原則對(duì)于保護(hù)容器運(yùn)行時(shí)至關(guān)重要。應(yīng)該將容器配置為僅使用其功能所需的權(quán)限運(yùn)行,從而最大限度地減少安全漏洞的潛在影響。這涉及到設(shè)置基于角色的訪問(wèn)控制。
- 準(zhǔn)入控制是運(yùn)行時(shí)安全性的一個(gè)關(guān)鍵方面,它涉及到驗(yàn)證和調(diào)節(jié)在集群中創(chuàng)建或更新容器的請(qǐng)求。通過(guò)使用準(zhǔn)入控制器,你可以強(qiáng)制執(zhí)行安全策略,并確保只部署符合要求且安全的容器配置。這包括檢查已批準(zhǔn)的基本映像的使用情況,確保應(yīng)用了安全策略,以及驗(yàn)證容器沒(méi)有作為root運(yùn)行。此外,像開(kāi)放策略代理(OPA)這樣的工具可以集成到Kubernetes環(huán)境中,以提供靈活而強(qiáng)大的準(zhǔn)入控制功能。下面是一個(gè)OPA策略的例子,它作為一個(gè)看門人,確保沒(méi)有容器以root權(quán)限運(yùn)行:
package kubernetes.admission
deny[msg] {
input.request.kind.kind == "Pod"
input.request.object.spec.containers[_].securityContext.runAsUser == 0
msg = "Containers must not run as root."
}
在保護(hù)容器運(yùn)行時(shí)時(shí),下述做法需要避免:
- 如果以root身份運(yùn)行的容器受到威脅,攻擊者可以獲得對(duì)主機(jī)系統(tǒng)的root級(jí)訪問(wèn)權(quán)限,從而可能導(dǎo)致整個(gè)系統(tǒng)接管。
- 當(dāng)容器對(duì)主機(jī)資源(如文件系統(tǒng)、網(wǎng)絡(luò)或設(shè)備)具有不受限制的訪問(wèn)權(quán)限時(shí),受到損害的容器可以利用這種訪問(wèn)權(quán)限篡改主機(jī)系統(tǒng)、竊取敏感數(shù)據(jù)或破壞其他服務(wù)。
為了防止出現(xiàn)這種情況,請(qǐng)使用seccomp和AppArmor等工具。這些工具可以限制容器進(jìn)行的系統(tǒng)調(diào)用并執(zhí)行特定的安全策略。通過(guò)應(yīng)用這些控制機(jī)制,你可以將容器限制在其預(yù)期的操作范圍內(nèi),保護(hù)主機(jī)系統(tǒng)免受潛在的破壞或未經(jīng)授權(quán)的活動(dòng)干擾。
Kubernetes設(shè)置配置錯(cuò)誤
配置錯(cuò)誤的Kubernetes設(shè)置是一個(gè)重大的威脅,因?yàn)樗鼈儠?huì)通過(guò)過(guò)于寬松的網(wǎng)絡(luò)策略、薄弱的訪問(wèn)控制和糟糕的秘密管理使集群暴露于攻擊之下。具體來(lái)說(shuō):
- 過(guò)于寬松的網(wǎng)絡(luò)策略使攻擊者能夠攔截和篡改數(shù)據(jù)。
- 脆弱的訪問(wèn)控制允許未經(jīng)授權(quán)的用戶執(zhí)行管理任務(wù)、中斷服務(wù)和更改配置。
- 糟糕的秘密管理暴露了API密鑰和密碼等敏感信息,使攻擊者能夠提升特權(quán)。
Kubernetes安全配置的最佳實(shí)踐如下所述:
- 在沒(méi)有保護(hù)的情況下傳輸敏感信息的風(fēng)險(xiǎn)在于,它可能在傳輸過(guò)程中被惡意行為者攔截或篡改。為了降低這種風(fēng)險(xiǎn),使用傳輸層安全性(TLS)保護(hù)所有通信通道。Kubernetes提供了cert-manager之類的工具來(lái)自動(dòng)管理和更新TLS證書(shū)。這確保了服務(wù)之間的通信保持加密和安全,從而保護(hù)你的數(shù)據(jù)不被攔截或操縱。
- 網(wǎng)絡(luò)策略控制Kubernetes集群中pod和服務(wù)之間的流量。通過(guò)定義網(wǎng)絡(luò)策略,你可以隔離敏感的工作負(fù)載,并在發(fā)生泄漏時(shí)降低橫向移動(dòng)的風(fēng)險(xiǎn)。使用Kubernetes的本機(jī)NetworkPolicy資源來(lái)創(chuàng)建規(guī)則,強(qiáng)制執(zhí)行所需的網(wǎng)絡(luò)安全態(tài)勢(shì)。
另一方面,避免暴露不必要的應(yīng)用程序端口也很重要。端口的暴露為攻擊者提供了多個(gè)入口點(diǎn),使集群更容易受到攻擊。
CI / CD安全性
CI/CD管道被授予廣泛的權(quán)限,確保它們可以與生產(chǎn)系統(tǒng)密切交互并管理更新。然而,這種廣泛的訪問(wèn)也使CI/CD管道成為一個(gè)重大的安全風(fēng)險(xiǎn)。如果受到威脅,攻擊者可以利用這些廣泛的權(quán)限來(lái)操縱部署、引入惡意代碼、獲得對(duì)關(guān)鍵系統(tǒng)的未經(jīng)授權(quán)訪問(wèn)、竊取敏感數(shù)據(jù)或?yàn)檎谶M(jìn)行的訪問(wèn)創(chuàng)建后門。
在保護(hù)CI/CD時(shí),有一些最佳實(shí)踐可以實(shí)現(xiàn)。第一個(gè)最佳實(shí)踐是確保一旦構(gòu)建和部署了容器映像,它是不可變的。我們總是想確保Pod按照我們的計(jì)劃運(yùn)行。它還有助于在出現(xiàn)安全問(wèn)題時(shí)快速識(shí)別和回滾到以前的穩(wěn)定版本,維護(hù)可靠和可預(yù)測(cè)的部署過(guò)程。
實(shí)現(xiàn)不可變部署需要下述幾個(gè)關(guān)鍵步驟來(lái)確保一致性和安全性:
- 為每個(gè)容器映像構(gòu)建分配唯一的版本標(biāo)簽,避免使用像“最新”這樣的可變標(biāo)簽,并使用像Terraform或Ansible這樣的基礎(chǔ)設(shè)施即代碼工具來(lái)維護(hù)一致的設(shè)置。
- 配置具有只讀文件系統(tǒng)的容器,以防止部署后的更改。
- 使用Prometheus等工具實(shí)現(xiàn)持續(xù)監(jiān)控,使用Falco實(shí)現(xiàn)運(yùn)行時(shí)安全性,以幫助檢測(cè)和警報(bào)未經(jīng)授權(quán)的更改,維護(hù)部署的安全性和可靠性。
另一個(gè)最佳實(shí)踐是在CI/CD中實(shí)現(xiàn)映像漏洞掃描。漏洞掃描程序可以細(xì)致地分析容器映像的組件,識(shí)別可能被利用的已知安全漏洞。除了檢查由DNF或apt等工具管理的包之外,高級(jí)掃描程序還會(huì)檢查在構(gòu)建過(guò)程中添加的其他文件,例如通過(guò)ADD、COPY或RUN等Dockerfile命令引入的文件。
將第三方和內(nèi)部創(chuàng)建的映像納入掃描流程同樣至關(guān)重要,因?yàn)樾碌穆┒?/span>會(huì)不斷出現(xiàn)。為了保證在部署之前對(duì)映像進(jìn)行徹底的漏洞掃描,像claire或Trivy這樣的掃描工具可以直接嵌入到CI/CD管道中。
此外,不要直接在源代碼中存儲(chǔ)敏感信息(例如API密鑰、密碼),因?yàn)檫@會(huì)增加未經(jīng)授權(quán)訪問(wèn)和數(shù)據(jù)泄露的風(fēng)險(xiǎn)。建議使用秘密管理工具(如SOPS、AWS秘密管理器或Google Cloud秘密管理器)安全地處理和加密敏感信息。
結(jié)論
定期評(píng)估和改進(jìn)Kubernetes安全措施不僅重要,而且必不可少。通過(guò)實(shí)施上面介紹的策略,組織可以保護(hù)他們的Kubernetes環(huán)境,確保容器化的應(yīng)用程序更安全,更有彈性地應(yīng)對(duì)挑戰(zhàn)。在未來(lái),我們預(yù)計(jì)攻擊者將開(kāi)發(fā)更復(fù)雜的方法來(lái)專門繞過(guò)Kubernetes內(nèi)置的安全特性。隨著企業(yè)越來(lái)越多地依賴Kubernetes來(lái)處理關(guān)鍵工作負(fù)載,攻擊者可能會(huì)投入更多的時(shí)間來(lái)發(fā)現(xiàn)Kubernetes安全架構(gòu)中的新漏洞或弱點(diǎn),這可能會(huì)催生出更難以檢測(cè)和緩解的漏洞。
通往安全的Kubernetes環(huán)境的道路是清晰的,現(xiàn)在是采取行動(dòng)的時(shí)候了。“優(yōu)先考慮安全”來(lái)保障你的未來(lái)吧!
原文標(biāo)題:Guarding Kubernetes From the Threat Landscape: Effective Practices for Container Security,作者:Gal Cohen