Postgresql
Postgres RLS:如何出錯而不是忽略與策略不匹配的行?
在 postgres 中創建策略 (CREATE POLICY) 時,可以指定表達式以在發出 SELECT 查詢時過濾掉一些行:
CREATE POLICY ... USING ( using_expression ) ...
也可以指定一個單獨的表達式,該表達式在評估為 false 時觸發錯誤,但僅適用於 INSERT/UPDATE -
WITH CHECK ( check_expression )
。我希望選擇具有相同的行為 - 如果選擇查詢嘗試訪問根據某些表達式應該無法訪問的行,是否有辦法觸發錯誤?
我問的原因是我正在考慮使用 RLS 作為訪問控制的附加和冗餘層,而第一個將在應用程序邏輯中。這樣做的問題是很難在應用程序邏輯中找到問題,這在某種程度上違背了目的:
- 如果 RLS 配置錯誤並且錯誤地允許某些記錄通過它,應用程序層將擷取它並觸發錯誤 - 該問題很容易檢測到。
- 但是,如果應用程序層有錯誤並且錯誤地授予對記錄的訪問權限,則它根本不可見 - RLS 會神奇地將它們過濾掉,直到有人錯誤配置 RLS 並且數據洩漏。
有沒有辦法配置 postgres,如果查詢嘗試讀取它不應該讀取的行,它會出錯?特別是,它可能是一種確保所有程式碼路徑實際上都實施了適當的訪問控制檢查的方法。
RLS 無法對不可訪問內容的訪問做出反應。拋出錯誤會暴露不可訪問對象的存在,這是一個容易受到猜測攻擊的資訊洩露漏洞。日誌記錄稍微少一些,儘管如果日誌文件元數據是可見的,那麼類似的攻擊是可能的。
對於出於開發目的審計訪問,觸發器是最靈活的。pgaudit擴展可以在這裡提供幫助。