保護及控管應用程式資料的存取權

參數化安全檢視區塊可為應用程式提供資料安全性及列存取控管。這些篩選器會根據應用程式使用者的身分篩選查詢結果。

本教學課程說明如何在 Cloud SQL 中設定參數化安全檢視區塊、設定資料庫角色和權限來限制對基本資料表的存取權,以及驗證資料安全性。本文提供的範例僅供示範。

什麼是參數化安全檢視區塊?

一般來說,應用程式應使用具備資料庫最低必要存取權的服務帳戶執行。舉例來說,如果應用程式不應寫入資料庫,就應使用具有唯讀存取權的角色。您應在資料庫層級設定這些存取權控管。

如果應用程式需要的安全性比標準資料庫層級存取權限更精細,可以使用參數化安全檢視畫面,確保使用者只能查看授權資料。參數化安全檢視畫面提供動態資料安全性與列存取控管,適用於多租戶 SaaS 應用程式,且不需要為每個應用程式使用者設定個別的資料庫角色。

使用參數化安全檢視區塊有三大好處:

  • 動態資料安全性和列存取控管:使用使用者 ID 篩選查詢,讓使用者只能存取授權資料,不受查詢措辭影響。
  • 簡化角色管理:為所有應用程式使用者使用單一共用資料庫角色,不必為每個使用者分別管理資料庫角色。

目標

  • 使用具名檢視區塊參數建立參數化安全檢視區塊。
  • 建立應用程式用來連線至資料庫,以及存取參數化安全檢視區塊的資料庫角色。
  • 將參數化安全檢視區塊的權限授予新角色,並撤銷對基礎資料表的存取權。
  • 使用新角色連線,並確認無法存取受限資料表。
  • 使用 mysql.execute_parameterized_query 預存程序或 QueryData API,對參數化檢視區塊執行查詢。

費用

在本文件中,您會使用下列 Google Cloud的計費元件:

您可以使用 Pricing Calculator 根據預測用量估算費用。

初次使用 Google Cloud 的使用者可能符合免費試用期資格。

如要避免繼續計費,請在完成本文中的工作後,刪除您建立的資源。詳情請參閱「清理」一節。

事前準備

建立參數化安全檢視區塊前,請先完成下列必要條件。

啟用計費功能和必要的 API

  1. 在 Google Cloud 控制台選取專案。

    前往專案選取器

  2. 請確認您已為 Google Cloud 專案啟用計費功能。

  3. 啟用建立及連線至 Cloud SQL 時所需的 Cloud API。

    1. 啟用 API

    2. 在「確認專案」步驟中,按一下「下一步」,確認要變更的專案名稱。

    3. 在「啟用 API」步驟中,點選「啟用」,啟用下列項目:

      • MySQL 適用的 Cloud SQL API
      • Knowledge Catalog API

建立及連線至資料庫

  1. 建立執行個體
  2. 連線至執行個體並建立資料庫

準備環境

如要準備對參數化安全檢視區執行查詢,請設定資料庫、資料庫角色和應用程式結構定義。

啟用資料庫旗標

  • 請確認 MySQL 適用的 Cloud SQL 執行個體執行的是 MySQL 適用的 Cloud SQL 8.0.43 以上版本。如果 MySQL 8.0 適用的 Cloud SQL 執行個體執行的是較早的子版本,您可以執行子版本升級。
  • 為執行個體啟用 cloudsql_parameterized_secure_view 資料庫旗標。變更這個標記不需要重新啟動資料庫。詳情請參閱「設定執行個體的資料庫旗標」。

設定資料庫和角色

  1. 前往 Google Cloud 控制台的 Cloud SQL 頁面。

    前往 Cloud SQL

  2. 從清單中選取執行個體。

  3. 按一下導覽選單中的「Cloud SQL Studio」

  4. 使用管理員使用者帳戶登入 Studio

  5. 按一下「驗證」。「Explorer」窗格會顯示資料庫中的物件清單。

  6. 按一下「開啟新的 SQL 編輯器分頁」或「開啟新分頁」,開啟新分頁。

  7. 為應用程式資料和檢視區塊建立名為 store_db 的資料庫:

    CREATE DATABASE IF NOT EXISTS store_db;
    USE store_db;
    
  8. 建立新的資料庫角色,以便對參數化檢視區塊執行查詢。應用程式會使用這個角色連線至資料庫,並執行查詢,存取權嚴格限制在授權檢視畫面:

    CREATE ROLE 'psv_user';
    

