AlloyDB Omni Kubernetes 運算子會使用 TdeConfig 自訂資源,自動執行透明資料加密 (TDE) 叢集的生命週期。這個資源會儲存 HashiCorp Vault 或 Thales CipherTrust Manager 的金鑰管理服務 (KMS) 連線詳細資料,讓運算子安全地將必要憑證注入資料庫 Pod。
事前準備
HashiCorp Vault KMS
- 設定 HashiCorp Vault 的 KV-V2 Secret 引擎,確保金鑰加密金鑰 (KEK) 路徑和 JSON Web Token (JWT) 可用。
- 確認 AlloyDB Omni 有權讀取 JSON Web Token (JWT) 檔案,也就是驗證權杖。
-
選用:如要在 OpenShift 上部署啟用 TDE 的叢集,請將
hostmount-anyuid安全性內容限制 (SCC) 授予執行資料庫叢集的DBCluster服務帳戶。oc adm policy add-scc-to-user hostmount-anyuid -z DBCLUSTER_NAME-sa -n DBCLUSTER_NAMESPACE
將 DBCLUSTER_NAME 替換為
DBCluster的名稱,並將 DBCLUSTER_NAMESPACE 替換為要建立DBCluster資源的命名空間。
Thales CipherTrust KMS
- 設定 Thales CipherTrust Manager,確保建立並匯出私密金鑰加密金鑰 (KEK)。
- 確認您擁有 CipherTrust Manager 使用者帳戶 (
username和password),且具備驗證及匯出 KEK 密鑰的權限。 -
選用:如要在 OpenShift 上部署已啟用 TDE 的叢集,請將
hostmount-anyuid安全性內容限制 (SCC) 授予執行資料庫叢集的DBCluster服務帳戶。oc adm policy add-scc-to-user hostmount-anyuid -z DBCLUSTER_NAME-sa -n DBCLUSTER_NAMESPACE
將 DBCLUSTER_NAME 替換為
DBCluster的名稱,並將 DBCLUSTER_NAMESPACE 替換為要建立DBCluster資源的命名空間。
設定 KMS 存取權
建立 Kubernetes ConfigMap 和 Secret 資源,其中包含 KEK 路徑和 KMS 驗證憑證。請務必在您打算部署 DBCluster 的相同命名空間中建立這些資源。
HashiCorp Vault KMS
建立 ConfigMap 資源,其中包含 KEK 網址和 JWT 權杖的主機路徑:
apiVersion: v1 kind: ConfigMap metadata: name: CONFIG_MAP_NAME data: kek_url: "KEK_URL" token_path: "JWT_TOKEN_PATH"
更改下列內容:
CONFIG_MAP_NAME:ConfigMap 的名稱。TdeConfig資源定義會使用kek_url和token_path中定義的值。KEK_URL:HashiCorp Vault 中 KEK 的完整網址。使用vault通訊協定將 HashiCorp Vault 指定為 KMS 提供者,例如vault://vault.default.svc:8200/v1/secret/data/alloydb_kek。JWT_TOKEN_PATH:節點上的 JWT 權杖路徑,例如/tmp/token。叢集中所有節點的 JWT 權杖存取路徑必須一致。
Thales CipherTrust KMS
建立包含 KEK 網址的 ConfigMap 資源,以及包含 Thales CipherTrust Manager 驗證憑證的 Secret 資源:
apiVersion: v1 kind: ConfigMap metadata: name: CONFIG_MAP_NAME data: kek_url: "KEK_URL" --- apiVersion: v1 kind: Secret metadata: name: CREDENTIALS_SECRET_NAME type: Opaque stringData: username: "CIPHERTRUST_USERNAME" password: "CIPHERTRUST_PASSWORD"
更改下列內容:
CONFIG_MAP_NAME:ConfigMap 的名稱。kek_url中定義的值會用於TdeConfig資源定義。KEK_URL:Thales CipherTrust Manager 中 KEK 的完整網址。使用ciphertrust做為通訊協定,將 Thales CipherTrust Manager 指定為 KMS 供應商,例如ciphertrust://ciphertrust.default.svc:443/api/v1/vault/secrets/alloydb_kek。CREDENTIALS_SECRET_NAME:儲存 CipherTrust Manager 憑證的 Kubernetes Secret 名稱,例如ciphertrust-credentials。CIPHERTRUST_USERNAME:用於向 Thales CipherTrust Manager 驗證的使用者名稱。CIPHERTRUST_PASSWORD:Thales CipherTrust Manager 使用者的密碼。
建立 TLS 密鑰
如要建立 TLS 密鑰來儲存憑證,以驗證 KMS 伺服器連線 (HashiCorp Vault 或 Thales CipherTrust Manager),請執行下列指令:
kubectl create secret tls TLS_SECRET_NAME \
--cert=CLIENT_CERT_FILE \
--key=CLIENT_KEY_FILE
kubectl patch secret TLS_SECRET_NAME \
-p '{"data":{"ca.crt":"'$(base64 -w 0 CA_CERT_FILE)'"}}' \
--type=merge
更改下列內容:
TLS_SECRET_NAME:TLS 密鑰的名稱 (例如vault-secret或ciphertrust-tls-secret)。建立TdeConfig自訂資源時,您會使用這個密鑰名稱。CLIENT_CERT_FILE:用戶端 TLS 憑證檔案的路徑 (在 Secret 中儲存為tls.crt)。CLIENT_KEY_FILE:用戶端 TLS 私密金鑰檔案的路徑 (在 Secret 中儲存為tls.key)。CA_CERT_FILE:用於驗證 KMS 伺服器憑證的憑證授權單位 (CA) 憑證檔案路徑 (在 Secret 中儲存為ca.crt)。
建立 TdeConfig 自訂資源
建立 TdeConfig 資源,定義 AlloyDB Omni 如何與外部 KMS 提供者通訊,以擷取 KEK。請務必在與 DBCluster 資源相同的命名空間中建立 TdeConfig 資源。
確認資料庫 Pod 可透過網路連線至 KMS 執行個體。
HashiCorp Vault KMS
請確認 postgres 使用者可以存取主機節點上的 JWT 權杖路徑。建立並套用 TdeConfig 資源的資訊清單:
apiVersion: alloydbomni.dbadmin.goog/v1 kind: TdeConfig metadata: name: TDE_CONFIG_NAME spec: kekUrlRef: name: CONFIG_MAP_NAME key: kek_url kmsProvider: vault: authType: "jwt" authMount: "JWT_AUTH_MOUNT_PATH" jwt: pathRef: name: "CONFIG_MAP_NAME" key: "token_path" role: "VAULT_ROLE" tls: certSecret: name: "TLS_SECRET_NAME"
更改下列內容:
TDE_CONFIG_NAME:TdeConfig資源的名稱。CONFIG_MAP_NAME:上一步建立的 ConfigMap 名稱。JWT_AUTH_MOUNT_PATH:驗證引擎在 HashiCorp Vault 內掛接的路徑,如設定所定義,例如auth/kms。- 選用:
VAULT_ROLE:在保管箱設定中定義的用戶端角色。用戶端角色會驗證 JWT,並反映角色在 HashiCorp Vault 中獲得的特定存取權和身分。 TLS_SECRET_NAME:包含 Vault 連線 TLS 憑證的 Secret 名稱,例如vault-secret。
Thales CipherTrust KMS
使用 ciphertrust 供應商,為 TdeConfig 資源建立及套用資訊清單:
apiVersion: alloydbomni.dbadmin.goog/v1 kind: TdeConfig metadata: name: TDE_CONFIG_NAME spec: kekUrlRef: name: CONFIG_MAP_NAME key: kek_url kmsProvider: ciphertrust: authType: "password" credentialsSecretRef: name: "CREDENTIALS_SECRET_NAME" tls: certSecret: name: "TLS_SECRET_NAME"
更改下列內容:
TDE_CONFIG_NAME:TdeConfig資源的名稱。CONFIG_MAP_NAME:包含kek_url的 ConfigMap 名稱。CREDENTIALS_SECRET_NAME:Kubernetes Secret 的名稱,其中包含 CipherTrust Managerusername和password金鑰,例如ciphertrust-credentials。TLS_SECRET_NAME:密鑰名稱,內含 CipherTrust Manager 連線的 TLS 憑證,例如ciphertrust-tls-secret。
部署 DBCluster
建立並套用資訊清單,建立參照
TdeConfig資源的DBCluster資源。如要進一步瞭解如何建立資料庫叢集,請參閱「建立資料庫叢集」。apiVersion: alloydbomni.dbadmin.goog/v1 kind: DBCluster metadata: name: "DBCLUSTER_NAME" spec: databaseVersion: "18.4.0" primarySpec: features: transparentDataEncryption: tdeConfigRef: name: "TDE_CONFIG_NAME" [...]將
TDE_CONFIG_NAME替換為TdeConfig資源的名稱,並將DBCLUSTER_NAME替換為要建立的DBCluster名稱。選用:如果您是在 OpenShift 環境中部署
DBCluster,則必須使用hostmount-anyuid註解為DBCluster資源加上註解。kubectl annotate dbclusters.alloydbomni.dbadmin.goog DBCLUSTER_NAME -n DBCLUSTER_NAMESPACE openshift.io/scc=anyuid將
DBCLUSTER_NAME替換為DBCluster資源的名稱,並將DBCLUSTER_NAMESPACE替換為要建立DBCluster資源的命名空間。
如要為溢出至 SSD 的資料欄快取啟用 TDE,請按照下列步驟修補 DBCluster:
kubectl patch dbcluster DBCLUSTER_NAME \
-n DBCLUSTER_NAMESPACE \
-p '{"spec":{"primarySpec":{"parameters": {"google_columnar_engine.enable_tde_for_storage_cache": "on"}}}}' \
--type=merge
TDE 指標參考資料
您可以在 AlloyDB Omni 的監控代理程式中,查看所有 TDE 指標。下表說明各項指標。
| 名稱 | 說明 | 標籤 | 單位 | 類型 |
|---|---|---|---|---|
alloydb_omni_database_tde_data_blocks_decrypted_count_total |
已解密的資料區塊數量。 | 不適用 | counter | |
alloydb_omni_database_tde_data_blocks_encrypted_count_total |
已加密的資料區塊數量。 | 不適用 | counter | |
alloydb_omni_database_tde_data_decryption_time_us_total |
解密資料區塊的總時間。 | 不適用 | 微秒 | 計數器 |
alloydb_omni_database_tde_data_encryption_time_us_total |
資料區塊加密作業的總耗時。 | 不適用 | 微秒 | 計數器 |
alloydb_omni_database_tde_enabled |
TDE 啟用狀態。 | 不適用 | 取樣 | |
alloydb_omni_database_tde_kek_info |
TDE KEK 資訊。 |
|
取樣 | |
alloydb_omni_database_tde_temp_blocks_decrypted_count_total |
已解密的暫時區塊數量。 | 不適用 | counter | |
alloydb_omni_database_tde_temp_blocks_encrypted_count_total |
已加密的暫時區塊數量。 | 不適用 | counter | |
alloydb_omni_database_tde_temp_decryption_time_us_total |
解密暫時區塊的總時間。 | 不適用 | 微秒 | 計數器 |
alloydb_omni_database_tde_temp_encryption_time_us_total |
暫時區塊加密所花費的總時間。 | 不適用 | 微秒 | 計數器 |
alloydb_omni_database_tde_wal_blocks_decrypted_count_total |
解密的 WAL 區塊數量。 | 不適用 | counter | |
alloydb_omni_database_tde_wal_blocks_encrypted_count_total |
加密的 WAL 區塊數量。 | 不適用 | 計數器 | |
alloydb_omni_database_tde_wal_decryption_time_us_total |
在 WAL 區塊解密中花費的總時間。 | 不適用 | 微秒 | counter |
alloydb_omni_database_tde_wal_encryption_time_us_total |
在 WAL 區塊加密中花費的總時間。 | 不適用 | 微秒 | counter |
tde_chill_cache_blocks_encrypted |
已加密的冷快取區塊數量。 | 不適用 | counter | |
tde_chill_cache_blocks_decrypted |
解密的冷快取區塊數量。 | 不適用 | counter | |
tde_chill_cache_blocks_total_encryption_time_us |
在冷快取區塊加密中花費的總時間。 | 不適用 | 微秒 | 計數器 |
tde_chill_cache_blocks_total_decryption_time_us |
解密冷快取區塊的總時間。 | 不適用 | 微秒 | 計數器 |
tde_ce_cache_ssd_blocks_encrypted |
溢出至 SSD 儲存空間的資料欄快取區塊數量 (已加密)。 | 不適用 | counter | |
tde_ce_cache_ssd_blocks_decrypted |
已解密的資料欄快取區塊溢出至 SSD 儲存空間的數量。 | 不適用 | counter | |
tde_ce_cache_ssd_blocks_total_encryption_time_us |
加密溢出至 SSD 儲存空間的資料欄快取區塊所花費的總時間。 | 不適用 | 微秒 | counter |
tde_ce_cache_ssd_blocks_total_decryption_time_us |
解密溢出至 SSD 儲存空間的資料欄快取區塊,所花費的總時間。 | 不適用 | 微秒 | 計數器 |