建立啟用 TDE 的叢集

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 Manager username 和 password 金鑰,例如 ciphertrust-credentials。
  • TLS_SECRET_NAME:密鑰名稱,內含 CipherTrust Manager 連線的 TLS 憑證,例如 ciphertrust-tls-secret。

部署 DBCluster

  1. 建立並套用資訊清單,建立參照 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 名稱。

  2. 選用:如果您是在 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 資訊。
  • kek_version:用於包裝金鑰的 KEK 版本。
  • kek_url:KMS 中 KEK 的完整路徑。
  • kek_creation_timestamp:使用中 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 儲存空間的資料欄快取區塊,所花費的總時間。 不適用 微秒 計數器