本頁面說明一種方法,可使用 Cloud Key Management Service 直接在用戶端上加密應用程式資料,然後透過網路傳輸。
在這個範例中,加密資料會傳送至 Google Cloud ,並儲存在 Cloud Storage 值區中。Cloud Storage 也支援使用客戶管理的加密金鑰自動執行伺服器端加密,可自動執行整個程序。如要保護應用程式資料,在傳送至Google Cloud之前,建議您使用 Tink 程式庫。
Tink 程式庫是跨平台的多語言程式庫,可為常見的密碼編譯工作提供 API。這項服務可用於在資料進入 Google Cloud 資料儲存空間前加密資料,並支援 Java、Python、C++、Go、Objective-C 和其他語言,以及物件儲存空間和關聯式資料庫服務。
在本逐步操作說明中,您將使用 Cloud KMS 加密檔案,然後再上傳至值區。接下來,您可以下載並解密相同資料,以便在用戶端上讀取。
按照這些操作說明操作時,您的金鑰和所有加密編譯作業都會保留在 Google Cloud 中,您必須使用 Cloud KMS 進行解密。 原始對稱加密可讓您在內部部署環境中加密或解密資料,或是在不同程式庫和服務供應商之間移動已加密的資料,而無須先解密資料。
事前準備
您必須擁有 Google Cloud 機構組織的權限,才能建立新專案,並在這些專案中啟用帳單、建立使用者,以及管理權限。roles/resourcemanager.organizationAdmin
角色會授予這項權限。
設定
我們建議您使用兩個專案與兩位使用者,以確保授權區隔。如果您按照本指南中的步驟操作,管理加密金鑰的使用者和服務,與使用加密金鑰的使用者和服務不同。一個專案包含及管理金鑰,另一個專案則將加密資料儲存在 Cloud Storage 值區中,並視需要解密。
建立專案
您可以在 Google Cloud 控制台中建立專案。如需逐步操作說明,請參閱身分與存取權管理快速入門。
在貴機構中建立下列專案:
建立 Google Cloud 專案,以包含用來儲存密鑰的 Cloud Storage 值區。密鑰將做為物件儲存在值區中。這個專案稱為 STORAGE_PROJECT_ID。
建立第二個 Google Cloud 專案,用於管理用於加密及解密密鑰的 Cloud KMS 金鑰。這個專案稱為 KEY_PROJECT_ID。
針對每個專案,請按照 Cloud KMS 快速入門導覽課程「開始前」一節中的步驟,啟用 Cloud KMS API 並啟用帳單功能。
建立使用者
您可以在 Google Cloud 控制台中建立使用者並授予角色。如需逐步操作說明,請參閱身分與存取權管理快速入門。
這個程序會建立兩個使用者。金鑰管理員負責管理加密金鑰,而金鑰使用者則可使用金鑰加密及解密資料。
在 KEY_PROJECT_ID 專案中執行這項程序。
建立主要管理員帳戶。
將
roles/cloudkms.admin
Identity and Access Management 角色授予主要管理員。這個角色可讓金鑰管理員建立及管理金鑰。建立主要使用者帳戶。
將
roles/cloudkms.cryptoKeyEncrypterDecrypter
IAM 角色授予主要使用者。這個角色可讓金鑰使用者加密及解密資料。
建立儲存空間值區
在 STORAGE_PROJECT_ID
專案中執行這項程序。
- 建立名為
STORAGE_BUCKET
的儲存空間值區。 - 將 STORAGE_BUCKET 儲存體值區的
roles/storage.objectAdmin
角色授予金鑰使用者帳戶。
建立加密金鑰
請以 KEY_PROJECT_ID 專案中的關鍵管理員身分執行這個程序。
建立金鑰環。金鑰環的名稱在專案中不得重複。您無法重新命名或刪除金鑰環。使用 Google Cloud CLI 建立金鑰環。
gcloud kms keyrings create KEY_RING \ --location LOCATION
更改下列內容:
KEY_RING
:儲存空間鑰匙圈的名稱,例如storage
。LOCATION
:您要在其中建立金鑰環的位置。此位置應位於您要建立 Cloud Storage 值區的地理位置附近。
在金鑰環中建立加密金鑰。金鑰的名稱在金鑰環中必須是唯一的。金鑰無法重新命名或刪除,但其金鑰版本可以刪除。使用 Google Cloud CLI 建立金鑰。系統會自動建立初始金鑰版本,並將其設為主要版本。
gcloud kms keys create KEY_NAME \ --location LOCATION \ --keyring KEY_RING \ --purpose encryption
更改下列內容:
LOCATION
:建立金鑰環的位置。KEY_NAME
:儲存空間鍵的名稱,例如storage
。KEY_RING
:您用於儲存金鑰圈的名稱,例如storage
。
注意:如要使用原始對稱式加密金鑰,請將用途欄位設為
raw-encryption
。
如要進一步瞭解如何建立金鑰環和金鑰,請參閱這篇文章。
加密包含密鑰的檔案
以主要使用者帳戶身分執行這個程序,在兩個專案中執行。
在本機電腦上儲存密鑰。
echo "SECRET_TEXT" > PATH_TO_SECRET
更改下列內容:
SECRET_TEXT
:您要保護的祕密,以純文字格式表示,例如this is a secret
。PATH_TO_SECRET
:您要建立機密金鑰的路徑,例如secret.txt
。
使用 Cloud KMS 和加密金鑰加密密鑰。
gcloud kms encrypt \ --location LOCATION \ --keyring KEY_RING \ --key KEY_NAME \ --plaintext-file PATH_TO_SECRET \ --ciphertext-file PATH_TO_ENCRYPTED_SECRET
更改下列內容:
LOCATION
:建立金鑰環的位置。KEY_RING
:金鑰環的名稱。KEY_NAME
:加密金鑰的名稱。PATH_TO_SECRET
:建立機密金鑰的路徑。PATH_TO_ENCRYPTED_SECRET
:要儲存加密密鑰的路徑,例如secret.txt.encrypted
。
如要進一步瞭解如何加密資料,請參閱資料加密快速入門。
如要進行原始對稱加密,請改用
raw-encrypt
。將已加密的密鑰檔案上傳至儲存值區。您可以使用下列 gcloud CLI 指令:
gcloud storage cp PATH_TO_ENCRYPTED_SECRET gs://STORAGE_BUCKET
如要進一步瞭解如何將物件上傳至儲存體值區,請參閱相關文章。
選用步驟:從本機電腦刪除明文密鑰檔案 (
PATH_TO_SECRET
)。對於含有未加密機密資料的檔案,這是最佳做法。
STORAGE_BUCKET
儲存空間值區現在包含已加密的密鑰檔案,該檔案是使用 KEY_NAME
加密金鑰加密的。
解密包含密鑰的檔案
以主要使用者帳戶身分執行這些步驟,並在兩個專案中執行。
從儲存值區下載已加密的密鑰檔案。您可以使用下列 gcloud CLI 指令:
gcloud storage cp gs://STORAGE_BUCKET/PATH_TO_ENCRYPTED_SECRET .
如要進一步瞭解如何從儲存體值區下載物件,請參閱相關文章。
使用用於加密檔案的相同金鑰解密檔案。
gcloud kms decrypt --location LOCATION \ --keyring KEY_RING \ --key KEY_NAME \ --ciphertext-file PATH_TO_ENCRYPTED_SECRET \ --plaintext-file PATH_TO_DECRYPTED_SECRET
更改下列內容:
LOCATION
:建立金鑰環的位置。KEY_RING
:金鑰環的名稱。KEY_NAME
:加密金鑰的名稱。PATH_TO_ENCRYPTED_SECRET
:已下載的加密秘密的路徑,例如secret.txt.encrypted
。PATH_TO_DECRYPTED_SECRET
:您要儲存已解密機密金鑰的路徑,例如secret_decrypted.txt
。
如要進一步瞭解如何解密資料,請參閱資料加密快速入門。
如要進行原始對稱加密,請改用
raw-decrypt
。您現在可以使用
cat
或文字編輯器,讀取已解密的祕密純文。內容與PATH_TO_SECRET
的原始內容相同。選用:從本機電腦刪除
PATH_TO_ENCRYPTED_SECRET
和PATH_TO_DECRYPTED_SECRET
檔案。
正在清除所用資源
如要清理,請刪除您在本機電腦上建立的所有檔案,然後刪除 KEY_PROJECT_ID
和 STORAGE_PROJECT_ID
專案。
後續步驟
- 進一步瞭解密鑰管理。
- 瞭解授權區隔。
- 瞭解如何授予、變更及撤銷資源存取權。
- 瞭解如何建立服務帳戶。