本頁說明如何在 Cloud SQL 上實作用戶端加密功能。
總覽
用戶端加密是指在將資料寫入 Cloud SQL 之前先加密資料的動作。您可以以只有應用程式可解密的方式加密 Cloud SQL 資料。
如要啟用用戶端加密,您可以使用下列選項:
- 使用儲存在 Cloud Key Management Service (Cloud KMS) 中的加密金鑰。
- 使用應用程式本機儲存的加密金鑰。
在本主題中,我們將說明如何使用第一個選項,這是最無縫的金鑰管理選項。我們會在 Cloud KMS 中建立加密金鑰,並使用 Google 的開放原始碼密碼編譯程式庫 Tink 實作封套加密。
為何需要用戶端加密?
如要以資料欄層級保護 Cloud SQL 資料,您需要使用用戶端加密機制 1。假設您有一個包含姓名和信用卡號碼的資料表。您想授予使用者這個資料表的存取權,但不希望他們查看信用卡號碼。您可以使用用戶端加密功能對這些號碼進行加密。只要使用者未獲准存取 Cloud KMS 中的加密金鑰,就無法讀取信用卡資訊。
使用 Cloud KMS 建立金鑰
Cloud KMS 可讓您在 Google Cloud Platform 上建立及管理金鑰。
Cloud KMS 支援多種不同的金鑰類型。如要使用用戶端加密功能,您必須建立對稱式金鑰。
如要讓應用程式存取 Cloud KMS 中的金鑰,您必須為應用程式使用的服務帳戶授予 cloudkms.cryptoKeyEncrypterDecrypter
角色。在 gcloud 中,您可以使用下列指令執行此操作:
gcloud kms keys add-iam-policy-binding key \ --keyring=key-ring \ --location=location \ --member=serviceAccount:[email protected] \ --role=roles/cloudkms.cryptoKeyEncrypterDecrypter
雖然您可以使用 KMS 金鑰直接加密資料,但我們在此使用名為信封式加密的更靈活解決方案。這可讓我們加密超過 64 KB 的訊息,這是 Cloud Key Management Service API 可支援的最大訊息大小。
Cloud KMS 信封加密
在信封式加密中,KMS 金鑰會做為金鑰加密金鑰 (KEK) 使用。也就是說,KEK 用於加密資料加密金鑰 (DEK),而 DEK 則用於加密實際資料。
在 Cloud KMS 中建立 KEK 後,如要加密每則訊息,您必須:
- 在本機產生資料加密金鑰 (DEK)。
- 在本機使用這個 DEK 加密訊息。
- 呼叫 Cloud KMS,使用 KEK 加密 (包裝) DEK。
- 儲存加密的資料與經過包裝的 DEK。
在本主題中,我們不會從頭實作信封式加密,而是使用 Tink。
Tink
Tink 是一套多語言跨平台程式庫,提供高階加密 API。如要使用 Tink 的信封式加密功能加密資料,您必須向 Tink 提供指向 Cloud KMS 中 KEK 的金鑰 URI,以及可讓 Tink 使用 KEK 的憑證。Tink 會產生 DEK、加密資料、包裝 DEK,並傳回包含加密資料和經過包裝的 DEK 的單一密文。
Tink 使用 AEAD API 支援 C++、Java、Go 和 Python 中的信封加密:
public interface Aead{
byte[] encrypt(final byte[] plaintext, final byte[] associatedData)
throws…
byte[] decrypt(final byte[] ciphertext, final byte[] associatedData)
throws…
}
除了一般訊息/密文引數之外,加密和解密方法也支援選用的關聯資料。這個引數可用來將密文繫結至一段資料。舉例來說,假設您的資料庫有欄位 user-id
和欄位 encrypted-medical-history
。在這種情況下,您應該在加密病歷時,將欄位 user-id
用做相關資料。這樣一來,攻擊者就無法將醫療記錄從一位使用者轉移至另一位使用者。這項資訊也用於驗證您執行查詢時是否有正確的資料列。
範例
在本節中,我們將逐步說明使用者端加密的選民資訊資料庫範例程式碼。程式碼範例說明如何:
- 建立資料庫資料表和連線集區
- 設定 Tink 信封式加密功能
- 使用 Tink 的信封式加密功能,搭配 Cloud KMS 中的 KEK 加密及解密資料
事前準備
請按照這些操作說明建立 Cloud SQL 執行個體。請記下您建立的連線字串、資料庫使用者和資料庫密碼。
請按照這些操作說明為應用程式建立資料庫。記下資料庫名稱。
請按照這些操作說明為應用程式建立 KMS 金鑰。複製已建立金鑰的資源名稱。
按照這些操作說明建立具備「Cloud SQL 用戶端」權限的服務帳戶。
請按照這些操作說明,為金鑰新增「Cloud KMS CryptoKey Encrypter/Decrypter」權限。