云原生集成開發(fā)環(huán)境——TitanIDE
通過網(wǎng)頁在任何地方更安全、更高效地編碼2022-11-16
1054
原文出自:Armo’s blog
原文作者:Bezalel Brandwinen,,Team Lead at Armo Ltd
Kubernetes 在我們現(xiàn)在如何管理容器化應(yīng)用程序方面占據(jù)了中心位置。因此,存在許多定義我們的 Kubernetes 應(yīng)用程序的協(xié)議,包括 YAML、JSON、INI 等結(jié)構(gòu)。
這使得我們會(huì)去考慮,什么是我們的應(yīng)用程序應(yīng)遵循的最佳策略。此外,我們還必須清楚,如何根據(jù)我們在文件結(jié)構(gòu),特別是安全性方面,選擇路徑來驗(yàn)證我們的應(yīng)用程序配置。
在本文中,我們將探索如何使用 YAML 配置定義 Kubernetes 應(yīng)用程序,以及哪些是我們可以采取的步驟,來有效驗(yàn)證這些配置定義。
YAML 中的 Kubernetes 配置定義
與 JSON 和 INI 相比, YAML更加緊湊和可讀。比如我們定義一個(gè)80端口可以訪問的pod,那么YAML、JSON、INI中的配置如下表所示:
很明顯,YAML 簡化了我們定義 Kubernetes 應(yīng)用程序的方式,特別是考慮到一個(gè)普通的應(yīng)用程序可能涉及數(shù)十個(gè)配置文件。此外,YAML 的緊湊特性允許您將對象組合在一起,從而減少所需文件的數(shù)量。
但是,定義我們的 Kubernetes 配置文件存在重大挑戰(zhàn),尤其是在嘗試在清單文件之間嵌入約束和關(guān)系時(shí)。例如,我們?nèi)绾未_保內(nèi)存限制配置為遵循最佳實(shí)踐?
當(dāng)遇到邊緣情況時(shí),缺乏驗(yàn)證不僅會(huì)導(dǎo)致我們的應(yīng)用程序出現(xiàn)意外,而且還會(huì)暴露主要的安全漏洞。因此,我們有必要考慮基于 YAML 的配置文件的驗(yàn)證策略,這就是我們將在以下部分中深入探討的內(nèi)容。
驗(yàn)證的各個(gè)方面
應(yīng)該對我們的 YAML 文件執(zhí)行三個(gè)級別的驗(yàn)證。這些級別確保根據(jù) YAML 文件的實(shí)際有效性執(zhí)行驗(yàn)證,一直到是否滿足安全實(shí)踐。
第一級是結(jié)構(gòu)驗(yàn)證,這是對 Kubernetes 配置文件進(jìn)行的最高級別的驗(yàn)證。它涉及簡單地驗(yàn)證 YAML 文件,以確保在編寫它時(shí)沒有語法錯(cuò)誤。這是編寫配置文件時(shí)使用的 IDE 可以驗(yàn)證的內(nèi)容。
第二層是語義驗(yàn)證,這確保 YAML 文件的內(nèi)容轉(zhuǎn)換為所需的 Kubernetes 資源,從而驗(yàn)證 Kubernetes 應(yīng)用程序本身。
第三個(gè)是最深層次的驗(yàn)證,安全驗(yàn)證, 以確保定義的 Kubernetes 應(yīng)用程序沒有任何漏洞。我們可能已經(jīng)成功地編寫了 YAML 配置以成功實(shí)現(xiàn)所需的 Kubernetes 資源和連接,但這并不能確保我們的 Kubernetes 應(yīng)用程序得到很好的保護(hù)并遵循最佳實(shí)踐。上面最后兩個(gè)驗(yàn)證都是Kubernetes配置驗(yàn)證,并不僅僅在YAML格式驗(yàn)證方面。由于它們是特定于應(yīng)用程序的驗(yàn)證,因此專門的診斷是必要的。執(zhí)行此類驗(yàn)證需要 Kubernetes 領(lǐng)域的深入專業(yè)知識(shí),我們將簡要介紹如何使用 Kubernetes 領(lǐng)域?qū)<议_發(fā)的工具輕松處理它們。
例如,鎖定 hostPath 掛載權(quán)限可確保集群中具有可寫 hostPath 卷的容器不會(huì)被攻擊者訪問,因?yàn)樗麄兛赡軙?huì)在底層主機(jī)上獲得持久性。這不符合安全最佳實(shí)踐,為避免此問題,我們應(yīng)始終確保將 hostPath 屬性下的readOnly 部分設(shè)置為 true。
另一個(gè)示例是僅在必要時(shí)授予 hostNetwork 對 pod 的訪問權(quán)限。所有具有訪問權(quán)限的 pod 也應(yīng)列入白名單。對主機(jī)網(wǎng)絡(luò)的不必要訪問增加了潛在的攻擊面。
所以,從上面兩個(gè)例子可以看出,即使我們的配置文件通過了結(jié)構(gòu)和語義驗(yàn)證,促使我們的 Kubernetes 資源被成功編排,但安全和功能漏洞仍然可能存在。因此,我們必須考慮如何最好地捕獲這些漏洞,然后再提醒生產(chǎn)中的后果。安全驗(yàn)證是執(zhí)行此操作的方法。
另一個(gè)示例是僅在必要時(shí)授予 hostNetwork 對 pod 的訪問權(quán)限。所有具有訪問權(quán)限的 pod 也應(yīng)列入白名單。對主機(jī)網(wǎng)絡(luò)的不必要訪問增加了潛在的攻擊面。
所以,從上面兩個(gè)例子可以看出,即使我們的配置文件通過了結(jié)構(gòu)和語義驗(yàn)證,導(dǎo)致我們的 Kubernetes 資源被成功編排,安全和功能漏洞仍然可能存在。因此,我們必須考慮如何最好地捕獲這些漏洞,然后再提醒生產(chǎn)中的后果。安全驗(yàn)證是執(zhí)行此操作的方法。
驗(yàn)證和最佳實(shí)踐
考慮到結(jié)構(gòu)驗(yàn)證相當(dāng)簡單,可以預(yù)期可用的工具目前是可以在您的 IDE 中輕松獲得。Kubernetes 語義和安全驗(yàn)證需要更多的努力,尤其是在策略和工具方面。
讓我們考慮一些最佳實(shí)踐和策略,這些實(shí)踐和策略需要實(shí)現(xiàn)對我們的 YAML 文件的整體驗(yàn)證。
始終左移
我們可能總是驗(yàn)證我們的 K8s 配置,即使我們已經(jīng)使用 Kubescape 等工具將它們部署在集群中,但“左移”總是更好。左移是一個(gè)在過去五六年里火了起來的詞,這是理所當(dāng)然的。您希望使驗(yàn)證更接近應(yīng)用程序的交付和構(gòu)建階段。
例如,語義驗(yàn)證是 Kubernetes 本身可以處理的事情。但是,當(dāng)您將其交給 Kubernetes 處理時(shí),為時(shí)已晚。
您可以執(zhí)行空運(yùn)行 ( kubectl apply -f --dry-run='server’') 來驗(yàn)證語義結(jié)構(gòu),但這仍然是一個(gè)額外的步驟,可能會(huì)降低您的整體速度。但是,試運(yùn)行需要您有權(quán)訪問 Kubernetes 集群。
這種方法的替代方法是 Kubeval,這是一個(gè)了不起的工具,可用于驗(yàn)證您的配置文件語義以確保它們滿足 Kubernetes 的對象定義要求。它可以成為您的 CI 過程的一部分并在本地執(zhí)行掃描,從而確保您在投入生產(chǎn)之前從語義上驗(yàn)證您的配置文件。
還可以使用 Kubescape在 CI 中實(shí)現(xiàn)安全驗(yàn)證。這是一個(gè)開源工具,可確保您的 Kubernetes 應(yīng)用程序定義遵循多個(gè)安全框架,例如 NSA-CISA 或 MITRE ATT&CK®。通過使用 Kubescape CLI,您可以掃描所有 YAML 文件以查找安全漏洞,甚至可以獲得風(fēng)險(xiǎn)評分和風(fēng)險(xiǎn)趨勢。它充當(dāng) YAML 驗(yàn)證器 ,其主要價(jià)值是安全驗(yàn)證。
DevOps 到 DevSecOps
您可以運(yùn)行 CI 管道中已經(jīng)討論過的工具組合,以實(shí)現(xiàn)結(jié)構(gòu)、語義和安全驗(yàn)證。然而,僅使用這些工具及其預(yù)定義的檢查是不夠的。
我們從 DevOps 中學(xué)到的一件事是,總有一個(gè)可以采用的改進(jìn)周期。這就是為什么隨著您的應(yīng)用程序的發(fā)展和您的安全需求的變化,您應(yīng)該不斷檢查您的安全控制。
新的安全控制是您應(yīng)該納入安全驗(yàn)證步驟的東西。Kubescape 是 AMRO 的開源平臺(tái),允許您定義自己的控件框架。盡管開箱即用的框架非常強(qiáng)大,但您會(huì)看到您的策略控制是根據(jù)您的業(yè)務(wù)和 Kubernetes 資源的確切需求而形成的。
只有將安全問題嵌入到您構(gòu)建應(yīng)用程序的文化中,才能實(shí)現(xiàn)這種做法。多虧了 Kubeval 和 Kubescape 等開源工具,您的開發(fā)團(tuán)隊(duì)不斷思考驗(yàn)證,尤其是安全驗(yàn)證的障礙已經(jīng)降低。
結(jié)論
YAML 配置文件使構(gòu)建 Kubernetes 應(yīng)用程序變得非常簡單。然而,YAML 在驗(yàn)證方面確實(shí)有其局限性。因此,我們有必要了解所有驗(yàn)證策略,以確保我們構(gòu)建的 Kubernetes 應(yīng)用程序健康且安全。
在任何 IDE 中使用 YAML 測試驗(yàn)證 YAML 文件的結(jié)構(gòu)都相當(dāng)簡單,但驗(yàn)證 Kubernetes 資源對象定義的正確性和圍繞它們的安全措施卻很困難。幸運(yùn)的是,諸如 Kubescape 之類的工具彌補(bǔ)了這一差距,讓您可以在整個(gè)應(yīng)用程序生命周期中不斷思考安全問題。
由于安全性是當(dāng)今構(gòu)建容器化應(yīng)用程序的主要關(guān)注點(diǎn)之一,因此此處討論的驗(yàn)證策略是朝著正確方向邁出的一步。