極其安全的 Postgres 表權限
假設我的 Postgres 數據庫中有四個表,其中兩個是私有的並且包含高度敏感的資訊(
private1
和private2
),另外兩個包含我希望世界上任何人都能夠任意查詢的資訊(public1
和public2
)。我知道這是一個非常糟糕的設計,但請耐心等待。我想設置一個只能
SELECT
在兩個公共表上執行 s 的使用者,但不能對其他兩個表(或更一般的數據庫)進行遠端惡意操作。我天真的方法是做一些事情,比如設置一個新使用者
public_querier
,執行 aREVOKE ALL ON private1, private2, public1, public2 FROM public_querier;
然後 aGRANT SELECT ON public1, public2 TO public_querier;
。我懷疑這不能滿足我的安全要求,因為我不知道一些微妙之處,我非常感謝(1)如果我的懷疑是真的,並且(2)任何可以幫助指導我的參考資料如果我的懷疑是錯誤的,那麼正確的方向。
乾杯!
因此,您希望某些使用者能夠只查詢您的兩個表,而其他使用者能夠查詢所有四個?
基於角色的權限模型完全符合該要求。
create role public_data_role ; grant select on public1 to public_data_role ; grant select on public2 to public_data_role ; create role private_data_role ; grant select on private1 to private_data_role ; grant select on private2 to private_data_role ; grant public_data_role to fred, wilma, barney, betty ; grant private_data_role to fred, wilma ;
當然,您首先必須從公共中刪除這些權限的任何和所有權限- 這勝過所有其他授予的權限,並且很難嘗試解決。擦乾淨石板並建立越來越“開放”的權限以實現您的目標。
我知道這是一個非常糟糕的設計,但請耐心等待。
我不同意。我看不出這有什麼問題。
一個數據庫可能包含數千個表。使用者將幸福地不知道其中的許多(或大多數)。
pg_catalog
一個問題是無法隱藏架構中私有表的基本元數據。尤其:
pg_class
(表列表)pg_attribute
(列列表)但是
pg_stats
沒有讀取權限的表的內容不可用(否則可能會洩露一些數據)。一般來說,權限系統旨在實現您想要的,但大多數 DBA 不會對僅在不受信任的讀取器和敏感數據之間的隔離層感到滿意。