本文說明 Google Kubernetes Engine (GKE) 如何協助保護叢集控制層元件。本文假設您已瞭解下列事項:
本文適用於資安專家,說明 Google 如何管理 GKE 控制層元件,以及採取哪些安全措施,有效評估風險並確保 GKE 部署作業的安全。
GKE 內建多種安全防護功能,例如安全強化型 OS、強大的架構和隔離機制、安全的控制層存取權、etcd 或 Spanner 型叢集狀態資料庫的安全防護、憑證授權單位和叢集信任,以及安全漏洞和修補程式管理。
在共同責任模式下,Google 會為您管理 GKE 控制層元件。控制層包含 Kubernetes API 伺服器、Kubernetes API 物件儲存庫和其他控制器。Google 負責保護控制層,但您或許可以根據需求設定特定選項。您有責任保護節點、容器和 Pod。
強化的作業系統
GKE 控制層元件是在 Container-Optimized OS 上執行,這是一個由 Google 設計的安全強化作業系統。如要詳細瞭解 Container-Optimized OS 內建的安全性功能,請參閱 Container-Optimized OS 安全性總覽。
架構與隔離
在 GKE 叢集中,控制層元件會在 Google 擁有的 Compute Engine 執行個體上執行,這些執行個體位於 Google 管理的專案中。每個例項只會為一個叢集執行這些元件。
如要進一步瞭解叢集元件如何相互驗證,請參閱「叢集信任」。
控制層對專案的存取權
GKE 會使用名為 Kubernetes Engine 服務代理的服務代理,代表您啟動叢集資源,例如節點、磁碟和負載平衡器。系統會自動將Kubernetes Engine 服務代理程式角色 (roles/container.serviceAgent) 授予專案中的服務帳戶。
Kubernetes Engine 服務代理程式的電子郵件地址如下:
service-PROJECT_NUMBER@container-engine-robot.iam.gserviceaccount.com
在這個電子郵件地址中,PROJECT_NUMBER 是您的專案編號。
叢集的管理員權限
Google Site Reliability Engineers 的 SSH 工作階段是透過 Google 的內部稽核基礎架構進行稽核紀錄,該架構可用於識別和安全性應變。詳情請參閱 Google 安全性白皮書中的「管理員權限」。
叢集狀態資料庫安全性
在 Google Cloud中,客戶內容預設會在檔案系統層級加密。這項加密機制涵蓋的基礎架構,包括託管 etcd 或 Spanner 資料庫的基礎架構,這些資料庫會儲存叢集中 Kubernetes API 物件的狀態。如要進一步瞭解叢集狀態資料庫,請參閱「GKE 叢集架構」。
叢集狀態資料庫會將叢集中每個 Kubernetes API 物件的設定儲存為鍵/值組合。GKE 會在控制層 VM 上使用特定 TCP 通訊埠,與叢集狀態資料庫進行下列類型的通訊:
etcd API 用戶端:GKE 會在每個控制層 VM 上提供 etcd API。控制層中的 etcd API 用戶端 (例如 Kubernetes API 伺服器) 會使用下列其中一個連接埠:
- 連接埠 2379:GKE 會使用這個連接埠,將叢集狀態儲存在每個控制層 VM 中執行的 etcd 資料庫執行個體。
- 連接埠 3379:當 GKE 將叢集狀態儲存在與控制層不同的 Spanner 資料庫時,會使用這個連接埠。
etcd API 用戶端使用的通訊埠會繫結至本機回送網路介面,且只能從執行 Kubernetes API 伺服器的控制層 VM 存取。
etcd 資料庫執行個體:如果控制層 VM 執行 etcd 資料庫執行個體,每個 VM 上的 etcd API 伺服器會使用通訊埠 2380 互相通訊。多個控制層 VM (例如區域叢集) 上 etcd 資料庫執行個體之間的 2380 通訊埠流量,會透過相互 TLS 加密。使用相互 TLS 時,每部伺服器都必須向另一部伺服器證明自己的身分。
如果叢集將叢集狀態儲存在 Spanner 資料庫,則不會使用通訊埠 2380,因為資料庫不會在控制層 VM 中執行。
憑證授權單位和叢集信任
每個叢集都有自己的根憑證授權單位 (CA)。Google 內部服務會管理這個 CA 的根金鑰。這個 CA 的根金鑰會分配給執行 Kubernetes API 伺服器的 VM 中繼資料。節點和 Kubernetes API 伺服器之間的通訊受到 TLS 保護。 每個叢集也有自己的 etcd API 叢集根憑證授權單位,如果叢集執行 etcd 資料庫執行個體,則也適用於 etcd 執行個體之間的流量。詳情請參閱「叢集信任」。
安全漏洞和修補程式管理
GKE 會遵循 Google 標準以進行測試、合格鑑定,並逐步推行對控制層的變更。這將大幅降低控制層元件無法使用的風險。GKE 會遵循服務水準協議,該協議定義了可用性的許多層面。
GKE 控制層元件是由 Google 的網站可靠性工程師團隊進行管理,並與最新的安全性修補程式保持同步。這包括主機作業系統的修補程式,Kubernetes 元件以及在控制層 VM 上執行的容器。
GKE 會將新的核心、OS 和 Kubernetes 層級修正程式,迅速套用至控制層 VM。如果這些更新包含已知安全漏洞的修正程式,請參閱 GKE 安全性公告瞭解詳情。GKE 會使用 Artifact Analysis 掃描所有 Kubernetes 系統和 GKE 專屬容器,找出安全漏洞,並持續修補容器,讓整個 Kubernetes 生態系統受益。
Google 工程師會參與尋找、修復和揭露 Kubernetes 安全漏洞。Google 也會透過全 Google 安全漏洞獎勵計畫,支付外部安全研究人員的費用,請他們尋找安全錯誤。在某些情況下,例如 2017 年 10 月的 dnsmasq 漏洞,GKE 能夠在漏洞公開前,修補所有執行中的叢集。
Google 所提供的安全性監控和設定功能
前幾節討論的安全功能是由 Google 管理。 本節和「可以設定的部分」一節說明您可以監控及設定的安全防護功能。
- 稽核記錄:系統預設會啟用稽核記錄。這項功能會提供 Kubernetes API 伺服器的詳細記錄,並顯示在 Google Cloud Observability 中。您可以在Google Cloud 控制台的「Logs Explorer」中查看記錄項目。您也可以使用 BigQuery 查看及分析這些記錄。
控制層 VM 映像檔完整性:GKE 會將節點 VM 建立和啟動事件的詳細記錄新增至 Cloud Logging。此外,我們也會在 GitHub 上發布與控制層和 worker 節點機器映像檔對應的 SLSA VSA。您可以確認 VM 使用的 OS 映像檔具有對應的 VSA,並驗證每個控制層 VM 的啟動完整性。
如要執行 VM 完整性驗證,請參閱「驗證 GKE 控制層 VM 完整性」。
可以設定的部分
雖然 GKE 會代您管理大部分的控制層,但您可以控制下列項目:
控制層存取權:控制層有兩種叢集存取端點:
- DNS 端點
- 以 IP 為準的端點
根據預設,Kubernetes API 伺服器會使用外部 IP 位址。您可以啟用以 DNS 為基礎的端點,存取控制層來保護 Kubernetes API 伺服器。您可以使用 VPC Service Controls 控管 DNS 端點的存取權,為專案中的所有 Google API 定義一項安全參數。如果使用 IP 端點存取控制層,建議您使用授權網路,並停用控制層外部端點的存取權。如要進一步瞭解網路隔離,請參閱「關於自訂網路隔離」。
驗證:您可以使用 IAM 做為身分識別提供者,在 GKE 中處理叢集驗證。為強化驗證安全性,系統預設會停用基本驗證和用戶端憑證核發功能。
憑證輪換:定期執行憑證輪換,輪換叢集憑證授權單位 (CA) 和 TLS 憑證。在此期間,GKE 也會輪替 Kubernetes API 伺服器的 IP 位址。詳情請參閱「憑證輪換」。
此外,如果貴組織對控制層有嚴格的法規遵循或政策規定,GKE control plane authority 是一組功能,可讓您進一步掌握及控管控制層的特定層面,包括:
- 使用 Cloud KMS 和 CA 服務,執行自己的 CA 和金鑰,以核發身分識別。
- 使用 Cloud KMS 中的自有金鑰,加密 etcd 和控制層開機磁碟。
如要瞭解使用這些功能的原因和所有可用功能,請參閱「關於 GKE 控制層授權」。