本文說明 Connect 內建的安全防護機制。
有效的混合式和多雲端平台可提供集中式管理、可觀測性,以及跨環境的服務存取權。無論您使用哪種 Kubernetes 供應商,GKE Enterprise 都能提供一致且全面的體驗。Connect 是一種輕量型代理程式,可大規模提供下列功能,並支援多個供應商:
- 多叢集管理和叢集可視性
- 應用程式服務部署和生命週期管理
本文將探討下列主題:
- Connect 的設計如何將安全性擺在第一位
- 部署 Connect 代理程式的最佳做法
- 如何提升 Kubernetes 部署的安全防護機制
Connect 架構
Connect 可讓使用者和服務存取不在公用網際網路上的 Kubernetes API 伺服器。 Google CloudConnect Agent 會在 Kubernetes 叢集中執行 (每個叢集一個代理程式),並連線至 Connect Proxy。 Google Cloud 需要與 Kubernetes 叢集互動的服務會連線至 Proxy,Proxy 會將要求轉送至代理程式。代理程式會將這些要求轉送至 Kubernetes API 伺服器,如下圖所示。
部署代理程式後,代理程式會與Google Cloud 建立持續的傳輸層安全標準 (TLS) 1.2 以上連線,等待要求。 Google Cloud 服務 (由管理員啟用) 可以為 Kubernetes 叢集產生要求。這些要求也可能來自使用者與 Google Cloud 控制台、Connect Gateway 或其他 Google 服務的直接互動。
Google Cloud 服務會將要求傳送至 Proxy。接著,Proxy 會將要求轉送至負責叢集的已部署代理程式,最後代理程式會將要求轉送至 Kubernetes API 伺服器。Kubernetes API 伺服器會套用 Kubernetes 驗證、授權和稽核記錄政策,並傳回回應。回應會透過代理程式和 Proxy 傳回 Google Cloud 服務。在流程的每個步驟中,元件都會執行連線和要求層級的驗證和授權。
Kubernetes API 伺服器會對所有要求 (包括透過 Connect 提出的要求) 採用相同的驗證、授權和稽核記錄政策。這個程序可確保您隨時都能控管叢集的存取權。
連線和縱深防禦
縱深防禦機制是 Google Cloud 基礎架構和安全防護做法的內在特質。我們從各個層面著手,保護機構和客戶的安全,確保重要資料、資訊和使用者受到保護。這也是我們設計 Connect 的原則。
除了 Google 本身的縱深防禦策略和設計之外,您也應根據自身的安全狀態和標準,評估這裡提供的內容。本節將說明可採取的額外措施,以補足 Kubernetes 強化最佳做法。
元件對元件安全防護
Connect 要求的每個元件都會驗證同層級,且只會與經過驗證並授權存取該資料的同層級分享資料,如下圖所示。
Connect 要求的每個元件都會使用下列項目,彼此進行驗證:
- 傳輸層安全標準 (TLS)
- 應用程式層傳輸安全性 (ALTS)
- OAuth
Connect 要求的每個元件都會使用下列項目,彼此授權:
- 身分與存取權管理 (IAM)
- 許可清單
Kubernetes 叢集與 Google Cloud 之間的連線都會經過加密,且每條連線至少有一個對等互連端會使用憑證式驗證。這項程序可確保所有權杖憑證在傳輸過程中都會加密,且只會由經過驗證和授權的對等互連裝置接收。
向 Google Cloud驗證使用者
使用 Google Cloud 控制台時,使用者會經歷標準 Google 登入流程。Google Cloud 會提供 TLS 憑證,供使用者瀏覽器進行驗證,使用者登入 Google Cloud 或 Google Workspace 帳戶,即可向 Google Cloud進行驗證。
透過 Google Cloud 控制台或其他 API 存取專案的權限,是由 IAM 權限控管。
Google Cloud 服務對服務驗證
Google Cloud 使用 ALTS 進行內部服務對服務驗證。ALTS 可讓 Proxy 等服務建立經過驗證且受到完整性保護的連線。 Google Cloud
Google Cloud 服務必須獲得內部授權,才能使用 Proxy 連線至遠端 Connect 執行個體,因為 Proxy 會使用服務身分允許清單來限制存取權。
驗證 Google Cloud
代理程式會使用 TLS 驗證及加密每個連線。代理程式會使用二進位檔內建的一組根憑證,驗證 TLS 憑證,避免不慎信任新增至代理程式容器的憑證。 Google Cloud 代理程式只會針對正確驗證的端點執行 API 呼叫。這個程序可確保服務帳戶憑證和 Kubernetes API 要求是由Google Cloud傳送,且任何回應只會傳送至 Google Cloud。
如要查看代理程式在正常運作期間通訊的網域清單,請參閱「確保網路連線」。
您可以設定代理程式,透過 HTTP Proxy 連線至 Google Cloud。在此設定中,代理程式會針對 HTTP Proxy 使用 HTTP/1.1
CONNECT
,並建立與Google Cloud的 TLS 連線。HTTP Proxy 只會看到代理程式和 Google Cloud之間的加密流量。代理程式與 Google Cloud 之間的連線完整性和安全性不受影響。
驗證代理程式
代理程式會使用 Google Cloud 機群 Workload Identity 聯盟驗證身分。 機群 Workload Identity 聯盟可讓您使用內建 Google Cloud 和 Kubernetes 驗證機制,從機群工作負載向 Google Cloud API 驗證身分。當代理程式想要向 Google Cloud進行驗證時,會將 Kubernetes 服務帳戶權杖換成代表工作負載身分的存取權杖。
Kubernetes API 伺服器
代理程式會使用 Kubernetes 用戶端程式庫,建立與 Kubernetes API 伺服器的 TLS 連線。Kubernetes 執行階段會為代理程式的容器提供 TLS 憑證授權單位 (CA) 憑證,代理程式會使用這項憑證驗證 API 伺服器。
如下一節所述,API 伺服器會分別驗證每項要求。
要求安全
透過 Connect 傳送的每項要求都包含可識別要求傳送者的憑證:產生要求的Google Cloud 服務,以及 (如適用) 要求傳送對象的最終使用者。 Google Cloud Kubernetes API 伺服器會根據這些憑證,為每個要求提供授權和稽核控制項。
服務對代理程式驗證
傳送至代理程式的每項要求都包含短期符記,用於識別傳送要求的Google Cloud 服務,如下圖所示。
權杖是由專門與 Google Cloud 服務相關聯的 Google Cloud 服務帳戶簽署。代理程式會擷取服務帳戶的公開金鑰,以驗證權杖。這個權杖不會轉送至 API 伺服器。
代理程式會使用二進位檔內嵌的 CA 根憑證驗證 Google Cloud 憑證。這個程序可確保 Google Cloud收到真實且未經變造的要求。
使用者驗證
Google Cloud 代表使用者存取叢集的服務需要使用者的憑證,才能向 API 伺服器進行驗證,如下圖所示。
這項政策可確保使用者透過 Connect 存取時,系統會套用同一組權限。部分Google Cloud 服務會代表使用者向 API 伺服器進行驗證。舉例來說,使用者可以存取 Google Cloud 控制台,查看已註冊 Fleet 的叢集中的工作負載。使用者存取這些服務時,會提供 Kubernetes API 伺服器可辨識的憑證:Kubernetes API 伺服器支援的任何權杖。
Google Cloud 控制台會將這些憑證儲存在使用者設定檔中。這些憑證會在閒置時加密,且只能透過使用者的Google Cloud 或 Google Workspace 憑證存取,並僅用於透過「連結」建立連線。這些憑證無法再次下載。使用者登出叢集、在 Google Cloud中刪除叢集註冊、刪除專案或刪除使用者帳戶時,系統會刪除憑證。詳情請參閱 Google Cloud上的資料刪除作業。
使用者與 Google Cloud 控制台互動時,系統會產生 Kubernetes API 伺服器的要求。服務會透過 Connect 傳送使用者憑證和要求。接著,代理程式會向 Kubernetes API 伺服器提交要求和憑證。
Kubernetes API 伺服器會驗證使用者憑證、對使用者身分執行授權、產生動作的稽核事件 (如果已設定),並傳回結果。由於系統會使用使用者提供的憑證驗證要求,Kubernetes API 伺服器會對 Connect 要求套用與其他要求相同的授權和稽核政策。
服務對 Kubernetes 的驗證
Google Cloud 在使用者環境外存取 Kubernetes API 伺服器的服務,會使用 Kubernetes 模擬功能向 Kubernetes API 伺服器進行驗證。這個方法可讓 Kubernetes API 伺服器提供服務專屬的授權檢查和稽核記錄,如下圖所示。
Google Cloud 的服務可以在使用者環境外使用 Connect。舉例來說,多叢集 Ingress 服務可以自動在叢集間同步處理 Ingress 資源。這些服務沒有 Kubernetes API 伺服器可驗證的憑證:大多數 API 伺服器並未設定為驗證 Google Cloud 服務的憑證。不過,API 伺服器可以透過模擬,將有限的驗證權限委派給其他服務,而代理程式可以驗證 Google Cloud 透過 Connect 傳送要求的服務。這些權限可讓代理程式透過服務帳戶驗證身分,提出要求。 Google Cloud
當 Google Cloud 服務代表自己傳送要求 (而非在使用者環境中) 時,代理程式會將自己的 Kubernetes 憑證和Kubernetes 模擬標頭 (用於識別 Google Cloud 服務) 新增至要求。模擬標頭會聲明代理程式驗證的 Google Cloud 服務帳戶使用者名稱。
Kubernetes API 伺服器會驗證代理程式的憑證,並檢查代理程式是否可以模擬 Google Cloud 服務帳戶。模擬功能通常由角色式存取控管 (RBAC) 規則控管,且可限定於特定身分,例如 Google Cloud 服務帳戶。
如果代理程式已獲授權可模擬所要求的身分,API 伺服器就會對 Google Cloud 服務帳戶執行授權檢查,並處理要求。要求的稽核記錄會同時包含代理程式的身分和模擬的 Google Cloud 服務帳戶。
叢集內安全防護
如以下圖表所示,代理程式最終會將 Kubernetes API 要求傳送至 Kubernetes API 伺服器。
Kubernetes API 伺服器會驗證、授權及稽核記錄這些要求,就像處理所有其他要求一樣。
做為這些要求的代理程式,代理程式可以存取私密資料,例如憑證、要求和回應。Kubernetes 和 Kubernetes 生態系統提供一系列工具,可防止其他行為人取得存取權,並確保代理程式只會存取應存取的內容。
Kubernetes 驗證
Kubernetes API 伺服器會驗證每個傳入要求傳送者的身分,以判斷要在授權階段套用哪些權限。如先前所述,要求會包含使用者憑證,或代理程式的 Kubernetes 憑證和模擬標頭。
叢集管理員仍可控管 Kubernetes API 伺服器可辨識的驗證機制。管理員或許可以撤銷使用者的憑證,以及撤銷或降低代理程式憑證的權限。
Kubernetes 授權
Kubernetes API 伺服器會檢查經過驗證的身分是否允許對所要求的資源執行所要求的動作。
叢集管理員可以使用任何 Kubernetes 授權機制設定授權規則。Connect 不會代表叢集執行任何授權檢查。
代理程式安全性
代理程式可存取自己的 (Kubernetes 和 Google Cloud) 憑證,以及通過代理程式的憑證、要求和回應。因此,代理程式在已連線的叢集中佔據可信賴的位置。
代理程式的設計遵循下列安全基本原則:
- 代理程式是以 Go 語言編寫,可提供垃圾收集記憶體管理功能,並防止許多不安全的記憶體作業。
- 代理程式會部署在 distroless 容器映像檔中。代理程式的映像檔不包含殼層、libc 或其他與代理程式執行路徑無關的程式碼。
- Google 的共用建構基礎架構會根據已簽入的程式碼建構代理程式的映像檔。只有這個建構系統可以將代理程式映像檔部署至 Container Registry。Google Cloud 開發人員無法自行部署新映像檔。這個程序可確保所有對代理程式來源的編輯作業,都能追溯至作者和審查者,以防否認。
代理程式會在您註冊叢集時部署,並以標準部署的形式在 Kubernetes 叢集中執行。因此,適用於監控及保護部署作業、ReplicaSets
和 Pod 的所有選項和最佳做法,都適用於代理程式。
這些機制旨在防止代理程式容器遭到入侵。不過,如果擁有代理程式節點的特殊存取權,仍可能導致代理程式環境遭到入侵;因此,管理員務必遵循標準 Kubernetes 安全性指南,保護叢集基礎架構。
透過 VPC Service Controls 保護資料安全
VPC Service Controls 可為Google Cloud 服務提供 Identity and Access Management (IAM) 以外的另一層防護。IAM 提供精細的「身分式存取權控管功能」,VPC Service Controls 則提供較廣泛的「情境式範圍安全防護功能」,包括控管跨範圍的資料輸出作業。舉例來說,您可以指定只有特定專案可以存取 BigQuery 資料。如要進一步瞭解 VPC Service Controls 如何保護資料,請參閱 VPC Service Controls 總覽。
確認可從指定服務範圍內存取使用 Connect 的必要服務後,即可搭配 VPC Service Controls 使用 Connect,進一步確保資料安全。
如要使用 VPC Service Controls,請啟用下列 API:
cloudresourcemanager.googleapis.com
gkeconnect.googleapis.com
gkehub.googleapis.com
您也需要設定私人連線,才能存取相關 API。如需詳細步驟,請參閱「設定私人連線」。