在 AlloyDB Omni RPM 上启用透明数据加密 (TDE)

1. 简介

此 Codelab 演示了如何使用 RPM 软件包在 AlloyDB Omni 上配置和启用透明数据加密 (TDE)。TDE 会对静态数据文件、预写式日志 (WAL) 和临时数据文件进行加密,从而提供数据保护,以防未经授权访问底层物理存储介质。

在此 Codelab 中,您将学习如何预配存储卷、使用 File KMS 初始化和运行已启用 TDE 的 AlloyDB Omni 集群,以及验证磁盘文件上的静态数据加密。

前提条件

  • 从 Google Cloud 控制台访问 Google Cloud 项目和 Cloud Shell。
  • 已安装并配置 Google Cloud SDK (gcloud)。如需详细了解如何安装 gcloud,请参阅 gcloud-install

学习内容

  • 如何创建具有专用数据库、备份和交换磁盘的 Compute Engine 虚拟机。
  • 如何格式化存储卷 (XFS)、配置 /etc/fstab 和准备数据路径。
  • 如何使用 File KMS 生成和管理密钥加密密钥 (KEK)。
  • 如何安装 AlloyDB Omni RPM 软件包和 PostgreSQL 客户端实用程序。
  • 如何使用 RPM 设置工具 (alloydbomni18-setup) 和 --tde-kek-url 启动已启用 TDE 的 AlloyDB Omni 集群。
  • 如何使用原始文件检查 (grep) 验证磁盘加密。

所需条件

2. 设置和要求

项目设置

创建 Google Cloud 项目

  1. 在 Google Cloud 控制台 的项目选择器页面上,选择或创建一个 Google Cloud 项目。
  2. 确保您的云项目已启用结算功能。了解如何检查项目是否已启用结算功能。

启动 Cloud Shell

虽然可以通过笔记本电脑对 Google Cloud 进行远程操作,但在此 Codelab 中,您将使用 Google Cloud Shell,这是一个在云端运行的命令行环境。

用于激活 Cloud Shell 的图标

  1. 打开 Google Cloud 控制台,然后点击右上角工具栏中的 Cloud Shell 图标。您还可以在控制台中按 G,然后按 S,或者访问 shell.cloud.google.com 来打开 Cloud Shell。
  2. 预配并连接到环境通常需要一些时间。完成后,您将看到一个终端提示符,表示可以输入内容了。

显示已连接环境的 Google Cloud Shell 终端

3. 创建 Compute Engine 虚拟机

在本部分中,您将创建一个运行 Rocky Linux 9 的 Compute Engine (GCE) 虚拟机,该虚拟机具有用于数据库数据 (/data1)、备份/可观测性 (/obs) 和交换空间的专用永久性磁盘。

  1. 为项目 ID、虚拟机名称、可用区和区域定义环境变量。
    export PROJECT="your-project-id"
    export INSTANCE_NAME="alloydb-omni-tde-vm"
    export ZONE="us-central1-c"
    export REGION="us-central1"
    
  2. 配置默认项目。
    gcloud config set project $PROJECT
    
  3. 为 SSH 流量创建网络防火墙规则。
    gcloud compute firewall-rules create allow-ssh-alloydb-omni-tde \
        --project=$PROJECT \
        --direction=INGRESS \
        --action=allow \
        --rules=tcp:22 \
        --source-ranges="0.0.0.0/0"
    
  4. 由于虚拟机是在没有公共 IP 地址的情况下创建的,因此请配置 Cloud Router 路由器和 Cloud NAT 网关,以便提供出站互联网访问权限来下载 RPM 软件包。如果您的项目区域中已存在 Cloud NAT,则可以继续。
    gcloud compute routers create alloydb-omni-tde-router \
        --project=$PROJECT \
        --network=default \
        --region=$REGION 2>/dev/null || true
    
    gcloud compute routers nats create alloydb-omni-tde-nat \
        --project=$PROJECT \
        --router=alloydb-omni-tde-router \
        --region=$REGION \
        --nat-all-subnet-ip-ranges \
        --auto-allocate-nat-external-ips 2>/dev/null || true
    
    注意:如果您的区域中已存在 Cloud NAT 网关,GCP 将返回一条消息,指明已为所有子网配置 NAT。您可以放心地忽略此错误并继续。
  5. 为数据库数据、备份和交换空间创建其他永久性磁盘。
    gcloud compute disks create $INSTANCE_NAME-data \
        --project=$PROJECT --zone=$ZONE --size=50GB --type=pd-balanced
    
    gcloud compute disks create $INSTANCE_NAME-obs \
        --project=$PROJECT --zone=$ZONE --size=50GB --type=pd-balanced
    
    gcloud compute disks create $INSTANCE_NAME-swap \
        --project=$PROJECT --zone=$ZONE --size=10GB --type=pd-balanced
    
  6. 使用所挂接的存储卷预配 Rocky Linux 9 虚拟机实例。
    gcloud compute instances create $INSTANCE_NAME \
        --project=$PROJECT \
        --zone=$ZONE \
        --machine-type=n2-highmem-16 \
        --image-family=rocky-linux-9 \
        --image-project=rocky-linux-cloud \
        --boot-disk-size=30GB \
        --boot-disk-type=pd-balanced \
        --disk=name=$INSTANCE_NAME-data,device-name=db-data,mode=rw \
        --disk=name=$INSTANCE_NAME-obs,device-name=obs,mode=rw \
        --disk=name=$INSTANCE_NAME-swap,device-name=swap,mode=rw \
        --no-address
    

