服務安全性 (舊版)
本文件概述了使用負載平衡 API 的 Cloud Service Mesh 服務安全性。這項功能適用於希望在部署中加入驗證、加密和授權功能的 Cloud Service Mesh 使用者。本文件假設您熟悉使用 Envoy 的 Cloud Service Mesh,以及使用無 Proxy gRPC 應用程式。
本文適用於使用負載平衡 API 的設定。如果您使用服務路由 API,請參閱「服務安全性」。這是舊版文件。
Cloud Service Mesh 可讓您保護網格中的服務對服務通訊。在網格中,每項服務都有一個身分。下列功能可協助您支援安全的通訊方式:
- 針對使用 Envoy 的 Cloud Service Mesh 和使用無 Proxy gRPC 應用程式的 Cloud Service Mesh,採用傳輸層安全標準 (TLS) 和雙向 TLS (mTLS) 的驗證和加密機制。用戶端 TLS 政策和伺服器 TLS 政策會控制服務是否需要向彼此證明身分,以及是否使用加密通訊管道。
- 根據用戶端和要求的特性進行授權。授權政策可控管服務是否可存取其他服務,以及允許哪些動作。
使用私人憑證授權單位 (CA) 提供的憑證和金鑰 (Google 的憑證授權單位服務),有助於您更輕鬆地維護服務安全。CA 服務提供 GKE 網格憑證。您可以使用 GKE 網格憑證功能和 Cloud Service Mesh,自動部署這些憑證,並讓工作負載使用這些憑證。您可以修改 Pod,讓工作負載接收及使用 mTLS 憑證。Cloud Service Mesh 服務安全性僅適用於以 GKE 為基礎的工作負載。
在以微服務為基礎的現代架構中,較小且更專注的服務取代了大型單體式應用程式。服務呼叫會透過網路彼此通訊。這些呼叫是單體應用程式中的處理中呼叫,會帶來安全性挑戰,因此最好對這些呼叫進行驗證、加密和授權。這些步驟可支援零信任原則,在該原則中,不論流量來自網路內部或外部,都會假設所有網路流量都存在風險。
服務網格設計模式可將服務間通訊相關的複雜性與商業邏輯分開。相反地,資料平面會處理這項複雜作業。除了降低應用程式複雜度,服務網格設計模式還可支援安全性模式,否則這些模式可能難以實作及管理。
在這個模型中,無 Proxy gRPC 或 Envoy 附屬程式會從 Cloud Service Mesh 取得設定資訊,並從 CA 服務資源池取得憑證,藉此安全地驗證及加密通訊。
這些安全性功能可提供下列功能,讓您更輕鬆地部署 Cloud Service Mesh:
- 自動為網格中的所有服務提供金鑰和憑證。
- 自動輪替金鑰和憑證,提供額外安全性。
- 與 Google Kubernetes Engine (GKE) 整合,以便使用其所有功能,例如部署描述和標籤。
- Google 代管服務 (包括 Cloud Service Mesh 和 CA 服務代管的私人憑證授權單位集區) 的可用性高。
- 與 Google Identity and Access Management (IAM) 相關的安全性:根據已授權的 Google 服務帳戶授予服務授權。
- 與 Envoy 和無 Proxy 工作負載的完美互通性。舉例來說,服務可能位於 Envoy Proxy 後方,但用戶端使用 gRPC 無 Proxy 服務網格安全性。反之,服務可能位於 gRPC 無 Proxy 服務網格安全性後方,但用戶端使用 Envoy Proxy。
確保服務對服務的通訊安全
Cloud Service Mesh 提供授權,以及使用傳輸層安全標準 (TLS) 的加密和驗證服務對服務安全性。用戶端 TLS 政策和伺服器 TLS 政策可讓服務執行以下操作:
- 斷言及驗證身分。
- 使用 TLS 或 mTLS 加密通訊工作階段。
在服務網格中,資料層會處理這類安全性機制,因此應用程式不必採取特殊措施就能確保安全性。
授權政策可讓您根據自訂規則拒絕或允許存取權。
使用 TLS 進行加密
當服務使用 HTTP、HTTP/2 或 gRPC 通訊協定呼叫其他服務時,透過網路傳輸的流量會以明文傳送。這類流量可能會遭受中間人攻擊,攻擊者會攔截流量,並檢查或操縱其內容。
為降低這項潛在問題的影響,您可以使用 HTTP、HTTP/2 或透過 TLS 的 gRPC 與 Cloud Service Mesh 搭配使用。當您透過 TLS 使用這些通訊協定時,系統會使用以伺服器憑證為基礎的 TLS 加密用戶端和伺服器之間的流量。流量不再以純文字形式傳輸,因此攻擊者較難攔截、檢查或操縱內容。
使用 TLS 進行驗證
當服務呼叫其他服務時,請考量下列問題:
用戶端如何知道收到的回應來自正確的伺服器,而非冒用者?舉例來說,在以 HTTP 為基礎的一般要求-回應互動中,用戶端不會驗證伺服器的身分。
如果攻擊者攔截該流量,會發生什麼情況?舉例來說,HTTP 流量並未加密,因此任何接收流量的使用者都可以檢查內容。這就是所謂的「人為攔截」攻擊。
為減輕這些問題,您可以使用 TLS 的 HTTP、HTTP/2 和 gRPC。在用戶端和伺服器之間的這些交換作業中,伺服器必須使用伺服器憑證向用戶端證明自身身分。然後使用 TLS 加密要求和回應。
雙向傳輸層安全標準 (TLS) 驗證
當 Cloud Service Mesh 為用戶端和伺服器設定應用程式網路時 (例如在用戶端設定 Envoy Proxy,並在伺服器端設定另一個 Envoy Proxy),您就能運用雙向驗證等進階驗證模式。
在非以雙向驗證為基礎的典型 HTTP 傳輸層安全標準交換中,伺服器會提供用於加密用戶端和伺服器之間通訊的憑證。用戶端可以檢查伺服器在 TLS 握手期間傳回的簽名,藉此驗證伺服器的身分。不過,伺服器不會驗證用戶端的身分。
啟用雙向驗證時,用戶端也會有憑證。如上一節所述,用戶端會驗證伺服器的身分,而伺服器也可以驗證用戶端的身分。用戶端和伺服器憑證都會用於加密通訊管道。這也讓伺服器能夠根據已驗證的用戶端身分授權用戶端。
授權服務呼叫
您可以使用授權政策選擇允許或拒絕服務存取權。您可以使用 Cloud Service Mesh 定義允許和拒絕規則,根據要求參數授權存取權。您可以根據第 3 層和第 7 層參數建立這些規則,包括用戶端 ID (這是從 mTLS 連線中的 client-cert
衍生而來)、來源 IP 位址、主機比對、方法比對和標頭比對。下圖顯示使用 Envoy 代理程式進行授權。這個程序與 gRPC 用戶端類似。
使用授權限制存取
服務中介網中的最佳做法是遵循最低權限原則。您可以遵循這項原則,將服務存取權限制為僅限於依賴該服務的呼叫端。當呼叫端嘗試存取未經授權的服務時,系統會拒絕該嘗試。
您可以使用 Cloud Service Mesh 設定授權政策,讓資料層依據您定義的規則允許或拒絕服務存取權。這些政策包含兩個元件:
- 動作:允許或拒絕
- 規則清單
傳送要求或 RPC 時,呼叫服務的 Cloud Service Mesh 用戶端會判斷是否有相符的規則。如果找到相符項目,系統就會允許或拒絕要求或 RPC。您可以定義規則,以便比對屬性,例如:
- 使用 mTLS 時,呼叫服務的 Kubernetes 服務帳戶
- 呼叫服務的 IP 位址 (或位址範圍)
- 目的地服務的通訊埠
- 要求的 HTTP 屬性,包括主機名稱、方法和使用者定義的 HTTP 標頭。
安全命名
您可以使用 Cloud Service Mesh 設定安全命名,做為額外的安全機制。這可讓您為用戶端嘗試連線的特定服務,定義一組允許的名稱清單或 SPIFFE (Secure Production Identity Framework for Everyone) 身分。在 TLS 交換期間,服務的後端會將 X.509 憑證傳回給用戶端。接著,用戶端會檢查憑證,確認 X.509 憑證與其中一個名稱或 SPIFFE 身分相符。如要進一步瞭解 SPIFFE 身分,請參閱「適用於所有人的安全正式版身分架構」。
在閘道中保護流量
如要設定閘道,您可以使用 Cloud Service Mesh。閘道是獨立的 Envoy 代理程式,通常會扮演下列任一角色:
- 輸入閘道:處理進入網格或其他網域的流量
- 輸出閘道:處理離開網格或其他網域的流量
- 反向 Proxy 或中介 Proxy,可將傳入流量分配至一或多項服務
如要將流量傳送至中繼或從中繼傳送流量的用戶端,會將流量傳送至中繼。接著,閘道會根據您透過 Cloud Service Mesh 設定的規則處理要求。舉例來說,您可以強制要求進入網格的流量 (透過入口閘道) 必須使用 TLS 加密。
安全性元件
Cloud Service Mesh 服務安全性支援用戶端 TLS 政策、伺服器 TLS 政策和授權政策。您建立這些政策,讓 Cloud Service Mesh 能夠設定資料層並啟用安全性功能。如要建立或更新這些政策,您不需要變更應用程式。
加密和支援的驗證模式
當服務呼叫其他服務時,建立安全通訊的第一步驟就是讓每項服務向其他服務證明自己的身分。服務需要證明自身身分的程度取決於您設定的 TLS 模式。
您可以設定下列安全性層級:
- 未加密/未經驗證
- TLS
- 相互傳輸層安全標準 (mTLS)
- 寬容模式:mTLS 或未加密/未驗證,視用戶端啟動連線的方式而定
憑證和憑證授權單位
憑證和信任的憑證授權單位 (CA) 為服務網格等分散式系統提供信任基礎。使用憑證時,服務可以透過下列方式證明自身身分,並驗證向其提供的身分:
- 如要向其他服務證明自身身分,服務會將憑證提交給其他服務。兩項服務都信任的 CA 會進行加密編譯簽署並核發此憑證。
- 接收此憑證的服務可以驗證憑證是否來自其信任的 CA。
Cloud Service Mesh 不是憑證授權單位。如要啟用安全通訊功能,您必須設定可執行下列操作的機制:
- 佈建身分和憑證
- 讓 Cloud Service Mesh 設定的 Cloud Service Mesh 用戶端 (例如 Envoy 代理程式) 可使用憑證
Cloud Service Mesh 支援 Google 的 CA 服務。Envoy 和無 Proxy gRPC 的設定指南包含相關設定說明 (詳情請參閱「後續步驟」)。
架構與資源
Cloud Service Mesh 包含 Network Security API 命名空間,其中包含三個 Google Cloud API 資源,可讓您指定應套用至資料層的安全性政策。
兩個 Google Cloud API 資源可支援網格中的驗證:用戶端 TLS 政策和伺服器 TLS 政策。第三個資源 (授權政策) 則支援授權。
Network Services API 命名空間包含端點政策資源,可讓 Cloud Service Mesh 為端點提供設定 (伺服器 TLS、用戶端 TLS 和授權政策)。端點是 Cloud Service Mesh 用戶端,可終止來自其他 Cloud Service Mesh 用戶端的傳入通訊。
如要啟用安全性服務,請在部署中使用目標 HTTPS Proxy 或目標 gRPC Proxy。您無法使用目標 HTTP Proxy 或目標 TCP Proxy。
用戶端 TLS 政策
您可以使用用戶端 TLS 政策指定用戶端 TLS 模式,以及要套用至資料層的憑證提供者資訊。用戶端 TLS 政策支援 TLS 和 mTLS 驗證。用戶端 TLS 政策必須附加至全域後端服務資源。
設定 TLS 時,您必須提供一種機制,讓用戶端使用 serverValidationCa
API 欄位,驗證在 TLS 交換期間從伺服器收到的憑證。用戶端會使用這些資訊取得驗證憑證,以便驗證伺服器憑證。
設定 mTLS 時,您也必須提供一種機制,讓用戶端使用 clientCertificate
API 欄位取得憑證和私密金鑰。用戶端會在 TLS 握手期間使用這項資訊,向伺服器提供憑證。
在這個版本中,Cloud Service Mesh 支援代管的憑證授權單位 CA 服務。設定方式很簡單:設定憑證提供者時,請指定 google_cloud_private_spiffe
外掛程式名稱。這會導致 xDS 用戶端從靜態位置載入憑證和金鑰。您必須先設定 CA 服務集區,並在 GKE 叢集上啟用網格憑證。
伺服器 TLS 政策
伺服器 TLS 政策 (ServerTlsPolicy
資源) 可讓您指定伺服器端 TLS 模式,以及要套用至資料層的憑證提供者資訊。伺服器 TLS 政策支援 TLS、mTLS,以及僅在 Envoy 中支援的 Open_or_mTLS
驗證。伺服器 TLS 政策可附加至目標 HTTPS Proxy 資源或端點政策資源。
主體替代名稱
設定全球後端服務的 securitySettings
欄位時,您可以在 subjectAltNames
欄位中提供主體替代名稱清單。當用戶端與服務的其中一個後端啟動 TLS 握手時,伺服器會提供 X.509 憑證。用戶端會檢查憑證的 subjectAltName
欄位。如果欄位包含其中一個指定值,通訊就會繼續。這個機制在前文的安全命名一節中已加以說明。
授權政策
授權政策 (AuthorizationPolicy
資源) 會指定伺服器授權傳入要求或 RPC 的方式。可根據各種參數 (例如傳送要求的用戶端身分、主機、標頭和其他 HTTP 屬性) 設定,允許或拒絕傳入的要求或 RPC。授權政策可附加至目標 HTTPS Proxy 資源或端點政策資源。
限制
只有 GKE 支援 Cloud Service Mesh 服務安全性。您無法使用 Compute Engine 部署服務安全性。
無 Proxy gRPC 應用程式的限制
無 Proxy gRPC 服務的服務安全性有以下限制:
- 此版本僅適用於 Java、Python、C++ 和 Go。
後續步驟
- 如要進一步瞭解設定選項,請參閱「Cloud Service Mesh 服務安全性用途 (舊版)」。
- 如要使用 Envoy Proxy 設定服務安全性,請參閱「使用 Envoy 設定 Cloud Service Mesh 服務安全性 (舊版)」一文。
- 如要使用無 Proxy gRPC 應用程式設定服務安全性,請參閱「使用無 Proxy gRPC 應用程式設定 Cloud Service Mesh 服務安全性 (舊版)」。