7 步保障 Kubernetes 叢集安全

2022-10-24 15:01:10

隨著 Kubernetes 的發展和改進,新的安全威脅和風險也逐漸向 K8s 轉移,因此 K8s 安全性變得越來越重要,而保護 K8s 叢集已成為 DevOps 團隊不容忽視的重要任務。K8s 有多種實現型別(本地、雲管理、混合等)、眾多開源支援工具和各種設定設定,且保護執行容器工作負載的任何安全敏感架構的需求也在增長。

根據 CNCF 的 K8s 安全審計調查,攻擊者可以通過利用各種 K8s 漏洞和幾種標準設定進行非法行為。今天,我們將探討一些實施保障 K8s 安全的最佳實踐。

K8s 和 K8s 叢集

K8s 是一個用於管理容器(容器化應用程式)的系統,容器則可以理解為是一個輕量級的虛擬機器器。要建立應用程式,就需要先建立一些容器並使用 K8s 來管理這些容器。這確實是一個龐大且快速擴充套件的生態系統,並且 K8s 的設施、支援和工具相對比較容易獲得。K8s 可以立即生成和擴充套件容器,並跨所有容器管理儲存。

K8s 叢集是包含所有 K8s 元件的K8s 系統。叢集可以在物理機(如 PC 或筆記型電腦)或虛擬機器器上執行。如果你有一臺機器執行完整的 K8s 系統,則該機器託管您的 K8s 叢集;假設你有兩臺機器執行 K8s,這兩臺機器都會組織你的 K8s 叢集。叢集可以在物理機和虛擬機器器的任意組合上執行。

7步保護 K8s 叢集安全

接下來我們一起看看企業應該實施哪些安全最佳實踐來確保其 K8s 叢集的安全性。

1. 將 K8s 升級到最新版本

最基本且經常被忽視的安全最佳實踐是將 K8s 生態系統保持最新狀態。企業將受益於新的安全功能和錯誤跟蹤更新以及變體版本。此外,在啟動到生產叢集之前,請在測試環境中使用最新的完整版本。

2. 驗證 Kubernetes API 伺服器

Kubernetes API 伺服器,也被稱為 Kube-API 伺服器,是 K8s 叢集的核心。K8s API 是 K8s 叢集的主要存取點。管理員或服務帳戶可以通過命令列實用程式 kubectl、REST API 呼叫或其他使用者端 SDK 存取 API。伺服器提供存取並保證叢集是可操作的。所有在叢集內部呼叫的 API 嘗試都應該使用加密的傳輸層安全性。建議採用完全符合存取控制規則的 API 伺服器的 API 身份驗證方法。

3. 啟用 RBAC 授權機制

RBAC 即基於角色的存取控制機制,允許多個應用程式基於最小許可權執行具體操作,並且僅授予執行必要的許可權。管理員應遵循以下 K8s RBAC 最佳實踐:

  • 使用–authorization-mode=RBAC引數在 API 伺服器中啟用 RBAC,強制 RBAC 作為叢集安全的標準設定。
  • 為每個應用程式使用專用的使用者服務帳戶,而不是 K8s 建立的預設服務帳戶。專用服務帳戶允許管理員對每個應用程式強制執行 RBAC,並更好地控制提供給每個應用程式資源的細粒度許可權。
  • 減少可選 API 伺服器標誌的數量,以減少 API 伺服器的攻擊面。每個標誌都有助於叢集管理的特定方面,這可能會也可能不會暴露 API 伺服器。減少以下可選標誌的使用:例如匿名身份驗證, 不安全的繫結地址,和不安全埠。
  • 定期調整和更新 RBAC 政策。首先刪除不再需要的任何許可權,這個動作可能很耗時,但能有效保障安全。
  • 強制執行最低許可權以使 RBAC 系統生效。當叢集管理員遵循 Pareto 原則時,只將所需的許可權分配給使用者或應用程式。不應授予額外許可權,應避免使用萬用字元[「*」]或一攬子存取。

4. 提高節點安全性

首先加強執行 pod 節點安全性:

  • 設定的標準和基準。根據安全建議設定主機。使用與特定 K8s 版本相關的 Internet 安全中心基準驗證叢集。
  • 最小化管理存取。通過限制管理存取來減少 K8s 節點上的攻擊面。
  • 節點上進行隔離和約束。在特定節點上執行特定的 pod,這樣可以確保 pod 在具有特定隔離和安全設定的節點上執行。

向節點物件新增標籤以允許 pod 專門針對節點,從而控制 pod 可以存取哪些節點。應用節點標籤後,將節點選擇器新增到 pod 部署中,以便 pod 對所選節點進行顯著更改。

5. 控制 kubelet 存取許可權

kubelet 發揮著在每個叢集節點上持續執行的操作員的作用。它通過 API 與使用者通訊,這些 API 管理試圖在節點上執行並執行特定任務的 pod。未經授權向 kubelet 披露為攻擊者提供了 API 存取許可權,並可能危及節點或叢集的安全。

要減少攻擊面並防止通過 kubelet 對 API 進行未經授權的存取,請執行以下步驟:

  • 在啟動 kubelet 之前,將 -anonymous-auth 標誌設定為false以禁用匿名存取:-anonymous-auth=false
  • 使用 -kubelet-client-certificate-kubelet-client-key標誌開始 Kube-Episerver 命令。這可確保 API 伺服器對 kubelet 進行身份驗證並防止匿名請求。
  • kubelet 提供了一個唯讀 API,管理員無需登入即可使用。這樣可能會暴露潛在的敏感叢集資訊,管理員應使用以下命令關閉唯讀埠:—read-only-port=0

6. 設定名稱空間和網路策略

名稱空間將敏感工作負載與非敏感工作負載區分開來。處理多個名稱空間可能會有些困難,但這使得實現安全控制變得更簡單,例如管理效能的網路策略以調節進出 pod 的流量。

7. 啟用審計紀錄檔

啟用 K8s 審計紀錄檔並監督它們是否存在非法行為和可疑的 API 呼叫。K8s 可以儲存叢集活動的詳細記錄,所以我們可以立即在稽核紀錄檔中檢測到可能的安全問題。例如,攻擊者試圖暴力破解密碼可能會建立身份驗證和授權紀錄檔。如果這些行為反覆出現,則可能存在安全問題。

要啟用審計紀錄檔,需使用 K8s 審計策略,允許管理員根據情況設定審計級別:

  • None – 與此規則匹配的事件將不會被記錄。
  • Metadata – 記錄請求的後設資料,例如請求使用者、時間戳、資源和動詞。
  • Request – 記錄事件的後設資料以及請求正文,但不記錄響應正文。這不適用於對非資源的請求。
  • RequestResponse – 跟蹤事件後設資料、請求和響應正文。這不適用於對非資源的請求。

這些資訊的大部分由 K8s 審計紀錄檔記錄,並且與叢集 API 的簡單結合允許您將這些紀錄檔傳送到外部紀錄檔記錄和儲存解決方案。同時還可以生成儀表板、可疑行為警報和事件調查報告。

總結

依賴 K8s 作為後端的 DevOps 團隊必須意識到叢集和可以在其中執行的 Docker 容器可能面臨的所有風險和攻擊。由於可用的攻擊向量種類繁多、技術的不斷進步以及該工具的一致、廣泛採用,惡意攻擊者發現滲透叢集能夠有效發起攻擊並獲得利益。保護 K8s 叢集是一項艱鉅的任務,密切關注並儘可能檢測系統漏洞或惡意攻擊行為至關重要。