4. 准备磁盘、系统调整和 File KMS 密钥

在本部分中,您将连接到虚拟机、格式化和装载永久性存储卷、配置交换、调整 SELinux,并使用 File KMS 生成 TDE 密钥加密密钥 (KEK)。

  1. 通过 Identity-Aware Proxy (IAP) 通过 SSH 连接到虚拟机。
    gcloud compute ssh $INSTANCE_NAME --zone=$ZONE --project=$PROJECT --tunnel-through-iap
    
  2. 格式化并装载数据卷 (/data1) 和可观测性/备份卷 (/obs)。
    sudo mkdir -p /data1 /obs
    
    sudo parted /dev/disk/by-id/google-db-data mklabel gpt
    sudo parted /dev/disk/by-id/google-db-data mkpart primary 0% 100%
    
    sudo parted /dev/disk/by-id/google-obs mklabel gpt
    sudo parted /dev/disk/by-id/google-obs mkpart primary 0% 100%
    
    sleep 3
    sudo mkfs.xfs -L data /dev/disk/by-id/google-db-data-part1
    sudo mkfs.xfs -L obs /dev/disk/by-id/google-obs-part1
    
    echo -e "LABEL=data\t/data1\txfs\tdefaults\t0 0" | sudo tee -a /etc/fstab
    echo -e "LABEL=obs\t/obs\txfs\tdefaults\t0 0" | sudo tee -a /etc/fstab
    
    sudo systemctl daemon-reload
    sudo mount /data1
    sudo mount /obs
    
  3. 在专用交换磁盘上创建并启用交换空间。
    SWAP_UUID=$(sudo mkswap /dev/disk/by-id/google-swap 2>/dev/null | awk '$0 ~ "UUID" {print $NF}')
    echo -e "${SWAP_UUID}\tswap\tswap\tdefaults\t0 0" | sudo tee -a /etc/fstab
    sudo swapon -a
    
  4. 为数据库目录和 File KMS 密钥文件定义环境变量。
    export PGDATA="/data1/18"
    export KMS_DIR="/data1/kms"
    export KEK_FILE="$KMS_DIR/tde_key"
    export ALLOYDB_OMNI_REPOSITORY_URL="<your-repository-url>"
    
  5. 为数据库和 File KMS 密钥存储创建存储目录。
    sudo mkdir -p $PGDATA
    sudo mkdir -p $KMS_DIR
    
  6. 使用 OpenSSL 为 File KMS 生成 32 字节的加密安全密钥加密密钥 (KEK)。
    sudo openssl rand -base64 32 | sudo tee $KEK_FILE
    sudo chmod 700 $KMS_DIR
    sudo chmod 600 $KEK_FILE
    
  7. 安装所需的 SELinux 管理实用程序。
    sudo dnf install -y policycoreutils-python-utils
    

