參數化安全檢視區塊總覽

本頁面說明 AlloyDB for PostgreSQL 中的參數化安全檢視區塊,這類檢視區塊會使用 SQL 檢視區塊提供應用程式資料安全性和資料列存取控管,確保應用程式使用者只能查看自己有權存取的資料。

參數化安全檢視是 PostgreSQL 安全檢視的擴充功能,可讓您在檢視定義中使用應用程式專屬的具名檢視參數。這項功能提供介面,可接受查詢和具名參數的值。介面會使用這些值執行查詢,並在查詢執行期間使用這些值。

以下是參數化安全檢視區塊的範例:

CREATE VIEW secure_checked_items WITH (security_barrier) AS
       SELECT bag_id, timestamp, location
       FROM checked_items t
       WHERE customer_id = $@app_end_userid;

您可以使用 execute_parameterized_query 預存程序查詢參數化安全檢視區,也可以執行 EXECUTE .. WITH VIEW PARAMETERS 陳述式。詳情請參閱「使用 AlloyDB 參數化安全檢視畫面管理應用程式資料安全性」。

參數化安全檢視區塊的優點

參數化安全檢視畫面非常適合在資料庫層級管理資料安全,特別是處理來自不受信任來源的臨時查詢時,例如從自然語言翻譯的查詢。這些檢視畫面提供彈性的方式,可實作精細的存取權控管機制。

舉例來說,假設有一個應用程式會追蹤顧客的託運行李。使用者 ID 為 12345 的顧客詢問「我的行李在哪裡?」在這種情況下,參數化安全檢視畫面可確保下列事項:

查詢只會傳回提交查詢的使用者可存取的資料列,例如與使用者 ID 12345 連結的資料列。

降低安全風險

當使用者在資料庫上執行不受信任的查詢 (例如自然語言查詢) 時,參數化安全檢視區塊有助於降低安全性風險。這些風險包括:

  • 惡意提示:使用者可能會嘗試操控基礎模型,存取所有應用程式資料。
  • 範圍廣泛的 SQL 查詢:大型語言模型 (LLM) 可能會生成 SQL 查詢,即使是善意的使用者查詢,也可能會洩漏敏感資料。

您可以使用參數化安全檢視區塊,限制個別應用程式使用者可用的資料列範圍。無論使用者如何措辭查詢,這項控制項都能確保資料安全。

資料存取權管理

參數化安全檢視畫面可解決管理大量使用者資料存取權時常見的挑戰。

  • 簡化使用者管理:透過參數化安全檢視畫面,您可以使用單一資料庫角色為所有使用者提供服務,不必為每位使用者建立個別的資料庫使用者或角色。參數化安全檢視畫面可簡化使用者和連線管理作業,方便應用程式為每位使用者提供專屬資料存取權。

    舉例來說,在航空公司應用程式中,客戶只能查看自己的預訂記錄,因此您可以定義單一參數化安全檢視畫面,並以使用者 ID 做為參數。這個檢視區塊可讓單一資料庫角色 (有權存取檢視區塊,但無權存取基礎資料表) 為所有使用者提供服務,簡化使用者管理和資料庫連線。

  • 簡化安全性強制執行:參數化安全檢視畫面會內建存取權控管機制。查詢檢視畫面時,系統一律會強制執行定義的安全參數,無論存取檢視畫面的使用者為何。如果沒有額外設定,基礎資料表上的基礎安全性政策可能不會自動套用至檢視區塊,這與上述方法形成對比。

如要進一步瞭解 PostgreSQL 現有的安全機制,例如資料列層級安全 (RLS) 政策,請參閱「資料列安全政策」。

安全機制

應用程式開發人員可透過參數化安全檢視區塊,使用下列方法控管資料安全性和列存取權:

  • 使用「WITH (security barrier)」選項建立的檢視畫面可提供資料列層級安全性,方法是防止惡意選擇的函式和運算子從資料列傳遞值,直到檢視畫面完成工作為止。如要進一步瞭解WITH (security barrier)條款,請參閱「規則和權限」。
  • 使用具名檢視區塊參數進行參數化,可根據應用程式層級的安全性 (例如使用者驗證),透過應用程式提供的值,對資料庫進行參數化,限制檢視範圍。
  • 對存取參數化檢視區塊的查詢強制執行額外限制,有助於應用程式執行來自使用者的不受信任查詢,例如 AI 自然語言轉 SQL 生成的查詢。這可防止逸出參數化安全檢視區塊提供的安全範圍,並管理資源用量。詳情請參閱「查詢的強制限制」。

限制

  • 您必須在每個 AlloyDB 執行個體上分別啟用參數化檢視區塊旗標。在主要執行個體上建立的參數化檢視物件,會傳播至讀取集區執行個體和跨區域副本。不過,parameterized_views.enabled 旗標設定不會自動套用,您必須在每個執行個體上手動設定。詳情請參閱「事前準備」。

    如要在讀取集區執行個體或跨區域副本上查詢參數化檢視區塊,必須先在每個執行個體上啟用 parameterized_views.enabled 旗標。

後續步驟