GSP920

概览
借助客户管理的加密密钥 (CMEK),您可以用自己的加密密钥保护存储在 Cloud SQL 中的静态数据。添加 CMEK 后,无论何时进行 API 调用,Cloud SQL 都可以使用您的密钥来访问数据。
本实验将为您提供有关如何保护 Cloud SQL for PostgreSQL 实例的分步指南。首先,您需要使用 CMEK 部署新的 Cloud SQL 实例。创建 Cloud SQL for PostgreSQL 实例后,您需要配置 pgAudit,以便选择性地记录和跟踪针对该实例执行的 SQL 操作。最后,您将配置并测试 Cloud SQL IAM 数据库身份验证。
您将执行的操作
- 为 Cloud SQL for PostgreSQL 设置 CMEK。
- 在 Cloud SQL for PostgreSQL 实例上启用并配置 pgAudit。
- 配置 Cloud SQL for PostgreSQL IAM 数据库身份验证。
目标受众群体
本实操实验的内容最适合 PostgreSQL 数据库管理员。本实验旨在让专业人士获得设置和配置 Google Cloud 资源以支持 PostgreSQL 的实践经验。
设置和要求
点击“开始实验”按钮前的注意事项
请阅读以下说明。实验是计时的,并且您无法暂停实验。计时器在您点击开始实验后即开始计时,显示 Google Cloud 资源可供您使用多长时间。
此实操实验可让您在真实的云环境中开展实验活动,免受模拟或演示环境的局限。为此,我们会向您提供新的临时凭据,您可以在该实验的规定时间内通过此凭据登录和访问 Google Cloud。
为完成此实验,您需要:
- 能够使用标准的互联网浏览器(建议使用 Chrome 浏览器)。
注意:请使用无痕模式(推荐)或无痕浏览器窗口运行此实验。这可以避免您的个人账号与学生账号之间发生冲突,这种冲突可能导致您的个人账号产生额外费用。
注意:请仅使用学生账号完成本实验。如果您使用其他 Google Cloud 账号,则可能会向该账号收取费用。
如何开始实验并登录 Google Cloud 控制台
-
点击开始实验按钮。如果该实验需要付费,系统会打开一个对话框供您选择支付方式。左侧是“实验详细信息”窗格,其中包含以下各项:
- “打开 Google Cloud 控制台”按钮
- 剩余时间
- 进行该实验时必须使用的临时凭据
- 帮助您逐步完成本实验所需的其他信息(如果需要)
-
点击打开 Google Cloud 控制台(如果您使用的是 Chrome 浏览器,请右键点击并选择在无痕式窗口中打开链接)。
该实验会启动资源并打开另一个标签页,显示“登录”页面。
提示:将这些标签页安排在不同的窗口中,并排显示。
注意:如果您看见选择账号对话框,请点击使用其他账号。
-
如有必要,请复制下方的用户名,然后将其粘贴到登录对话框中。
{{{user_0.username | "<用户名>"}}}
您也可以在“实验详细信息”窗格中找到“用户名”。
-
点击下一步。
-
复制下面的密码,然后将其粘贴到欢迎对话框中。
{{{user_0.password | "<密码>"}}}
您也可以在“实验详细信息”窗格中找到“密码”。
-
点击下一步。
重要提示:您必须使用实验提供的凭据。请勿使用您的 Google Cloud 账号凭据。
注意:在本实验中使用您自己的 Google Cloud 账号可能会产生额外费用。
-
继续在后续页面中点击以完成相应操作:
- 接受条款及条件。
- 由于这是临时账号,请勿添加账号恢复选项或双重验证。
- 请勿注册免费试用。
片刻之后,系统会在此标签页中打开 Google Cloud 控制台。
注意:如需访问 Google Cloud 产品和服务,请点击导航菜单,或在搜索字段中输入服务或产品的名称。
任务 1. 创建启用了 CMEK 的 Cloud SQL for PostgreSQL 实例
在此任务中,您将创建一个启用了 CMEK 的 Cloud SQL for PostgreSQL 实例。请务必确保密钥的安全,因为没有密钥,您就无法管理数据库。
为 Cloud SQL 创建产品和项目专属服务账号
您可以使用 gcloud beta services identity create 命令创建使用 Cloud SQL CMEK 所需的服务账号。
- 在 Cloud Shell 中运行以下命令,创建服务账号:
export PROJECT_ID=$(gcloud config list --format 'value(core.project)')
gcloud beta services identity create \
--service=sqladmin.googleapis.com \
--project=$PROJECT_ID
- 在系统提示时点击授权按钮。
这会创建服务账号,您需要在后续步骤中将其与 CMEK 绑定。
创建 Cloud Key Management Service 密钥环和密钥
在本部分中,您将创建用于 CMEK 的 Cloud KMS 密钥环和密钥。
- 在 Cloud Shell 中运行以下命令,创建 Cloud KMS 密钥环:
export KMS_KEYRING_ID=cloud-sql-keyring
export ZONE=$(gcloud compute instances list --filter="NAME=bastion-vm" --format=json | jq -r .[].zone | awk -F "/zones/" '{print $NF}')
export REGION=${ZONE::-2}
gcloud kms keyrings create $KMS_KEYRING_ID \
--location=$REGION
- 在 Cloud Shell 中运行以下命令,创建 Cloud KMS 密钥:
export KMS_KEY_ID=cloud-sql-key
gcloud kms keys create $KMS_KEY_ID \
--location=$REGION \
--keyring=$KMS_KEYRING_ID \
--purpose=encryption
- 在 Cloud Shell 中运行以下命令,将密钥与服务账号绑定:
export PROJECT_NUMBER=$(gcloud projects describe ${PROJECT_ID} \
--format 'value(projectNumber)')
gcloud kms keys add-iam-policy-binding $KMS_KEY_ID \
--location=$REGION \
--keyring=$KMS_KEYRING_ID \
--member=serviceAccount:service-${PROJECT_NUMBER}@gcp-sa-cloud-sql.iam.gserviceaccount.com \
--role=roles/cloudkms.cryptoKeyEncrypterDecrypter
这里的服务账号名称,就是上一个子任务中 gcloud beta services identity create 命令所返回的名称。
创建启用了 CMEK 的 Cloud SQL 实例
在本部分中,您将创建一个启用了 CMEK 的 Cloud SQL for PostgreSQL 实例。如果您计划使用 CMEK 对数据加密,请注意,无法通过修补现有实例来启用 CMEK。
为了能从外部开发或应用环境访问 Cloud SQL 实例,您可以为 Cloud SQL 实例配置公共 IP 地址,并通过将这些环境的 IP 地址列入许可清单来控制访问权限。这样可将对公共接口的访问权限限制在您指定的地址范围内。
您将本实验中的 Compute Engine 虚拟机实例用作开发环境,因此需要将该实例的外部 IP 地址添加到许可清单中。您还需要将 Cloud Shell 的外部 IP 地址添加到许可清单中,以便更轻松地完成本实验的后续任务。
- 在 Cloud Shell 中运行以下命令,查找
bastion-vm 虚拟机实例的外部 IP 地址:
export AUTHORIZED_IP=$(gcloud compute instances describe bastion-vm \
--zone=$ZONE \
--format 'value(networkInterfaces[0].accessConfigs.natIP)')
echo Authorized IP: $AUTHORIZED_IP
- 在 Cloud Shell 中运行以下命令,查找 Cloud Shell 的外部 IP 地址:
export CLOUD_SHELL_IP=$(curl ifconfig.me)
echo Cloud Shell IP: $CLOUD_SHELL_IP
- 在 Cloud Shell 中运行以下命令,创建 Cloud SQL for PostgreSQL 实例:
export KEY_NAME=$(gcloud kms keys describe $KMS_KEY_ID \
--keyring=$KMS_KEYRING_ID --location=$REGION \
--format 'value(name)')
export CLOUDSQL_INSTANCE=postgres-orders
gcloud sql instances create $CLOUDSQL_INSTANCE \
--project=$PROJECT_ID \
--authorized-networks=${AUTHORIZED_IP}/32,$CLOUD_SHELL_IP/32 \
--disk-encryption-key=$KEY_NAME \
--database-version=POSTGRES_13 \
--cpu=1 \
--memory=3840MB \
--region=$REGION \
--root-password=supersecret!
- 输入命令后,如果出现提示,请输入“y”。
创建启用了 CMEK 的 Cloud SQL 实例
任务 2. 在 Cloud SQL for PostgreSQL 数据库上启用并配置 pgAudit
在此任务中,您将启用并配置 pgAudit 数据库扩展程序,以便对所有类型的数据库活动进行精细的日志记录控制。
- 在 Cloud Shell 中运行以下命令,将 pgAudit 数据库标志添加到您的 Cloud SQL 实例:
gcloud sql instances patch $CLOUDSQL_INSTANCE \
--database-flags cloudsql.enable_pgaudit=on,pgaudit.log=all
- 如果出现提示,请输入“y”以确认并继续。
注意:请等待补丁命令运行完成后再继续。当您看到“Patching Cloud SQL instance...done”消息后,即可继续执行下一步。
-
在 Cloud 控制台的导航菜单 (
) 中,点击 SQL。
-
点击名为 postgres-orders 的 Cloud SQL 实例。
-
在 Cloud SQL 概览面板的顶部菜单中,点击重启,以在第 1 步中的补丁命令运行完毕后重启实例。
如果再次出现提示,请在弹出式对话框中再次点击重启。
注意:重启 Cloud SQL for PostgreSQL 实例可能需要几分钟时间。当您看到“Restarted postgres-orders”消息,则表示实例已成功重启,即可继续执行下一步。
- 在 Cloud 控制台的连接到此实例部分,点击打开 Cloud Shell。
注意:如果您收到错误消息且无法连接,请等待几分钟,直到重启后的实例可正常访问,然后重复执行第 6 步。
Cloud Shell 中会自动填充一条用于连接到此实例的命令。
- 按原样运行该命令,并在系统提示时输入密码
supersecret!。
psql 会话将在 Cloud Shell 中启动。
- 在 psql 中,运行以下命令以创建
orders 数据库,并启用 pgAudit 扩展程序以记录所有读取和写入操作:
CREATE DATABASE orders;
\c orders;
-
再次输入密码 supersecret!。
-
在 psql 中,运行以下命令以创建和配置数据库扩展程序:
CREATE EXTENSION pgaudit;
ALTER DATABASE orders SET pgaudit.log = 'read,write';
在 Cloud 控制台中启用审核日志记录
在本部分中,您将在 Cloud 控制台中启用审核日志记录。
- 在 Cloud 控制台的导航菜单 (
) 中,依次点击 IAM 和管理 > 审核日志。
注意:如果您在页面顶部看到一条消息,指出您无权查看一个或多个父资源的继承的审核日志配置数据,请放心忽略该消息并继续执行下一步。
-
在数据访问审核日志配置下的过滤条件框中,输入 Cloud SQL,然后从下拉列表中选择相应条目。
-
选中左侧的 Cloud SQL 复选框,然后选中右侧信息面板中的以下复选框:
- 在信息面板中点击保存。
在 Cloud SQL for PostgreSQL 上填充数据库
在本部分中,您将使用提供给您的数据填充 orders 数据库。
-
点击 Cloud Shell 标题栏上的 + 图标,在 Cloud Shell 中打开一个新标签页。
-
在新标签页中,运行以下命令来下载数据和数据库填充脚本:
export SOURCE_BUCKET=gs://spls/gsp920
gsutil -m cp ${SOURCE_BUCKET}/create_orders_db.sql .
gsutil -m cp ${SOURCE_BUCKET}/DDL/distribution_centers_data.csv .
gsutil -m cp ${SOURCE_BUCKET}/DDL/inventory_items_data.csv .
gsutil -m cp ${SOURCE_BUCKET}/DDL/order_items_data.csv .
gsutil -m cp ${SOURCE_BUCKET}/DDL/products_data.csv .
gsutil -m cp ${SOURCE_BUCKET}/DDL/users_data.csv .
- 在新标签页中继续操作,运行以下命令以创建数据库并填充数据:
export CLOUDSQL_INSTANCE=postgres-orders
export POSTGRESQL_IP=$(gcloud sql instances describe $CLOUDSQL_INSTANCE --format="value(ipAddresses[0].ipAddress)")
export PGPASSWORD=supersecret!
psql "sslmode=disable user=postgres hostaddr=${POSTGRESQL_IP}" \
-c "\i create_orders_db.sql"
- 退出新标签页中的终端会话:
exit
- 返回到原始 Cloud Shell 标签页中的 psql 会话,然后运行以下命令,以进一步记录对特定关系(例如
order_items 表)的所有 SELECT 操作:
CREATE ROLE auditor WITH NOLOGIN;
ALTER DATABASE orders SET pgaudit.role = 'auditor';
GRANT SELECT ON order_items TO auditor;
- 运行下面的第一个
SELECT 查询:
SELECT
users.id AS users_id,
users.first_name AS users_first_name,
users.last_name AS users_last_name,
COUNT(DISTINCT order_items.order_id ) AS order_items_order_count,
COALESCE(SUM(order_items.sale_price ), 0) AS order_items_total_revenue
FROM order_items
LEFT JOIN users ON order_items.user_id = users.id
GROUP BY 1, 2, 3
ORDER BY 4 DESC
LIMIT 500;
SELECT
products.id AS products_id,
products.name AS products_name,
products.sku AS products_sku,
products.cost AS products_cost,
products.retail_price AS products_retail_price,
products.distribution_center_id AS products_distribution_center_id,
COUNT(DISTINCT order_items.order_id ) AS order_items_order_count,
COALESCE(SUM(order_items.sale_price ), 0) AS order_items_total_revenue
FROM order_items
LEFT JOIN inventory_items ON order_items.inventory_item_id = inventory_items.id
LEFT JOIN products ON inventory_items.product_id = products.id
GROUP BY 1, 2, 3, 4, 5, 6
ORDER BY 7 DESC
LIMIT 500;
SELECT
order_items.order_id AS order_id,
distribution_centers.id AS distribution_centers_id,
distribution_centers.name AS distribution_centers_name,
distribution_centers.latitude AS distribution_centers_latitude,
distribution_centers.longitude AS distribution_centers_longitude
FROM order_items
LEFT JOIN inventory_items ON order_items.inventory_item_id = inventory_items.id
LEFT JOIN products ON inventory_items.product_id = products.id
LEFT JOIN distribution_centers ON products.distribution_center_id = distribution_centers.id
GROUP BY 1, 2, 3, 4, 5
ORDER BY 2
LIMIT 500;
-
输出结果有 500 行,因此您可以输入 q 来关闭结果并返回到 orders=> 提示。
-
对代码块中的其他两个查询标签页重复执行第 5 步和第 6 步。
-
运行以下命令,退出 psql:
\q
查看 pgAudit 日志
在此步骤中,您将查看 pgAudit 日志中有关数据库更新和查询的日志记录。
-
在控制台中的导航菜单 (
) 上,点击查看所有产品。在可观测性下,点击日志记录以打开 Logs Explorer 页面。
-
在 Logs Explorer 的查询标签页中,粘贴以下内容,然后点击运行查询:
resource.type="cloudsql_database"
logName="projects/{{{project_0.project_id|(GCP Project)}}}/logs/cloudaudit.googleapis.com%2Fdata_access"
protoPayload.request.@type="type.googleapis.com/google.cloud.sql.audit.v1.PgAuditEntry"
- 在显示的直方图中,您可以查看与 DDL、数据插入操作以及之前运行的
SELECT 查询相关的审核活动。