建立資料表並插入資料

  1. 前往 Google Cloud 控制台的 Cloud SQL 頁面。

    前往 Cloud SQL

  2. 從清單中選取 MySQL 適用的 Cloud SQL 執行個體。

  3. 按一下導覽選單中的「Cloud SQL Studio」

  4. 使用資料庫驗證功能登入 Studio

  5. 按一下「新分頁」,開啟新的 SQL 編輯器分頁。

  6. 建立資料表並插入資料:

    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);
    

建立參數化安全檢視區塊並設定存取權

如要建立含參數的安全檢視區塊,請按照下列步驟操作:

  1. 前往 Google Cloud 控制台的 Cloud SQL 頁面。

    前往 Cloud SQL

  2. 從清單中選取執行個體。

  3. 按一下導覽選單中的「Cloud SQL Studio」

  4. 登入 Studio,並以您在上一節中使用的 store_db 使用者帳戶連線至 database

  5. 按一下「驗證」。「Explorer」窗格會顯示資料庫中的物件清單。

  6. 按一下「開啟新的 SQL 編輯器分頁」或「開啟新分頁」,開啟新分頁。

  7. 如要提供檢視表的限制存取權,請建立參數化檢視表:

    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;
    
  8. 將參數化檢視區塊的 SELECT 存取權授予 psv_user 角色:

    GRANT SELECT ON store_db.secure_checked_items TO 'psv_user';
    
  9. 授予內建系統預存程序的執行權限,安全地執行參數化查詢:

    GRANT EXECUTE ON PROCEDURE mysql.execute_parameterized_query TO 'psv_user';
    
  10. 選用。明確撤銷底層資料表的任何直接權限,確保使用者無法規避安全檢視畫面:psv_user

    REVOKE ALL PRIVILEGES ON store_db.checked_items FROM 'psv_user';
    
  11. psv_user 角色授予透過 IAM 驗證的資料庫使用者或應用程式登入帳戶:

    GRANT 'psv_user' TO 'IAM_USER_EMAIL'@'%';
    
    SET DEFAULT ROLE 'psv_user' TO 'IAM_USER_EMAIL'@'%';
    

    IAM_USER_EMAIL 替換為 IAM 使用者電子郵件地址或應用程式登入帳戶。

驗證資料安全性

如要確認是否可以查詢參數化安全檢視區塊,請按照下列步驟操作:

  1. 使用受限的 IAM 電子郵件地址或應用程式登入,登入 Cloud SQL Studio

  2. 按一下「新分頁」,開啟新的 SQL 編輯器分頁。

  3. 查詢基礎資料表,並確認存取遭拒。

    SELECT * FROM store_db.checked_items;
    

    資料庫會傳回 ERROR 1142 (42000): SELECT command denied to user 'IAM_USER_EMAIL'@'%' for table 'checked_items' 錯誤。

  4. 使用內建的 mysql.execute_parameterized_query 預存程序,查詢參數化安全檢視區塊。

    CALL mysql.execute_parameterized_query(
      'SELECT * FROM store_db.secure_checked_items',
      'app_end_userid=303'
    );
    
  5. 使用 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。

清除所用資源

刪除叢集

刪除「事前準備」一節中建立的叢集時,您建立的所有物件也會一併刪除。

  1. 前往 Google Cloud 控制台的 Cloud SQL 頁面。

    前往 Cloud SQL

  2. 從清單中選取執行個體。

  3. 點選「刪除」。

  4. 輸入執行個體名稱,然後按一下「刪除」,確認要刪除執行個體。

後續步驟

  • 瞭解參數化安全檢視區塊

  • 瞭解如何使用參數化安全檢視區塊