安全性總覽

Google Kubernetes Engine 提供許多方法來保護您的工作負載。保護 Google Kubernetes Engine 中的工作負載會涉及堆疊的許多層級,包含容器映像檔的內容、容器執行階段、叢集網路及叢集 API 伺服器的存取權。

如要保護您的叢集和工作負載,最好的方式是採取分層防護。針對提供給使用者及應用程式的存取層級,您可以採取最低權限原則。您可能需要在每個層級做出不同的取捨,以利為組織提供適當的彈性和安全性,藉此安全地部署及維持工作負載。比方說,有些安全性設定對特定應用程式類型或用途而言可能有太多限制,必須大幅重構才能讓該應用程式或用途正常運作。

本說明文件會大概介紹基礎設施的各個層級,並說明如何設定最適合您需求的安全功能。

驗證及授權

Kubernetes 支援兩種類型的驗證

  1. 使用者帳戶是 Kubernetes 認識的帳戶,但並非受管於 Kubernetes,例如,您不能使用 kubectl 建立或刪除這些帳戶。
  2. 服務帳戶是 Kubernetes 建立和管理的帳戶,但只能由 Kubernetes 建立的實體 (例如 Pod) 使用。

在 Google Kubernetes Engine 叢集中,Kubernetes 使用者帳戶受管於 Google Cloud Platform (GCP),而且可能是以下兩種類型其中之一︰

  1. Google 帳戶
  2. Google Cloud Platform (GCP) 服務帳戶

通過驗證後,您必須授權給這些身分,以建立、讀取、更新或刪除 Kubernetes 資源。

儘管名稱相似,但 Kubernetes 服務帳戶和 GCP 服務帳戶是不同的實體。Kubernetes 服務帳戶是叢集的一部分,通常會在該叢集內定義及使用。而 GCP 服務帳戶是 GCP 專案的一部分,可在叢集內或對 Google Cloud Platform 專案,以及對任何使用 Cloud Identity & Access Management (Cloud IAM) 的資源輕鬆授予權限。這使得 GCP 服務帳戶比 Kubernetes 服務帳戶功能更強大;為了遵循最低權限安全原則,您應只在需要其功能時才考慮使用 GCP 服務帳戶。

如要在叢集層級或在 Kubernetes 命名空間內設定更精細的 Kubernetes 資源存取權,可使用角色型存取控制 (RBAC)。RBAC 可讓您建立詳細的政策,以定義您允許使用者及服務帳戶存取的作業和資源。您可透過 RBAC 控制 Google 帳戶、GCP 服務帳戶及 Kubernetes 服務帳戶的存取權。如要進一步精簡 Google Kubernetes Engine 的驗證與授權策略,請務必停用以屬性為基礎的舊有存取控制,讓 Kubernetes RBAC 及 Cloud IAM 成為事實來源。

瞭解詳情:

控制層安全性

在 Google Kubernetes Engine 中,Kubernetes 主要元件是由 Google 代管與維護。主要元件託管執行 Kubernetes 控制層的軟體,包括 API 伺服器、排程器、控制器管理員,以及會保留您 Kubernetes 設定的 etcd 資料庫

主要元件預設使用公開 IP 位址。您可以使用主要授權網路私人叢集來保護 Kubernetes API 伺服器,以便指派私人 IP 位址給主要執行個體,並停用公開 IP 位址的存取權限。

您可使用 Cloud IAM 做為識別資訊提供者,以處理 Google Kubernetes Engine 中的叢集驗證。不過,Google Kubernetes Engine 預設會啟用舊的使用者名稱及密碼型驗證。如要加強驗證安全性,您必須在 MasterAuth 配置設定空白的使用者名稱和密碼,確認您已停用基本驗證。在相同的配置中,您也可以停用用戶端憑證,如此一來在鎖定叢集存取權時,就不需要考慮此金鑰。

