GKE 安全性總覽


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

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

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

這份文件適用於安全專家,他們負責定義、管理及實作政策和程序,以防機構的資料遭到未經授權的存取。如要進一步瞭解 Google Cloud 內容中提及的常見角色和範例工作,請參閱常見的 GKE Enterprise 使用者角色和工作

驗證及授權

Kubernetes 支援兩種類型的驗證

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

在 GKE 叢集中,Kubernetes 使用者帳戶受管於 Google Cloud,而且可能是以下兩種類型其中之一:

  1. Google 帳戶
  2. Google Cloud 服務帳戶

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

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

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

瞭解詳情:

控制層安全性

在 GKE 中,Kubernetes 控制層元件是由 Google 代管與維護。控制層元件會代管執行 Kubernetes 控制層的軟體,包括 API 伺服器、排程器、控制器管理工具和 etcd API。如果叢集在控制層 VM 上執行 etcd 資料庫執行個體,這些執行個體也會由 Google 管理及維護。

您可以透過 DNS 型端點 (建議使用)、IP 型端點或兩者存取控制層。如果您使用以 IP 為基礎的端點,可以透過授權網路保護 Kubernetes API 伺服器,並停用控制層的外部端點。這樣一來,您就能將內部 IP 位址指派給控制層,並停用外部 IP 位址的存取權。如果您使用 DNS 型端點,可以透過 IAM 和 VPC Service Controls,以身分和網路感知政策保護控制層存取權。

您可使用 IAM 做為識別資訊提供者,以處理 Google Kubernetes Engine 中的叢集驗證。如要瞭解驗證資訊,請參閱「對 Kubernetes API 伺服器進行驗證」。

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

瞭解詳情:

節點安全性

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

Container-Optimized OS

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

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

GKE Autopilot 節點一律會使用 Container-Optimized OS 做為作業系統。

節點升級

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

GKE 叢集支援自動升級。在 Autopilot 叢集中,系統一律會啟用自動升級功能。您也可以手動升級標準叢集中的節點。

保護節點免受不受信任的工作負載影響

如果叢集執行不明或不受信任的工作負載,建議您保護節點上的作業系統,避免受到 Pod 中執行的不受信任工作負載影響。

例如,軟體即服務 (SaaS) 供應商這類的多用戶群叢集通常會執行使用者提交的未知程式碼。安全研究是另一個應用程式,工作負載可能需要比節點預設提供的隔離措施更強大的隔離措施。

您可以在叢集上啟用 GKE Sandbox,將不受信任的工作負載隔離在節點的沙箱中。GKE Sandbox 是以開放原始碼專案 gVisor 建構而成。

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

GKE 會使用基礎 Compute Engine 執行個體的執行個體中繼資料,為節點提供憑證和設定,用於啟動節點及連線至控制平面。這項中繼資料包含節點上的 Pod 不需要存取的機密資訊,例如節點的服務帳戶金鑰。

您可以使用 Workload Identity Federation for GKE,鎖定機密的執行個體中繼資料路徑。GKE 適用的工作負載身分聯盟會在叢集中啟用 GKE 中繼資料伺服器,過濾對 kube-env 等敏感欄位發出的要求。

Autopilot 叢集一律會啟用 Workload Identity Federation for GKE。在標準叢集中,除非您手動啟用 GKE 適用的工作負載身分聯盟,否則 Pod 可以存取執行個體中繼資料。

網路安全

在 GKE 中執行的多數工作負載都需要與在叢集內外執行的其他服務進行通訊。您可使用不同方法來控制可流經叢集及其 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

詳情請參閱內部負載平衡教學課程

篩選叢集外的流量

如要控管外部實體與叢集之間的網路流量,請使用 Cloud Next Generation Firewall。舉例來說,您可以使用防火牆設定,封鎖從 Pod 傳出至未核准目的地的流量。

防火牆設定不足以控管叢集中容器映像檔的來源登錄檔。如要限制容器映像檔僅從一組核准的登錄檔提取,請參閱「封鎖來自未核准登錄檔的容器映像檔」。

保護工作負載

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

