GSP920

總覽
客戶自行管理的加密金鑰 (CMEK),可讓您將自有的加密編譯金鑰用於 Cloud SQL 靜態資料。新增 CMEK 後,每當發出 API 呼叫時,Cloud SQL 就會使用您的金鑰存取資料。
本實驗室提供逐步指南,說明如何保護 PostgreSQL 適用的 Cloud SQL 執行個體。首先,請使用 CMEK 部署新的 Cloud SQL 執行個體。建立 PostgreSQL 適用的 Cloud SQL 執行個體後,請設定 pgAudit,選擇性記錄及追蹤對該執行個體執行的 SQL 作業,最後設定並測試 Cloud SQL IAM 資料庫驗證機制。
學習內容
- 為 PostgreSQL 適用的 Cloud SQL 設定 CMEK。
- 在 PostgreSQL 適用的 Cloud SQL 執行個體上啟用及設定 pgAudit。
- 設定 PostgreSQL 適用的 Cloud SQL IAM 資料庫驗證機制。
目標對象
這個實作實驗室最適合 PostgreSQL 資料庫管理員,讓專業人員透過實際操作,瞭解如何設定及調整 Google Cloud 資源,以便支援 PostgreSQL。
設定和需求
瞭解以下事項後,再點選「Start Lab」按鈕
請詳閱以下操作說明。實驗室活動會計時,且中途無法暫停。點選「Start Lab」後就會開始計時,顯示可使用 Google Cloud 資源的時間。
您將在真正的雲端環境完成實作實驗室活動,而不是模擬或示範環境。為此,我們會提供新的暫時憑證,供您在實驗室活動期間登入及存取 Google Cloud。
為了順利完成這個實驗室,請先確認:
- 可以使用標準的網際網路瀏覽器 (Chrome 瀏覽器為佳)。
注意事項:請使用無痕模式 (建議選項) 或私密瀏覽視窗執行此實驗室,這可以防止個人帳戶和學員帳戶之間的衝突,避免個人帳戶產生額外費用。
- 是時候完成實驗室活動了!別忘了,活動一旦開始將無法暫停。
注意事項:務必使用實驗室專用的學員帳戶。如果使用其他 Google Cloud 帳戶,可能會產生額外費用。
如何開始研究室及登入 Google Cloud 控制台
-
點選「Start Lab」按鈕。如果實驗室會產生費用,畫面上會出現選擇付款方式的對話方塊。左側的「Lab Details」窗格會顯示下列項目:
- 「Open Google Cloud console」按鈕
- 剩餘時間
- 必須在這個研究室中使用的臨時憑證
- 完成這個實驗室所需的其他資訊 (如有)
-
點選「Open Google Cloud console」;如果使用 Chrome 瀏覽器,也能按一下滑鼠右鍵,選取「在無痕視窗中開啟連結」。
接著,實驗室會啟動相關資源,並開啟另一個分頁,顯示「登入」頁面。
提示:您可以在不同的視窗中並排開啟分頁。
注意:如果頁面中顯示「選擇帳戶」對話方塊,請點選「使用其他帳戶」。
-
如有必要,請將下方的 Username 貼到「登入」對話方塊。
{{{user_0.username | "Username"}}}
您也可以在「Lab Details」窗格找到 Username。
-
點選「下一步」。
-
複製下方的 Password,並貼到「歡迎使用」對話方塊。
{{{user_0.password | "Password"}}}
您也可以在「Lab Details」窗格找到 Password。
-
點選「下一步」。
重要事項:請務必使用實驗室提供的憑證,而非自己的 Google Cloud 帳戶憑證。
注意:如果使用自己的 Google Cloud 帳戶來進行這個實驗室,可能會產生額外費用。
-
按過後續的所有頁面:
- 接受條款及細則。
- 由於這是臨時帳戶,請勿新增救援選項或雙重驗證機制。
- 請勿申請免費試用。
Google Cloud 控制台稍後會在這個分頁開啟。
注意:如要使用 Google Cloud 產品和服務,請點選「導覽選單」,或在「搜尋」欄位輸入服務或產品名稱。
工作 1:建立已啟用 CMEK 的 PostgreSQL 適用的 Cloud SQL 執行個體
在這項工作中,您會建立已啟用 CMEK 的 PostgreSQL 適用的 Cloud SQL 執行個體。請務必妥善保管金鑰,否則將無法管理資料庫。
為 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 金鑰環和金鑰
在本節中,您會建立 Cloud KMS 金鑰環和金鑰,搭配 CMEK 使用。
- 在 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 的 PostgreSQL 適用的 Cloud SQL 執行個體。您無法修補現有執行個體來啟用 CMEK,因此如果打算使用 CMEK 加密資料,請務必留意這點。
如要從外部開發或應用程式環境存取 Cloud SQL 執行個體,您可以為 Cloud SQL 執行個體設定公開 IP 位址,並將這些環境的 IP 位址加入許可清單來控管存取權,這樣只有您指定的位址範圍才能存取公開介面。
您會將實驗室中的 Compute Engine VM 執行個體視為開發環境,因此需要將該執行個體的外部 IP 位址加入允許清單。您也能將 Cloud Shell 的外部 IP 位址加入許可清單,方便完成實驗室的後續工作。
- 在 Cloud Shell 執行下列指令,找出
bastion-vm 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 執行下列指令,建立 PostgreSQL 適用的 Cloud SQL 執行個體:
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:在 PostgreSQL 適用的 Cloud SQL 資料庫啟用及設定 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 控制台的「導覽選單」
點選「Cloud SQL」。
-
點選 Cloud SQL 執行個體「postgres-orders」。
-
等步驟 1 的修補程式執行完畢後,在 Cloud SQL「總覽」面板的頂端選單中,點選「重新啟動」來重啟執行個體。
如果系統再次提示,請在彈出式對話方塊再點選一次「重新啟動」。
注意:重新啟動 PostgreSQL 適用的 Cloud SQL 執行個體可能需要幾分鐘的時間。看到執行個體已成功重新啟動的訊息 Restarted postgres-orders 後,即可繼續下一步。
- 在 Cloud 控制台的「連線至這個執行個體」部分,點選「開啟 Cloud Shell」。
注意:如果收到錯誤訊息且無法連線,請稍候幾分鐘,等執行個體在重新啟動後恢復運作,然後重複步驟 6。
Cloud Shell 會自動填入連至執行個體的指令。
- 直接執行該指令,並在系統提示時輸入密碼
supersecret!。
Cloud Shell 會啟動 psql 工作階段。
- 在 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 與管理」>「稽核記錄」。
注意:如果頁面頂端顯示訊息,指出 you don't have permission to view inherited audit logs configuration data for one or more parent resources,請忽略該訊息並繼續執行下一步。
-
在「資料存取稽核記錄設定」下方的「篩選條件」方塊輸入 Cloud SQL,然後選取下拉式清單中的項目。
-
勾選左側的 Cloud SQL 核取方塊,然後在右側的資訊面板勾選下列核取方塊:
- 點選「資訊面板」中的「儲存」。
在 PostgreSQL 適用的 Cloud SQL 填入資料庫
在本節中,您會使用提供的資料填入 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 查詢。
在 PostgreSQL 適用的 Cloud SQL 資料庫啟用及設定 pgAudit
工作 3:設定 Cloud SQL IAM 資料庫驗證機制
在這項工作中,您會設定 Cloud SQL IAM 資料庫驗證機制。您目前執行的所有資料庫存取和更新工作,都使用內建的 PostgreSQL 使用者帳戶。您也能使用 Cloud IAM 帳戶建立 PostgreSQL 適用的 Cloud SQL 使用者。資料庫使用者可透過 Cloud IAM 向 Cloud SQL 進行驗證,不必使用內建資料庫帳戶,而且能授予這些使用者資料庫層級的精細權限。
在這項工作中,您會將實驗室使用者帳戶設為 Cloud SQL IAM 使用者,並透過 postgres 管理員帳戶授予該使用者 orders.order_items 資料庫資料表的存取權,然後用 psql 指令列公用程式,從指令列測試 orders.order_items 資料庫資料表的存取權。
如要瞭解這項工作使用的 PostgreSQL 適用的 Cloud SQL 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 控制台的「導覽選單」
點選「Cloud SQL」。
-
點選 Cloud SQL 執行個體「postgres-orders」。
在右側的「設定」面板中,請注意「資料庫旗標和參數」清單只含 pgAudit.log 和 cloudsql.enable_pgaudit。
-
在「主要執行個體」下方左側的「SQL menu」中,點選「使用者」來開啟「使用者」面板。
-
點選「新增使用者帳戶」。
-
選取「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 資料庫驗證機制
恭喜!
在本實驗室,您使用 CMEK 保護 PostgreSQL 適用的 Cloud SQL 靜態資料、啟用 pgAudit,並設定 Cloud SQL IAM 資料庫使用者驗證機制。
Google Cloud 教育訓練與認證
協助您瞭解如何充分運用 Google Cloud 的技術。我們的課程會介紹專業技能和最佳做法,讓您可以快速掌握要領並持續進修。我們提供從基本到進階等級的訓練課程,並有隨選、線上和虛擬課程等選項,方便您抽空參加。認證可協助您驗證及證明自己在 Google Cloud 技術方面的技能和專業知識。
使用手冊上次更新日期:2025 年 9 月 3 日
實驗室上次測試日期:2025 年 7 月 2 日
Copyright 2026 Google LLC 保留所有權利。Google 和 Google 標誌是 Google LLC 的商標,其他公司和產品名稱則有可能是其關聯公司的商標。