另一個協助保護 Kubernetes 主要執行個體的方法是定期執行憑證輪替。啟動憑證輪替之後,就會替換 SSL 憑證及叢集憑證授權單位。Google Kubernetes Engine 會自動執行此程序,也會確保主要 IP 位址成功替換。

瞭解詳情:

節點安全性

Google Kubernetes Engine 會將工作負載部署在 GCP 專案中執行的 Compute Engine 執行個體上。這些執行個體會做為節點連結至 Google Kubernetes Engine 叢集。以下段落說明如何利用 GCP 中的節點層級安全功能。

Container-Optimized OS

根據預設,Google Kubernetes Engine 節點會使用 Google 的容器最佳化 OS 做為執行 Kubernetes 及其元件的作業系統。容器最佳化 OS 會實作數個進階功能,以加強 Google Kubernetes Engine 叢集的安全性,包括:

  • 鎖定防火牆
  • 儘可能使用唯讀檔案系統
  • 有限的使用者帳戶及停用 root 使用者登入

節點升級

定期修補 OS 是最佳做法。有時候因為容器執行階段、Kubernetes 本身或節點作業系統中的安全問題,您可能需要更緊急地升級您的節點。節點升級後,節點的軟體也會升級到最新版本。

您可手動升級叢集中的節點,但 Google Kubernetes Engine 也可讓您啟用自動升級

保護執行個體中繼資料的安全

Google Kubernetes Engine 節點做為 Compute Engine 執行個體執行,因此根據預設可存取執行個體中繼資料。執行個體中繼資料為節點提供憑證及設定,用於開機載入和連結到 Kubernetes 主要節點。不過,在節點上執行的 pod 不一定需要此資訊 (其中包含機密資料,如節點的服務帳戶金鑰)。您可停用舊的 API 或使用中繼資料隱藏功能,來鎖定機密的執行個體中繼資料路徑。中繼資料隱藏功能會過濾對 kube-env 等欄位發出的要求,確保在叢集中執行的 pod 不能存取機密資料。

網路安全性

在 Google Kubernetes Engine 中執行的多數工作負載都需要與在叢集內外執行的其他服務進行溝通。您可使用不同方法來控制可流經叢集及其 pod 的流量。

限制 pod 對 pod 的通訊

根據預設,叢集中的所有 pod 皆可透過其 pod IP 位址連接網路。同樣根據預設,輸出流量允許傳出連線連至部署叢集的虛擬私人雲端 (VPC) 中的任何可存取位址。

叢集管理員和使用者可使用網路政策,封鎖從命名空間 pod 建立的,或是建立至命名空間 pod 的輸入和輸出連線。根據預設設定,如果沒有定義網路政策,系統就會允許所有輸入和輸出連線流入及流出 pod。網路政策可讓您使用標記來定義流經 pod 的流量。

一旦在命名空間中套用網路政策,無論是輸入或輸出 pod 的流量,只要不符合您設定的標籤,就都會遭到捨棄。建立叢集及/或命名空間時,您可針對每個 pod 套用預設拒絕輸入和輸出流量,以確保所有新增至叢集的工作負載都必須明確授權其所需流量。

瞭解詳情:

過濾負載平衡流量

若要使用網路負載平衡器來平衡您的 Kubernetes pod 負載,您必須建立類型為 LoadBalancer,且符合 Pod 標籤的服務。建立 Service 後就會有對外 IP,可對應到 Kubernetes pod 上的連接埠。使用 kube-proxy 根據 IP 位址進行過濾,即可在節點層級過濾授權的流量。

若要設定此過濾作業,您可使用 Service 物件的 loadBalancerSourceRanges 設定,利用此設定參數提供一份 CIDR 範圍清單,將這些範圍加入可存取該 Service 物件的許可清單。如果沒有設定 loadBalancerSourceRanges,所有位址皆可透過 Service 的外部 IP 進行存取。