- 点击直方图上的最后一个柱形,该柱形对应于您运行的
SELECT 查询。
日志条目会在直方图下方的查询结果面板中列出。
- 展开一条日志,您将在
protoPayload.request 下看到您运行的 SELECT 查询。
在 Cloud SQL for PostgreSQL 数据库上启用并配置 pgAudit
任务 3. 配置 Cloud SQL IAM 数据库身份验证
在此任务中,您将配置 Cloud SQL IAM 数据库身份验证。到目前为止,您执行所有数据库访问和更新任务时,都使用的是内置 PostgreSQL 用户账号。您也可以使用 Cloud IAM 账号创建 Cloud SQL for PostgreSQL 用户。这样一来,数据库用户在访问 Cloud SQL 时,可以使用 Cloud IAM 进行身份验证,而无需使用内置数据库账号,您还可以在数据库级别向这些用户授予精细权限。
在此任务中,您将把您在本实验中的用户账号配置为 Cloud SQL IAM 用户,使用 postgres 管理员账号向该用户授予对 orders.order_items 数据库表的访问权限,然后使用 psql 命令行实用程序,通过命令行测试该用户对 orders.order_items 数据库表的访问权限。
有关此任务中使用的身份验证流程的详细说明,请参阅 Cloud SQL for PostgreSQL 的 IAM 身份验证文档。
在配置 Cloud SQL IAM 身份验证之前,使用 Cloud IAM 用户账号测试数据库的访问权限。
您将尝试使用 Cloud IAM 用户账号访问数据库,由于此时 Cloud SQL IAM 身份验证尚未启用,您会看到此连接尝试失败。此举的目的是证明 Cloud IAM 用户最初无法访问数据。我们将在下一部分解决此问题。
- 在 Cloud Shell 中,将您在本实验中使用的学员账号作为用户名,测试对
orders 数据库的访问权限:
export USERNAME=$(gcloud config list --format="value(core.account)")
export CLOUDSQL_INSTANCE=postgres-orders
export POSTGRESQL_IP=$(gcloud sql instances describe $CLOUDSQL_INSTANCE --format="value(ipAddresses[0].ipAddress)")
export PGPASSWORD=$(gcloud auth print-access-token)
psql --host=$POSTGRESQL_IP $USERNAME --dbname=orders
由于您尚未创建 Cloud SQL IAM 用户,此次连接尝试将失败,您会看到类似如下所示的身份验证失败消息:
psql --host=$POSTGRESQL_IP $USERNAME --dbname=orders
psql: error: connection to server at "35.226.251.234", port 5432 failed: FATAL: password authentication failed for user "student-01-22fa974575e4@qwiklabs.net"
connection to server at "35.226.251.234", port 5432 failed: FATAL: password authentication failed for user "student-01-22fa974575e4@qwiklabs.net"
Cloud SQL IAM 数据库身份验证使用 OAuth 2.0 访问令牌作为 Cloud IAM 用户密码,这些令牌仅在一小时内短期有效,因此每次进行身份验证时,都需要重新生成令牌。应始终使用 PGPASSWORD 环境变量,将访问令牌传入 psql 命令中,因为 psql 密码参数的缓冲区太小,无法容纳 OAuth 2.0 令牌字符串。
创建 Cloud SQL IAM 用户
在本部分中,您将创建 Cloud SQL IAM 用户,并确认已启用 Cloud SQL IAM 用户身份验证。
-
在 Cloud 控制台的导航菜单 (
) 中,点击 SQL
-
点击名为 postgres-orders 的 Cloud SQL 实例。
在右侧的配置面板中,您可以看到,数据库标志和参数列表中目前仅包含 pgAudit.log 和 cloudsql.enable_pgaudit。
-
在主实例下的 SQL 菜单(左侧面板)中,点击用户,打开用户面板。
-
点击添加用户账号。
-
选择 Cloud IAM。
-
在主账号框中,输入您在本实验中使用的学员名:
-
点击添加。
等待新用户添加成功。
在实例的主概览页面上,右侧的配置面板中会显示 cloudsql.iam_authentication 已添加到数据库标志和参数列表中。
向 Cloud IAM 用户授予对 Cloud SQL 数据库表的访问权限
现在,您可以使用内置的 postgres 管理员账号连接到 postgres-orders 实例,并向 Cloud IAM 用户授予对 orders.order_items 表的访问权限。
- 在实例的主概览页面上,找到连接到此实例部分,点击打开 Cloud Shell。
Cloud Shell 中会自动填充一条用于连接到此实例的命令。
-
按原样运行该命令,并在系统提示时输入密码 supersecret!。
-
输入以下 SQL 命令以切换到 orders 数据库:
\c orders
当系统提示输入密码时,再次输入 supersecret!。
- 输入以下 SQL 命令,向实验用户授予对
order_items 表的所有权限。此查询中已预填了您在本实验中的 Cloud IAM 用户名。
GRANT ALL PRIVILEGES ON TABLE order_items TO "{{{user_0.username|[IAM Username]}}}";
\q
在配置 Cloud SQL IAM 身份验证后,使用 Cloud IAM 用户账号测试数据库访问权限。
现在,鉴于 Cloud SQL IAM 身份验证已经启用,您将再次尝试使用 Cloud IAM 用户账号访问数据库,以确认该 Cloud IAM 用户现在可以访问数据。
现在,您可以使用 Cloud IAM 用户账号(而非内置 postgres 用户账号)再次测试对数据库的访问权限:
- 在 Cloud Shell 中运行以下命令,使用 Cloud IAM 数据库用户账号连接到数据库:
export PGPASSWORD=$(gcloud auth print-access-token)
psql --host=$POSTGRESQL_IP $USERNAME --dbname=orders
连接成功,您现在已使用 Cloud IAM 用户身份验证连接到该实例。
- 运行以下查询,测试您的访问权限:
SELECT COUNT(*) FROM order_items;
现在,该命令会返回成功结果:
orders=> SELECT COUNT(*) FROM order_items;
count
--------
198553
(1 row)
- 运行以下查询,确认您没有访问其他表的权限:
SELECT COUNT(*) FROM users;
此查询将返回以下结果,表明查询失败:
orders=> SELECT COUNT(*) FROM users;
ERROR: permission denied for table users
配置 Cloud SQL IAM 数据库身份验证
恭喜!
在本实验中,您使用客户管理的加密密钥保护了存储在 Cloud SQL for PostgreSQL 中的静态数据,启用了 pgAudit,并配置了 Cloud SQL IAM 数据库用户身份验证。
Google Cloud 培训和认证
…可帮助您充分利用 Google Cloud 技术。我们的课程会讲解各项技能与最佳实践,可帮助您迅速上手使用并继续学习更深入的知识。我们提供从基础到高级的全方位培训,并有点播、直播和虚拟三种方式选择,让您可以按照自己的日程安排学习时间。各项认证可以帮助您核实并证明您在 Google Cloud 技术方面的技能与专业知识。
上次更新手册的时间:2025 年 9 月 3 日
上次测试实验的时间:2025 年 7 月 2 日
版权所有 2026 Google LLC 保留所有权利。Google 和 Google 徽标是 Google LLC 的商标。其他所有公司名和产品名可能是其各自相关公司的商标。