web-dev-qa-db-ja.com

ログインがPostgreSQLのテーブルまたはビュー定義を「一覧表示」しないようにするにはどうすればよいですか?

ログインがスキーマのテーブルと列を一覧表示しないようにする方法はありますか?

単一のビューでクエリを実行するには、リモートログインへのアクセスを許可する必要があります。ただし、そのようなログインでは、そのスキーマのすべてのオブジェクトをリストできないことも確認する必要があります。

MS SQL SERVERのようなものはありますかDENY VIEW ANY DEFINITION TO public; PostgreSQL?

7

documentation が救い出します:

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はその単一のビューのクエリに限定されます。

10
dezso