5. 安装 AlloyDB Omni RPM 软件包

配置软件包代码库,并安装 AlloyDB Omni 数据库服务器以及标准 PostgreSQL 18 工具。

注意:填写AlloyDB Omni RPM 注册表单后,将$ALLOYDB_OMNI_REPOSITORY_URL 替换为通过电子邮件收到的代码库网址。如需了解详情,请参阅 AlloyDB Omni on Linux 概览。

  1. 为 AlloyDB Omni 创建 YUM 代码库配置文件。
    sudo tee /etc/yum.repos.d/alloydbomni.repo << EOF
    [alloydbomni]
    name=alloydbomni
    baseurl=$ALLOYDB_OMNI_REPOSITORY_URL
    enabled=1
    repo_gpgcheck=0
    gpgcheck=1
    gpgkey=https://dl.google.com/linux/linux_signing_key.pub
    EOF
    
  2. 更新 YUM 代码库缓存并安装 AlloyDB Omni 18 服务器 RPM 软件包。
    sudo yum makecache
    sudo dnf install -y alloydbomni18
    
  3. 安装官方 PostgreSQL PGDG RPM 代码库,并安装标准 PostgreSQL 18 客户端软件包 (psql)。
    sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-9-x86_64/pgdg-redhat-repo-latest.noarch.rpm
    sudo dnf install -y postgresql18
    
  4. 将 /data1 和 KMS 密钥目录的所有权分配给 postgres 用户。
    sudo chown -R postgres:postgres /data1 $KMS_DIR
    sudo chmod 755 /data1 $PGDATA
    

6. 启动已启用 TDE 的集群

配置资源配额、打开主机防火墙端口,并使用 File KMS 密钥 (POSTGRES_INITDB_ARGS="--tde-kek-url=file://$KEK_FILE") 启用透明数据加密,以初始化 AlloyDB Omni 集群。

  1. 将 SELinux 设置为宽容模式,并为 PostgreSQL 配置主机防火墙规则。
    sudo setenforce 0
    sudo firewall-cmd --add-port=5432/tcp --permanent
    sudo firewall-cmd --reload
    
  2. 配置 systemd 服务替换参数,以分配内存和 CPU 资源限制。
    sudo mkdir -p /etc/systemd/system/alloydbomni18.service.d
    sudo tee /etc/systemd/system/alloydbomni18.service.d/override.conf << EOF
    [Service]
    CPUQuota=90%
    MemoryMax=80%
    EOF
    sudo chown root:root /etc/systemd/system/alloydbomni18.service.d/override.conf
    sudo chmod 644 /etc/systemd/system/alloydbomni18.service.d/override.conf
    sudo systemctl daemon-reload
    
  3. 设置管理员环境变量,并使用 alloydbomni18-setup initdb 初始化 TDE 数据库集群。
    export PGPASSWORD="YourStrongPassword123!"
    export POSTGRES_INITDB_ARGS="--tde-kek-url=file://$KEK_FILE"
    
    sudo POSTGRES_INITDB_ARGS="$POSTGRES_INITDB_ARGS" PGPASSWORD="$PGPASSWORD" PGDATA="$PGDATA" \
        /usr/lib/postgresql/18/bin/alloydbomni18-setup initdb
    
  4. 在 postgresql.conf 中配置服务器端口 5432。
    sudo sed -i "s/^#*[[:space:]]*port[[:space:]]*=[[:space:]]*[0-9]*/port = 5432/" $PGDATA/postgresql.conf
    
  5. 使用 alloydbomni18-setup preparedb 准备系统目录和扩展程序。
    sudo PGPORT=5432 PGPASSWORD="$PGPASSWORD" PGDATA="$PGDATA" \
        /usr/lib/postgresql/18/bin/alloydbomni18-setup preparedb
    
  6. 启用并启动 alloydbomni18 systemd 服务。
    sudo systemctl enable alloydbomni18
    sudo systemctl start alloydbomni18
    sudo systemctl status alloydbomni18
    
    验证输出是否显示 Active: active (running)。

