Postgresql

如何防止登錄在 PostgreSQL 中“列出”表或視圖定義?

  • June 26, 2017

有沒有辦法阻止登錄列出架構中的表和列?

我必須授予對遠端登錄的訪問權限才能在單個視圖上進行查詢;但是,我還必須確保這樣的登錄不能列出該架構上的每個對象。

DENY VIEW ANY DEFINITION TO public;PostgreSQL 上有類似 MS SQL SERVER 的東西嗎?

救援文件

UPDATE

$$ … $$ 對於模式,允許訪問包含在指定模式中的對象(假設也滿足對象自身的權限要求)。本質上,這允許被授權者在模式中“查找”對象。如果沒有此權限,仍然可以查看對象名稱,例如通過查詢系統表。此外,在撤銷此權限後,現有後端可能具有先前執行此查找的語句,因此這不是防止對象訪問的完全安全的方法。

這意味著,除非alice足夠努力,否則以下內容將滿足您的要求:

CREATE SCHEMA invisible; -- no privileges granted on this schema to alice or public

CREATE VIEW invisible.iamnothere AS SELECT 'something not very interesting'::text AS data;

GRANT SELECT ON TABLE invisible.iamnothere TO alice;

現在alice將看到以下內容(使用psql,希望在其他客戶端中也一樣):

SELECT * FROM invisible.iamnothere;
             data              
────────────────────────────────
something not very interesting

\dt invisible.*
No matching relations found.

如果你是認真的

…關於防止您的使用者看到其他對象,它會稍微複雜一些。您必須處理文件中有關係統表訪問的通知。

首先,做

REVOKE ALL ON ALL TABLES IN SCHEMA  pg_catalog FROM public, alice;

正如它所暗示的那樣,這對於能夠通過隱式成為成員public(所有角色都是後者的成員)來瀏覽模式的任何人都可能是破壞性的。要恢復他們的現狀(但不是alice),您可以執行以下操作:

CREATE ROLE object_browser;

GRANT SELECT ON ALL TABLES IN SCHEMA pg_catalog TO object_browser;

GRANT object_browser TO bob;

在此之後,bob將能夠列出東西,而差alice則僅限於查詢單個視圖。

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