Postgresql

極其安全的 Postgres 表權限

  • May 21, 2021

假設我的 Postgres 數據庫中有四個表,其中兩個是私有的並且包含高度敏感的資訊(private1private2),另外兩個包含我希望世界上任何人都能夠任意查詢的資訊(public1public2)。我知道這是一個非常糟糕的設計,但請耐心等待。

我想設置一個只能SELECT在兩個公共表上執行 s 的使用者,但不能對其他兩個表(或更一般的數據庫)進行遠端惡意操作。

我天真的方法是做一些事情,比如設置一個新使用者public_querier,執行 aREVOKE ALL ON private1, private2, public1, public2 FROM public_querier;然後 a GRANT 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 不會對僅在不受信任的讀取器和敏感數據之間的隔離層感到滿意。

引用自:https://dba.stackexchange.com/questions/291964