限制容器化 Pod 程序的權限

限制容器化程序權限對叢集的整體安全至關重要。如這篇文章所述,GKE Autopilot 叢集一律會限制特定權限。

您也可以透過 Pod 和容器上的安全情境,設定安全相關選項。這些設定可讓您變更程序的安全設定,如:

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

如要在叢集層級而非 Pod 或容器層級強制執行這些限制,請使用 PodSecurityAdmission 控制器。叢集管理員可使用 PodSecurityAdmission,確保叢集或命名空間中的所有 Pod 都符合Pod 安全性標準中預先定義的政策。您也可以使用 Gatekeeper,在叢集層級設定自訂 Pod 安全性政策。

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

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

瞭解詳情:

授權 Pod 存取 Google Cloud 資源

您的容器和 Pod 可能需要存取Google Cloud中的其他資源。方法有三種:

授權 Pod 存取資源最安全的方式,是使用 Workload Identity Federation for GKE。 Google Cloud 透過 GKE 適用的 Workload Identity Federation,Kubernetes 服務帳戶可以 IAM 服務帳戶身分執行作業。以 Kubernetes 服務帳戶執行的 Pod 會具備 IAM 服務帳戶的權限。

Workload Identity Federation for GKE 可與 GKE Sandbox 搭配使用。

節點服務帳戶

在標準叢集中,Pod 也可以使用節點的 Compute Engine 虛擬機器 (VM) 所用服務帳戶的憑證,向Google Cloud 進行驗證。

這種做法與 GKE Sandbox 不相容,因為 GKE Sandbox 會封鎖對 Compute Engine 中繼資料伺服器的存取權。

您可以使用服務帳戶金鑰,將 Google Cloud 資源的憑證授予應用程式。由於帳戶金鑰難以安全管理,因此強烈建議不要採用這種做法。

如果您選擇這個方法,請為每個應用程式使用自訂 IAM 服務帳戶,如此一來應用程式就有最基本的必要權限。為每個服務帳戶授予配對應用程式順利運作所需的最低 IAM 角色。讓服務帳戶保持應用程式專用,可在應用程式遭入侵時撤銷存取權,而不會影響其他應用程式。為服務帳戶指派正確的 IAM 角色後,即可建立 JSON 服務帳戶金鑰,然後使用 Kubernetes 密鑰將金鑰掛載到您的 Pod。

使用二進位授權

二進位授權是Google Cloud 上的一項服務,為雲端執行的應用程式提供軟體供應鏈安全性。二進位授權可搭配您從 Artifact Registry 或另一個容器映像檔註冊資料庫部署到 GKE 的映像檔。

有了二進位授權強制執行功能,即可確保應用程式會在內部完成保護軟體品質與完整性的程序後,才部署到實際工作環境。如需建立啟用二進位授權功能的叢集的操作說明,請參閱二進位授權說明文件中的「建立叢集」。

透過二進位授權持續驗證 (CV),您可以確保系統定期監控與 Pod 相關聯的容器映像檔,確保這些映像檔符合不斷演進的內部程序。

稽核記錄

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

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

瞭解詳情:

內建安全措施

GKE 會對叢集中的系統物件強制執行特定限制。當您執行建立或修補工作負載等作業時,名為 warden-validating准入 Webhook 會根據一組受限作業驗證您的要求,並決定是否允許該要求。

這項政策造成的許可錯誤類似於下列錯誤:

GKE Warden rejected the request because it violates one or more constraints.

Autopilot 叢集安全措施

Autopilot 叢集會根據我們的專業知識和業界最佳做法,套用多項安全性設定。詳情請參閱「Autopilot 的安全措施」。

標準叢集安全措施

與 Autopilot 叢集相比,Standard 叢集預設的限制較少。GKE Standard 叢集具有下列安全設定:

  • 您無法更新 GKE 管理系統工作負載使用的 ServiceAccount,例如 kube-system 命名空間中的工作負載。
  • 您無法將 cluster-admin 預設 ClusterRole 繫結至 system:anonymoussystem:unauthenticatedsystem:authenticated 群組。