參數化安全檢視區塊可為應用程式提供資料安全性及列存取控管。這些篩選器會根據應用程式使用者的身分篩選查詢結果。
本教學課程說明如何在 Cloud SQL 中設定參數化安全檢視區塊、設定資料庫角色和權限來限制對基本資料表的存取權,以及驗證資料安全性。本文提供的範例僅供示範。
什麼是參數化安全檢視區塊?
一般來說,應用程式應使用具備資料庫最低必要存取權的服務帳戶執行。舉例來說,如果應用程式不應寫入資料庫,就應使用具有唯讀存取權的角色。您應在資料庫層級設定這些存取權控管。
如果應用程式需要的安全性比標準資料庫層級存取權限更精細,可以使用參數化安全檢視畫面,確保使用者只能查看授權資料。參數化安全檢視畫面提供動態資料安全性與列存取控管,適用於多租戶 SaaS 應用程式,且不需要為每個應用程式使用者設定個別的資料庫角色。
使用參數化安全檢視區塊有三大好處:
- 動態資料安全性和列存取控管:使用使用者 ID 篩選查詢,讓使用者只能存取授權資料,不受查詢措辭影響。
- 簡化角色管理:為所有應用程式使用者使用單一共用資料庫角色,不必為每個使用者分別管理資料庫角色。
目標
- 使用具名檢視區塊參數建立參數化安全檢視區塊。
- 建立應用程式用來連線至資料庫,以及存取參數化安全檢視區塊的資料庫角色。
- 將參數化安全檢視區塊的權限授予新角色,並撤銷對基礎資料表的存取權。
- 使用新角色連線,並確認無法存取受限資料表。
- 使用
mysql.execute_parameterized_query預存程序或 QueryData API,對參數化檢視區塊執行查詢。
費用
在本文件中,您會使用下列 Google Cloud的計費元件:
您可以使用 Pricing Calculator 根據預測用量估算費用。
初次使用 Google Cloud 的使用者可能符合免費試用期資格。
如要避免繼續計費,請在完成本文中的工作後,刪除您建立的資源。詳情請參閱「清理」一節。
事前準備
建立參數化安全檢視區塊前,請先完成下列必要條件。
啟用計費功能和必要的 API
在 Google Cloud 控制台選取專案。
啟用建立及連線至 Cloud SQL 時所需的 Cloud API。
在「確認專案」步驟中,按一下「下一步」,確認要變更的專案名稱。
在「啟用 API」步驟中,點選「啟用」,啟用下列項目:
- MySQL 適用的 Cloud SQL API
- Knowledge Catalog API
建立及連線至資料庫
準備環境
如要準備對參數化安全檢視區執行查詢,請設定資料庫、資料庫角色和應用程式結構定義。
啟用資料庫旗標
- 請確認 MySQL 適用的 Cloud SQL 執行個體執行的是 MySQL 適用的 Cloud SQL 8.0.43 以上版本。如果 MySQL 8.0 適用的 Cloud SQL 執行個體執行的是較早的子版本,您可以執行子版本升級。
- 為執行個體啟用
cloudsql_parameterized_secure_view資料庫旗標。變更這個標記不需要重新啟動資料庫。詳情請參閱「設定執行個體的資料庫旗標」。
設定資料庫和角色
前往 Google Cloud 控制台的 Cloud SQL 頁面。
從清單中選取執行個體。
按一下導覽選單中的「Cloud SQL Studio」。
使用管理員使用者帳戶登入 Studio。
按一下「驗證」。「Explorer」窗格會顯示資料庫中的物件清單。
按一下「開啟新的 SQL 編輯器分頁」或「開啟新分頁」,開啟新分頁。
為應用程式資料和檢視區塊建立名為
store_db的資料庫:CREATE DATABASE IF NOT EXISTS store_db; USE store_db;建立新的資料庫角色,以便對參數化檢視區塊執行查詢。應用程式會使用這個角色連線至資料庫,並執行查詢,存取權嚴格限制在授權檢視畫面:
CREATE ROLE 'psv_user';
建立資料表並插入資料
前往 Google Cloud 控制台的 Cloud SQL 頁面。
從清單中選取 MySQL 適用的 Cloud SQL 執行個體。
按一下導覽選單中的「Cloud SQL Studio」。
使用資料庫驗證功能登入 Studio。
按一下「新分頁」,開啟新的 SQL 編輯器分頁。
建立資料表並插入資料:
CREATE TABLE store_db.checked_items ( bag_id INT, timestamp TIMESTAMP, loc_code CHAR(3), scan_type CHAR(1), location TEXT, customer_id INT ); INSERT INTO store_db.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 控制台的 Cloud SQL 頁面。
從清單中選取執行個體。
按一下導覽選單中的「Cloud SQL Studio」。
登入 Studio,並以您在上一節中使用的
store_db使用者帳戶連線至database。按一下「驗證」。「Explorer」窗格會顯示資料庫中的物件清單。
按一下「開啟新的 SQL 編輯器分頁」或「開啟新分頁」,開啟新分頁。
如要提供檢視表的限制存取權,請建立參數化檢視表:
CREATE VIEW store_db.secure_checked_items AS SELECT bag_id, timestamp, location FROM store_db.checked_items t WHERE customer_id = @app_end_userid;將參數化檢視區塊的 SELECT 存取權授予
psv_user角色:GRANT SELECT ON store_db.secure_checked_items TO 'psv_user';授予內建系統預存程序的執行權限,安全地執行參數化查詢:
GRANT EXECUTE ON PROCEDURE mysql.execute_parameterized_query TO 'psv_user';選用。明確撤銷底層資料表的任何直接權限,確保使用者無法規避安全檢視畫面:
psv_userREVOKE ALL PRIVILEGES ON store_db.checked_items FROM 'psv_user';將
psv_user角色授予透過 IAM 驗證的資料庫使用者或應用程式登入帳戶:GRANT 'psv_user' TO 'IAM_USER_EMAIL'@'%'; SET DEFAULT ROLE 'psv_user' TO 'IAM_USER_EMAIL'@'%';將
IAM_USER_EMAIL替換為 IAM 使用者電子郵件地址或應用程式登入帳戶。
驗證資料安全性
如要確認是否可以查詢參數化安全檢視區塊,請按照下列步驟操作:
使用受限的 IAM 電子郵件地址或應用程式登入,登入 Cloud SQL Studio。
按一下「新分頁」,開啟新的 SQL 編輯器分頁。
查詢基礎資料表,並確認存取遭拒。
SELECT * FROM store_db.checked_items;資料庫會傳回
ERROR 1142 (42000): SELECT command denied to user 'IAM_USER_EMAIL'@'%' for table 'checked_items'錯誤。使用內建的
mysql.execute_parameterized_query預存程序,查詢參數化安全檢視區塊。CALL mysql.execute_parameterized_query( 'SELECT * FROM store_db.secure_checked_items', 'app_end_userid=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": { "cloud_sql_reference": { "database_reference": { "engine": "MYSQL", "project_id": "PROJECT_ID", "region": "REGION", "instance_id": "INSTANCE_ID", "database_id": "DATABASE_ID" } } }, "parameterized_secure_view_parameters": { "parameters": { "key": "app_end_userid" "app_end_userid": "303" } } }, "generation_options": { "generate_query_result": true, "generate_natural_language_answer": true, "generate_explanation": true } }'替換下列值:
PROJECT_ID: Google Cloud 專案 ID。REGION:MySQL 適用的 Cloud SQL 執行個體所在區域。INSTANCE_ID:MySQL 適用的 Cloud SQL 執行個體 ID。DATABASE_ID:MySQL 適用的 Cloud SQL 資料庫 ID。
清除所用資源
刪除叢集
刪除「事前準備」一節中建立的叢集時,您建立的所有物件也會一併刪除。
前往 Google Cloud 控制台的 Cloud SQL 頁面。
從清單中選取執行個體。
點選「刪除」。
輸入執行個體名稱,然後按一下「刪除」,確認要刪除執行個體。
後續步驟
瞭解參數化安全檢視區塊。
瞭解如何使用參數化安全檢視區塊。