在不需要存取 Service 的情況下,請考慮使用內部負載平衡器。如需過濾來自 VPC 內部的流量,內部負載平衡器也會遵循 loadBalancerSourceRanges

瞭解詳情:

保護工作負載安全

Kubernetes 可讓使用者快速佈建、調度資源及更新以容器為基礎的工作負載。本節說明系統管理員和使用者可以使用的策略,以避免執行中的容器影響叢集中的其他容器、其所在主機,以及專案中啟用的 GCP 服務。

限制 pod 容器程序的權限

限制容器化程序權限對叢集的整體安全至關重要。Google Kubernetes Engine 可讓您透過 pod 和容器上的安全情境,設定安全相關選項。這些設定可讓您變更程序的安全設定,如:

  • 執行作業時所採用的使用者和群組身分
  • 可用的 Linux 功能
  • 升級權限的能力

若要在叢集層級而非 pod 或容器變更這些設定,您必須執行 PodSecurityPolicy。叢集管理員可使用 PodSecurityPolicies 確保叢集中的所有 pod 都符合您定義的最低基準政策。

Google Kubernetes Engine 節點作業系統 (Container-Optimized OS 及 Ubuntu) 會針對 Kubernetes 啟動的所有容器套用預設 Docker AppArmor 安全政策。您可在 GitHub 上檢視設定檔範本。此外,設定檔會拒絕在容器執行下列功能:

  • 直接將檔案寫入 /proc/
  • 寫入不在程序 ID 目錄 (/proc/) 中的檔案
  • 將檔案寫入 /proc/sys 而非 /proc/sys/kernel/shm*
  • 掛接檔案系統

瞭解詳情:

授權 pod 存取 GCP 資源

您的容器及 pod 可能需要存取 GCP 中的其他資源。讓應用程式存取 GCP 資源憑證的方法之一,就是從中繼資料使用 Kubernetes 叢集的服務帳戶憑證。不過,在叢集上執行的所有 pod 皆可存取這些憑證。您應該為您的叢集建立及設定自訂服務帳戶,指定最基本的 IAM 角色以套用至所有在叢集中執行的 pod。

另一個提供應用程式憑證的方法是使用服務帳戶 JSON 金鑰。您應該使用應用程式專用的 GCP 服務帳戶來提供憑證,如此一來應用程式就有最基本的所需權限。每個服務帳戶只會獲得讓配對應用程式順利執行所需的 Cloud IAM 角色。讓服務帳戶保持應用程式專用,可在應用程式遭入侵時撤銷存取權,而不會影響其他應用程式。當您為服務帳戶指派正確的 Cloud IAM 角色後,即可建立 JSON 服務帳戶金鑰,然後使用 Kubernetes 密鑰掛載到您的 pod。

瞭解詳情:

使用二進位授權

二進位授權是 GCP 上的一項服務,為 Cloud 中執行的應用程式提供軟體供應鏈安全性。二進位授權可搭配您從 Container Registry 或另一個容器映像檔註冊資料庫部署到 GKE 的映像檔。有了二進位授權,即可確保應用程式會在內部完成保謢軟體品質與完整性的程序後,才部署到實際工作環境。

如需建立啟用二進位授權功能的叢集的操作說明,請瀏覽二進位授權說明文件中的建立叢集

稽核記錄

稽核記錄可讓管理員保留、查詢、處理 Google Kubernetes Engine 環境中發生的事件,並建立快訊。管理員可使用記錄資訊進行鑑識分析、即時快訊,或根據使用方式及使用者來分類一群 Google Kubernetes Engine 叢集。

根據預設,Google Kubernetes Engine 會記錄管理員活動記錄。您可以按照想要檢查的作業類型,選擇也記錄資料存取事件。

瞭解詳情:

本頁內容對您是否有任何幫助?請提供意見:

傳送您對下列選項的寶貴意見...

這個網頁
Kubernetes Engine 說明文件