本頁說明如何在 Cloud SQL 上實作用戶端加密。
總覽
用戶端加密是指在將資料寫入 Cloud SQL 之前加密資料。您可以加密 Cloud SQL 資料,只有應用程式才能解密。
如要啟用用戶端加密,請選擇下列其中一種做法:
- 使用儲存在 Cloud Key Management Service (Cloud KMS) 中的加密金鑰。
- 使用儲存在應用程式本機的加密金鑰。
本主題將說明如何使用第一個選項,這是最順暢的金鑰管理方式。我們會在 Cloud KMS 中建立加密金鑰,並使用 Google 的開放原始碼加密程式庫 Tink 實作信封加密。
為何需要用戶端加密?
如要在資料欄層級保護 Cloud SQL 資料,您需要用戶端加密機制 1。假設您有一個名稱和信用卡號碼的資料表。您想授予使用者存取這個表格的權限,但不希望他們查看信用卡號碼。您可以使用用戶端加密功能加密號碼。只要使用者未獲授權存取 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:service-account-name@example.domain.com \ --role=roles/cloudkms.cryptoKeyEncrypterDecrypter
雖然您可以使用 KMS 金鑰直接加密資料,但我們在此使用更彈性的解決方案,也就是信封式加密。這樣一來,我們就能加密超過 64 KB 的郵件,這是 Cloud Key Management Service API 支援的最大郵件大小。
Cloud KMS 包絡加密
在信封式加密中,KMS 金鑰會做為金鑰加密金鑰 (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 支援 C++、Java、Go 和 Python 中的信封加密,方法是使用 AEAD API:
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」權限。