7. 数据库操作和 TDE 磁盘加密验证

连接到 TDE 数据库,插入示例记录,执行 CHECKPOINT 以强制将数据写入磁盘,并运行直接磁盘扫描 (grep) 以证明静态数据加密。

  1. 使用 psql 连接到 alloydbadmin 数据库。
    PGPASSWORD="YourStrongPassword123!" /usr/lib/postgresql/18/bin/psql -h localhost -p 5432 -U postgres -d alloydbadmin
    
  2. 创建测试表,插入机密字符串,并触发检查点以将脏缓冲区写入存储空间。
    CREATE TABLE customer_credentials (
        id SERIAL PRIMARY KEY,
        username TEXT,
        secret_passcode TEXT
    );
    
    INSERT INTO customer_credentials (username, secret_passcode)
    VALUES ('alice_user', 'UNENCRYPTED_DEMO_SECRET_98765');
    
    CHECKPOINT;
    
  3. 查询内部 AlloyDB TDE 统计信息视图 pgsnap.g$tde_stats,以验证活跃加密状态、KEK 位置和块指标。
    SELECT is_tde_enabled, tde_kek_url, tde_data_blocks_encrypted, tde_wal_blocks_encrypted
    FROM pgsnap.g$tde_stats;
    
    确认活跃 TDE (is_tde_enabled = t)、KEK 文件路径和加密块计数器的示例输出:
     is_tde_enabled |        tde_kek_url        | tde_data_blocks_encrypted | tde_wal_blocks_encrypted 
    ----------------+---------------------------+---------------------------+--------------------------
     t              | file:///data1/kms/tde_key |                      2023 |                     2717
    (1 row)
    
  4. 退出 psql。
    \q
    
  5. 在 /data1/18/base/ 下搜索原始数据库存储文件中的密码字符串,以验证 TDE 磁盘保护。
    sudo grep -a -rn "UNENCRYPTED_DEMO_SECRET_98765" /data1/18/base/
    

密钥验证要点 :

  • 在 非 TDE 数据库实例上,针对表关系文件运行 grep 会在磁盘上显示纯文本字符串。
  • 在已启用 TDE 的数据库实例上,grep 会返回零个匹配项 ,因为所有数据文件、索引、预写式日志 (WAL) 和临时数据在静态时都使用 AES 块密码完全加密。

8. 清理

完成练习后,请清理资源,以防止产生不必要的计算费用。

  1. 断开与虚拟机 SSH 会话的连接。
    exit
    
  2. 移除 GCE 虚拟机和所挂接的永久性磁盘。
    gcloud compute instances delete $INSTANCE_NAME --zone=$ZONE --project=$PROJECT --quiet
    gcloud compute disks delete $INSTANCE_NAME-data $INSTANCE_NAME-obs $INSTANCE_NAME-swap --zone=$ZONE --project=$PROJECT --quiet
    
  3. 删除防火墙规则和 Cloud NAT 网关资源。
    gcloud compute firewall-rules delete allow-ssh-alloydb-omni-tde --project=$PROJECT --quiet
    gcloud compute routers nats delete alloydb-omni-tde-nat --router=alloydb-omni-tde-router --region=$REGION --project=$PROJECT --quiet
    gcloud compute routers delete alloydb-omni-tde-router --region=$REGION --project=$PROJECT --quiet
    

9. 恭喜

恭喜!您已成功完成 AlloyDB Omni RPM 上的 TDE Codelab。

所学内容

  • 如何预配存储磁盘 (/data1、/obs)、设置交换空间和格式化 XFS 文件系统。
  • 如何使用 File KMS 生成和管理密钥加密密钥。
  • 如何使用 RPM 工具初始化和启动已启用 TDE 的 AlloyDB Omni 集群。
  • 如何使用直接原始磁盘检查 (grep) 验证静态加密。

如需了解详情,请参阅AlloyDB Omni 文档。

10. 调查问卷

您打算如何使用本教程?

仅通读 阅读并完成练习