1. 程式人生 > >Kubernetes 部署的最佳安全實踐

Kubernetes 部署的最佳安全實踐

Kubernetes提供了許多可以極大地提高應用程式安全性的選項。配置它們要求你熟悉 Kubernetes 以及其部署的安全要求。

我們在這裡強調的最佳實踐與容器生命週期相匹配:構建、分發和執行,並專門為Kubernetes量身打造。我們在執行在Google雲平臺的kubernetes上使用了這些安全實踐。以下是我們部署安全的Kubernetes應用的建議:

◆ 確保映象沒有漏洞

執行有漏洞的容器使你的環境會遭受損害的風險。許多攻擊可以簡單地通過將軟體升級為沒有漏洞的版本來避免。

實現Continuous Security Vulnerability Scanning (持續安全漏洞掃描)——容器可能包括含有已知漏洞(CVE)的過時包。新的漏洞每天都會發布,所以這不是一個“一次性”的工作,對映象持續進行安全評估是至關重要的。

定期對環境進行安全更新,一旦發現執行中容器的漏洞,你應該及時更新映象並重新部署容器。儘量避免直接更新(例如, ‘apt-update’ )到正在執行的容器,因為這樣打破了映象與容器的對應關係。

使用Kubernetes滾動升級功能升級容器非常簡單,該功能允許通過升級映象到最新版本來逐步更新正在執行的容器。

◆ 確保在你的環境中只使用授權映象

如果無法保證只執行符合組織策略的映象,那麼組織會面臨執行脆弱甚至惡意容器的危險。從未知的來源下載和執行映象是危險的,它相當於在生產伺服器上執行未知服務商的軟體,所以千萬別這樣做!

使用私有映象儲存你的合法映象,這樣能大量減少可能進入到你的環境的映象數量。將成安全評估(如漏洞掃描)加入持續整合(CI)中,使其成為構建流程的一部分。

持續整合應確保只使用審查通過的程式碼來構建映象。當映象構建成功後,要對它進行安全漏洞掃描,然後只有當沒有發現問題時,映象才能被推送私有映象倉庫。在安全評估中失敗的映象不應該被推送到映象倉庫中。

◆ 限制對Kubernetes 節點的直接訪問

應該限制SSH登陸Kubernetes節點,減少對主機資源未授權的訪問。應該要求使用者使用“ kubectl exec ”命令,此命令能夠在不訪問主機的情況下直接訪問容器環境。

你可以使用kubernetes授權外掛來進一步控制使用者對資源的訪問。它允許設定對指定名稱空間、容器和操作的細粒度訪問控制規則。

◆ 建立資源間的管理界限

限制使用者許可權的範圍可以減少錯誤或惡意活動的影響。Kubernetes 名稱空間允許將資源劃分為邏輯命名組。在一個名稱空間中建立的資源對其他名稱空間是隱藏的。

預設情況下,使用者在Kubernetes 叢集中建立的每個資源執行在名稱為“default”的預設空間內。你也可以建立額外的名稱空間並附加資源和使用者給它們。你可以使用Kubernetes 授權外掛來建立策略,以便將不同使用者的訪問請求隔離到不同的名稱空間中。

例如:以下策略將允許 ‘alice’ 從名稱空間 ‘fronto’ 讀取pods。

圖片描述

◆ 定義資源配額

執行沒有資源限制的容器會將你的系統置於DoS或被其他租戶干擾的風險中。為了防止和最小化這些風險,你應該定義資源配額。

預設情況下,Kubernetes 叢集中的所有資源沒有對CPU 和記憶體的使用限制。你可以建立資源配額策略,並附加到Kubernetes名稱空間中來限制Pod對CPU和記憶體的使用。

下面的例子將限制名稱空間中Pod 的數量為4個,CPU使用在1和2之間,記憶體使用在1GB 和 2GB 之間。

compute-resources.yaml:

圖片描述

分配資源配額到名稱空間:

圖片描述

◆ 實現網路分段

在相同的Kubernetes叢集上執行不同的應用程式會導致惡意程式攻擊其他應用程式的風險。所以網路分割對確保容器只與那些被允許的容器進行通訊很重要。

Kubernetes 部署的挑戰之一是建立Pod,服務和容器之間的網路分段。原因在於容器網路識別符號(IP地址)動態的“天性”,以及容器可以在同一節點或節點間進行通訊的事實。

谷歌雲平臺的使用者受益於自動防火牆規則,能夠防止跨叢集通訊。類似的實現可以使用網路防火牆或SDN解決方案部署。這方面的工作由Kubernetes 網路特別興趣小組(Special Interest Group)完成,這將大大提高 pod到pod 的通訊策略。

新的網路策略API應該解決 Pod之間建立防火牆規則的需求,限制容器化可以進行的網路訪問。

下面展示了只允許前端(frontend)Pod訪問後端(backend)Pod的網路策略:

圖片描述

◆ 將安全環境應用到你的Pods和容器中

當設計你的容器和 pods時,確保為你的pods,容器和儲存卷配置安全環境。安全環境是定義在yaml檔案中的一項屬性。它控制分配給 pod/容器/儲存卷的安全引數。一些重要的引數是:

圖片描述
以下是一個具有安全環境引數的pod 定義示例:

圖片描述

◆ 記錄所有的事情

Kubernetes提供基於叢集的日誌,允許將容器活動日誌記錄到一個日誌中心。當叢集被建立時,每個容器的標準輸出和標準錯誤都可以通過執行在每個節點上的Fluentd 服務記錄到Stackdriver或Elasticsearch中,然後使用Kibana進行檢視。

◆ 總結

Kubernetes 對建立安全部署提供多種選擇,沒有適合所有情況的萬能解決方案,所以熟悉這些安全選項、瞭解它們如何提高應用程式安全性是很重要的。

我們推薦這篇文章中提到的安全實踐,將Kubernetes的靈活配置能力加入到持續整合中,自動將安全性無縫融合到整個流程中。