创建启用了 TDE 的集群

Select a documentation version:

AlloyDB Omni Kubernetes 操作器使用 TdeConfig 自定义资源自动执行透明数据加密 (TDE) 集群的生命周期。此资源存储密钥管理服务 (KMS) 连接详细信息,使操作器能够安全地将所需凭据注入数据库 pod。

准备工作

  • 配置 HashiCorp Vault 的 KV-V2 Secret 引擎,以确保密钥加密密钥 (KEK) 路径和 JSON Web 令牌 (JWT) 可用。
  • 确保 AlloyDB Omni 具有读取 JWT 令牌文件的权限。
  • 可选:如需在 OpenShift 上部署启用 TDE 的集群,请向运行数据库集群的 DBCluster 服务帐号授予 hostmount-anyuid 安全上下文限制 (SCC)。

    oc adm policy add-scc-to-user hostmount-anyuid -z DBCLUSTER_NAME-sa -n DBCLUSTER_NAMESPACE

    DBCLUSTER_NAME 替换为 DBCluster 的名称,并将 DBCLUSTER_NAMESPACE 替换为您要在其中创建 DBCluster 资源的命名空间。

配置 Vault 访问权限

创建一个包含 KEK 路径和身份验证凭据的 Secret 资源。

apiVersion: v1
kind: ConfigMap
metadata:
  name: CONFIG_MAP_NAME
data:
  kek_url: "KEK_URL"
  token_path: "JWT_TOKEN_PATH"

替换以下内容:

  • CONFIG_MAP_NAME:配置映射的名称。TdeConfig 资源定义中使用了 kek_urltoken_path 中定义的值。
  • KEK_URL:HashiCorp Vault 中 KEK 的完全限定网址。使用 vault 作为协议,将 HashiCorp Vault 指定为 KMS 提供方,例如 vault://vault.default.svc:8200/v1/secrets/data/alloydb_kek
  • JWT_TOKEN_PATH:节点上 JWT 令牌的路径。例如,/tmp/token。JWT 令牌访问路径在集群中的所有节点上必须保持一致。

创建 TLS Secret

如需创建 TLS Secret 以存储证书,请运行以下命令:

kubectl create secret tls VAULT_SECRET_NAME \
    --cert=vault.crt \
    --key=vault.key

kubectl patch secret VAULT_SECRET_NAME \
    -p '{"data":{"ca.crt":"'$(base64 -w 0 vault.crt)'"}}' \
    --type=merge

VAULT_SECRET_NAME 替换为 TLS Secret 的名称。创建 TdeConfig 自定义资源时,您可以使用此 Secret 名称。

创建 TdeConfig CRD

创建一个 TdeConfig 资源,用于定义 AlloyDB Omni 如何与 Vault 通信以检索 KEK。唯一受支持的身份验证类型是 jwt。请确保在与 DbCluster 资源相同的命名空间中创建 TdeConfig 资源。

确保 postgres 用户可以访问 JWT 令牌的路径,并且可以通过网络访问 Vault 实例。

如需创建 TdeConfig 资源,请按以下步骤操作:

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: "VAULT_SECRET_NAME"

替换以下内容:

  • TDE_CONFIG_NAMETdeConfig 资源的名称。
  • JWT_AUTH_MOUNT_PATH:身份验证 引擎在 HashiCorp Vault 中的装载路径,由您的配置定义。 例如,auth/kms
  • (可选)VAULT_ROLE:在您的 Vault 设置中定义的客户端角色。客户端角色会验证 JWT,并反映在 HashiCorp Vault 中授予该角色的特定 访问权限和身份。
  • VAULT_SECRET_NAME:包含 Vault 连接证书的 Secret 的名称。例如, vault-secret

部署 DBCluster

  1. 创建并应用清单,以创建引用 TdeConfig 资源的 DBCluster 资源。如需详细了解如何创建数据库集群,请参阅 创建数据库集群

    apiVersion: alloydbomni.dbadmin.goog/v1
    kind: DBCluster
    metadata:
      name: "DBCLUSTER_NAME"
    spec:
      databaseVersion: "18.1.0"
      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 资源的命名空间。

查看 TDE 指标

集群初始化后,请完成以下步骤以验证是否已启用 TDE 并查看相关的 TDE 指标。

  1. 使用 psql 或您偏好的客户端连接到数据库。如需详细了解如何连接到实例,请参阅 运行并连接到 AlloyDB Omni
  2. 运行以下命令:

    select * FROM pgsnap.g$tde_stats;
    

    如果 TDE 已成功启用,则输出会显示 TDE 指标,例如 TDE 是否已启用、KEK 网址、KEK 版本和 KEK 创建时间戳。

    下表介绍了各项指标的含义。

    名称 说明 标签 单位 类型
    alloydb_omni_database_tde_data_blocks_decrypted_count_total 解密的数据块数。 不适用 计数器
    alloydb_omni_database_tde_data_blocks_encrypted_count_total 加密的数据块数。 不适用 计数器
    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 解密的临时块数。 不适用 计数器
    alloydb_omni_database_tde_temp_blocks_encrypted_count_total 加密的临时块数。 不适用 计数器
    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 块数。 不适用 计数器
    alloydb_omni_database_tde_wal_blocks_encrypted_count_total 加密的 WAL 块数。 不适用 计数器
    alloydb_omni_database_tde_wal_decryption_time_us_total WAL 块解密所用的总时间。 不适用 微秒 计数器
    alloydb_omni_database_tde_wal_encryption_time_us_total WAL 块加密所用的总时间。 不适用 微秒 计数器