本教學課程說明如何在 AlloyDB for PostgreSQL 中使用參數化安全檢視區塊,限制使用者對資料庫表的存取權。在本教學課程中,您將設定參數化安全檢視區塊、設定資料庫角色和權限來限制對基礎資料表的存取權,並驗證資料安全性。參數化安全檢視區塊可協助保護應用程式安全,這些應用程式會使用透過 QueryData API 產生的自然語言查詢。
我們提供範例,說明參數化安全檢視區塊的功能。這些範例僅供示範。
什麼是參數化安全檢視區塊?
一般來說,應用程式應使用具備資料庫最低必要存取權的服務帳戶執行。舉例來說,如果應用程式不應寫入資料庫,就應使用具有唯讀存取權的角色。您應在資料庫層級設定這些存取權控管。
不過,有時應用程式需要的安全控管機制,比標準資料庫層級的存取權限更精細。參數化安全檢視可透過 SQL 檢視提供應用程式資料安全性和列存取權控管。確保應用程式使用者只能查看自己有權存取的資料。
處理臨時或 LLM 生成的自然語言查詢時,參數化安全檢視會以使用者 ID 參數化檢視,確保使用者只能存取授權資料,無論查詢措辭為何,都能降低安全風險。此外,這個方法可讓單一資料庫角色安全地服務所有應用程式使用者,避免為每位使用者建立個別資料庫角色來強制執行資料列層級安全防護,進而簡化使用者管理作業。
目標
- 使用具名檢視區塊參數建立安全參數化檢視區塊。
- 建立應用程式用來連線至資料庫,以及存取參數化安全檢視區塊的資料庫角色。
- 授予新角色安全檢視區塊的權限,並撤銷對基礎資料表的存取權。
- 使用新角色連線,並確認無法存取受限資料表。
- 使用
execute_parameterized_query函式或 QueryData API,對參數化安全檢視區塊執行查詢。
費用
在本文件中,您會使用下列 Google Cloud的計費元件:
您可以使用 Pricing Calculator 根據預測用量估算費用。
初次使用 Google Cloud 的使用者可能符合免費試用期資格。
如要避免繼續計費,請在完成本文中的工作後,刪除您建立的資源。詳情請參閱「清理」一節。
事前準備
建立內容集之前,請先完成下列先決條件。
啟用帳單和必要 API
在 Google Cloud 控制台中選取專案。
啟用建立及連線至 AlloyDB for PostgreSQL 時所需的 Cloud API。
- 在「確認專案」步驟中,按一下「下一步」,確認要變更的專案名稱。
在「啟用 API」步驟中,按一下「啟用」,啟用下列項目:
- AlloyDB for PostgreSQL API
- Dataplex Universal Catalog API
建立及連線至資料庫
準備環境
如要準備對參數化安全檢視區塊執行查詢,請設定資料庫、資料庫角色、parameterized_view 擴充功能和應用程式結構定義。
啟用必要擴充功能
啟用parameterized_views.enabled 資料庫旗標,載入必要的擴充功能程式庫。詳情請參閱「設定執行個體的資料庫旗標」。設定資料庫
- 建立名為
database的資料庫,用於儲存應用程式資料和參數化檢視區塊。詳情請參閱「建立資料庫」。
建立資料庫角色、擴充功能和應用程式結構定義
前往 Google Cloud 控制台的 AlloyDB 頁面。
從清單中選取叢集。
按一下導覽選單中的「AlloyDB Studio」。
使用 postgres 驗證登入 Studio。
按一下「驗證」。「Explorer」窗格會顯示資料庫中的物件清單。
按一下「開啟新的 SQL 編輯器分頁」或「開啟新分頁」,開啟新分頁
在資料庫中建立
parameterized_views擴充功能。-- Requires parameterized_views.enabled set to true CREATE EXTENSION parameterized_views;建立擴充功能時,系統也會建立名為
parameterized_views的結構定義,確保 API 位於該結構定義的命名空間中,且不會與現有 API 發生衝突。以具備超級使用者權限的使用者身分登入,例如內建的 postgres 使用者。如要建立新的超級使用者 (例如
admin_user),請執行下列指令:CREATE ROLE admin_user WITH LOGIN PASSWORD '...'; GRANT ALL PRIVILEGES ON DATABASE database TO admin_user;詳情請參閱「
CREATE USER」。建立新的資料庫角色,以便對參數化安全檢視區塊執行查詢。這是 AlloyDB 角色,應用程式會使用這個角色連線及登入資料庫,並執行查詢,但只能存取最少量的必要公開函式或物件。
CREATE ROLE psv_user WITH LOGIN PASSWORD '...';詳情請參閱「
CREATE USER」。以管理員使用者身分連線。
SET role TO admin_user;建立包含資料表的結構定義。
CREATE SCHEMA schema;建立資料表並插入資料。
CREATE TABLE store.checked_items(bag_id INT,timestamp TIMESTAMP, loc_code CHAR(3), scan_type CHAR(1), location TEXT, customer_id INT); INSERT INTO store.checked_items (bag_id, timestamp, loc_code, scan_type, location, customer_id) VALUES (101, '2023-10-26 10:00:00', 'ABC', 'I', 'Warehouse A', 123), (102, '2023-10-26 10:15:30', 'DEF', 'O', 'Loading Dock B', 456), (103, '2023-10-26 10:30:45', 'GHI', 'I', 'Conveyor Belt 1', 789), (104, '2023-10-26 11:00:00', 'JKL', 'O', 'Shipping Area C', 101), (105, '2023-10-26 11:45:15', 'MNO', 'I', 'Sorting Station D', 202), (106, '2023-10-26 12:00:00', 'PQR', 'O', 'Truck Bay E', 303);
建立安全且含參數的檢視畫面,並設定存取權
如要建立安全參數化檢視區塊,並為基本資料表和檢視區塊設定適當的存取權,請按照下列步驟操作:
前往 Google Cloud 控制台的 AlloyDB 頁面。
從清單中選取叢集。
按一下導覽選單中的「AlloyDB Studio」。
登入 Studio,然後以
admin_user身分連線至database。按一下「驗證」。「Explorer」窗格會顯示資料庫中的物件清單。
按一下「開啟新的 SQL 編輯器分頁」或「開啟新分頁」,開啟新分頁。
如要提供檢視表的限制存取權,請建立參數化安全檢視表:
CREATE VIEW store.secure_checked_items WITH (security_barrier) AS SELECT bag_id, timestamp, location FROM store.checked_items t WHERE customer_id = $@app_end_userid;授予檢視權限。
GRANT SELECT ON store.secure_checked_items TO psv_user;如要存取檢視畫面,請授予結構定義的存取權。
GRANT USAGE ON SCHEMA store TO psv_user;撤銷資料表的直接存取權。
REVOKE ALL PRIVILEGES ON store.checked_items FROM psv_user;以
admin_user管理員身分登入,並將psv_user角色授予 IAM 驗證使用者GRANT psv_user TO "IAM_USER_EMAIL";將
IAM_USER_EMAIL替換為您的 IAM 使用者電子郵件地址。
驗證資料安全性
如要確認參數化安全檢視畫面是否限制對指定檢視畫面的存取權,請以 IAM 驗證的使用者身分登入資料庫。在 AlloyDB 中,IAM 使用者會沿用指派給自己的資料庫角色權限。
以 IAM 驗證使用者身分登入資料庫。
確認無法存取基礎資料表。
SELECT * FROM store.checked_items; ERROR: permission denied for table checked_items使用
execute_parameterized_query函式存取參數化安全檢視畫面:SELECT * FROM parameterized_views.execute_parameterized_query( query => 'SELECT * from store.secure_checked_items', param_names => ARRAY ['app_end_userid'], param_values => ARRAY ['303'] );使用 SQL 語法和
QueryData要求 (附帶 PSV 參數) 查詢參數化安全檢視。
curl -X POST \
"https://geminidataanalytics.googleapis.com/v1beta/projects/PROJECT_ID/locations/REGION:queryData" \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json; charset=utf-8" \
-d '{
"prompt": "Show me the checked items.",
"context": {
"datasource_references": {
"alloydb": {
"database_reference": {
"project_id": "PROJECT_ID",
"region": "REGION",
"cluster_id": "CLUSTER_ID",
"instance_id": "INSTANCE_ID",
"database_id": "DATABASE_ID"
}
}
},
"parameterized_secure_view_parameters": {
"parameters": {
"app_end_userid": "303"
}
}
},
"generation_options": {
"generate_query_result": true,
"generate_natural_language_answer": true,
"generate_explanation": true
}
}'替換下列值:
PROJECT_ID: Google Cloud 專案 ID。REGION:AlloyDB for PostgreSQL 執行個體所在的區域。CLUSTER_ID:AlloyDB for PostgreSQL 叢集的 ID。INSTANCE_ID:AlloyDB for PostgreSQL 執行個體的 ID。DATABASE_ID:AlloyDB for PostgreSQL 資料庫的 ID。
清除所用資源
刪除叢集
刪除「事前準備」一節中建立的叢集時,您建立的所有物件也會一併刪除。
前往 Google Cloud 控制台的 AlloyDB 頁面。
從清單中選取叢集。
按一下「刪除叢集」。
在「Delete cluster」(刪除叢集) 中輸入叢集名稱,確認要刪除叢集。
後續步驟
- 瞭解參數化安全檢視畫面。
- 瞭解如何使用參數化安全檢視區塊管理應用程式資料安全性。