客戶提供的加密金鑰 (CSEK) 是 Google Cloud Storage 和 Google Compute Engine 的功能。如果您提供自己的加密金鑰,Google 會使用您的金鑰來保護 Google 所產生用於加密和解密資料的金鑰。
本主題中使用的詞彙:
資料加密金鑰 (DEK):用來加密資料的金鑰。
金鑰加密金鑰 (KEK):用來加密或「包裝」資料加密金鑰的金鑰。
叢集管理員:在 Google 的實際工作環境基礎架構中,以叢集管理員身分執行的一組程序,負責實作用於管理磁碟和 VM 執行個體等 Compute Engine 資源的邏輯,並會儲存與這些資源相關的中繼資料。
執行個體管理員:在 Google 的實際工作環境基礎架構中,以執行個體管理員身分執行的一組程序,負責對一組 VM 執行個體 (程序) 執行啟動/停止 VM 或連接/卸除磁碟等修改作業。叢集管理員會指定 VM 在任何時間點應處於什麼狀態,而執行個體管理員會據此執行相關作業。
客戶提供的加密金鑰運作方式
以下說明客戶提供的加密金鑰如何與 Google Cloud Storage 和 Google Compute Engine 搭配運作。
Cloud Storage
在 Cloud Storage 中使用客戶提供的加密金鑰時:
您必須在 API 呼叫中提供原始 CSEK。這組金鑰會從 Google 的前端傳輸到儲存系統的記憶體,並在 Google Cloud Storage 中做為資料的金鑰加密金鑰使用。
原始 CSEK 是用來將已包裝的區塊金鑰解除包裝,以在記憶體中建立原始區塊金鑰。原始區塊金鑰是用來解密儲存在儲存系統中的資料區塊,並在 Google Cloud Storage 中做為資料的資料加密金鑰 (DEK) 使用。
金鑰 | 儲存位置 | 用途 | 可存取的期限 |
---|---|---|---|
原始 CSEK | 儲存系統記憶體 | 由客戶提供。 區塊金鑰的金鑰加密金鑰 (KEK)。 包裝區塊金鑰。 |
到客戶要求的作業 (例如insertObject 或 getObject ) 完成為止 |
已包裝的區塊金鑰 | 儲存裝置 | 保護靜態儲存的區塊金鑰 | 到 Storage 物件遭刪除為止 |
原始區塊金鑰 | 儲存裝置的記憶體 | 資料的資料加密金鑰 (DEK)。 在磁碟中讀取/寫入資料。 |
到客戶要求的作業完成為止 |
Compute Engine
在 Compute Engine 中使用客戶提供的加密金鑰時:
您必須在 API 呼叫中提供原始 CSEK。
- 您也可以視需要提供以公開金鑰包裝的 CSEK。
這組金鑰會從 Google 的前端傳輸到叢集管理員的前端:
- 如果提供了已包裝的 CSEK,系統會使用 Google 擁有的非對稱包裝金鑰將其解除包裝。
- 原始 CSEK 會與永久磁碟的密碼編譯 Nonce 結合,產生 CSEK 衍生金鑰。這組金鑰會在 Google Compute Engine 中做為資料的金鑰加密金鑰使用。
在叢集管理員的前端中,CSEK 和 CSEK 衍生金鑰都只會保存在叢集管理員記憶體裡。CSEK 衍生金鑰是用來在叢集管理員記憶體中,將儲存在叢集管理員執行個體中繼資料和執行個體管理員中繼資料中的已包裝磁碟金鑰解除包裝;這些中繼資料已啟用自動重新啟動功能,而且和執行個體中繼資料並不相同。
- CSEK 衍生金鑰是用來在建立磁碟時包裝原始磁碟金鑰,以及在存取磁碟時將原始磁碟金鑰解除包裝。
- 如果已啟用自動重新啟動功能,叢集管理員會在 VM 的效期內保留已包裝的磁碟金鑰,以便在當機時重新啟動 VM。已包裝的磁碟金鑰是以 Google 擁有的對稱包裝金鑰包裝,而且具備特殊權限,只有 Google Compute Engine 能夠使用。
- 如果已啟用即時遷移功能,原始磁碟金鑰可直接從舊的 VM 執行個體記憶體傳送到新的 VM 執行個體記憶體,而不必由執行個體管理員或叢集管理員處理金鑰複本。
原始磁碟金鑰會傳送至叢集管理員、執行個體管理員和虛擬機器的記憶體。這類金鑰會在 Google Compute Engine 中做為資料的資料加密金鑰使用。
金鑰 | 保管位置 | 用途 | 可存取的期限 |
---|---|---|---|
原始 CSEK | 叢集管理員前端 | 由客戶提供。 用於加入密碼編譯 Nonce 來產生 CSEK 衍生金鑰。 |
到客戶要求的作業 (例如instances.insert 、instances.attachDisk ) 完成為止 |
以公開金鑰包裝的 CSEK (選用:如果使用了 RSA 金鑰包裝) |
叢集管理員前端 | 視需要由客戶提供。 用於產生 CSEK 衍生金鑰 (會先以 Google 擁有的非對稱金鑰解除包裝)。 |
到客戶要求的作業完成為止 |
非對稱包裝金鑰 (如果使用了 RSA 金鑰包裝) |
Google 的內部金鑰管理服務 | 用於將客戶提供的 RSA 包裝金鑰解除包裝。 | 無限期 |
CSEK 衍生金鑰 | 叢集管理員前端 | 磁碟金鑰的金鑰加密金鑰 (KEK)。 包裝磁碟金鑰。 |
到金鑰包裝或解除包裝作業完成為止 |
Google 包裝的磁碟金鑰 (選用:如果使用了自動重新啟動功能) |
叢集管理員前端 | 為連接至運作中執行個體的磁碟保護靜態儲存的磁碟金鑰。 在 VM 記憶體遺失時 (例如主機當機) 重新啟動執行個體。 |
到 VM 停止或遭刪除為止 |
原始磁碟金鑰 | 虛擬機器監視器 (VMM) 記憶體、 叢集管理員 (CM) 記憶體 |
資料的資料加密金鑰 (DEK)。 在磁碟中讀取/寫入資料、即時遷移 VM,以及執行直接升級 |
到 VM 停止或遭刪除為止 |
Google 包裝的 CSEK 衍生金鑰 | 叢集管理員資料庫 | 作業失敗時重新啟動作業。 | 到客戶要求的作業完成為止 |
。
客戶提供的加密金鑰如何受到保護
以下說明客戶提供的加密金鑰在磁碟中、在 Google Cloud Platform 基礎架構中移動時,以及在記憶體中的保護方式。
在磁碟中
原始 CSEK、CSEK 衍生金鑰和原始區塊/磁碟金鑰一律不會在未加密的情況下儲存在磁碟中。原始區塊/磁碟金鑰在儲存前會先以 CSEK 衍生金鑰包裝,如果使用了自動重新啟動功能則會先以 Google 金鑰包裝。Google 不會將您的金鑰永久儲存在自家伺服器中。
在基礎架構中移動時
每項服務都會使用基礎架構提供的存取權管理功能,明確指定要允許哪些服務和自己進行通訊。該服務可以設定許可清單,在當中加入允許的服務帳戶身分,這樣基礎架構就會自動強制執行這項存取限制條件。進一步瞭解服務身分、完整性和隔離功能。
除了在前幾節提過的遠端程序呼叫 (RPC) 驗證和授權功能外,這套基礎架構也為網路上的遠端程序呼叫 (RPC) 資料提供密碼編譯隱私權及完整性。服務可以為每個基礎架構 RPC 分別設定所需的密碼編譯保護等級,且客戶提供的加密金鑰也會啟用這些設定。進一步瞭解跨服務通訊的加密方式。
在記憶體中
如上所述,金鑰內容存放在各種系統的記憶體中,包括叢集管理員記憶體和虛擬機器監視器記憶體。這些系統記憶體只有在例外情況下 (例如發生事件) 才可存取,並且是由存取控制清單 (ACL) 管理。這些系統已停用記憶體傾印,或是會在記憶體傾印中自動掃描金鑰內容。只有少數網站穩定性工程師可因維護服務的職責所需存取工作,也只有少數為這些功能偵錯的軟體工程師可存取記錄。