web-dev-qa-db-ja.com

ロールのpostgresデータベースへのアクセスを取り消す

一部の保存された関数のみを実行する必要がある特定のユーザー用に、個別のロール「newrole」と新しいスキーマ「newschema」を作成しました。現在のデータベースのスキーマ「public」へのアクセスを取り消すことができました。

「newrole」としてログインしましたが、次のようにpostgresデータベースにアクセスできます。

SELECT * FROM pg_user

Postgresデータベースへのすべてのアクセスを取り消したいのですが、次のように動作しません。

REVOKE ALL ON DATABASE postgres FROM newrole

Newroleとしてログインしても、postgresデータベースを読み取ることができます。

Postgres adminデータベースへのアクセスを取り消すにはどうすればよいですか?

長い間検索しましたが、postgresadminデータベースへのアクセスに関して何も見つかりませんでした。

TIA、

6
sibert

この問題は、データベースpostgresとは何の関係もありません。代わりに、現在のデータベースのcatalogを操作する必要があります。すべてのデータベースには、スキーマpg_catalogのすべてのオブジェクトに関する情報のカタログがあり、スキーマinformation_schemaの標準に準拠した形式であるため、問題のロールとpublicロールのオブジェクトへのアクセスを制限する必要があります。すべての役割がその役割のメンバーでもあるため:

REVOKE ALL PRIVILEGES ON SCHEMA pg_catalog FROM newrole;
REVOKE ALL PRIVILEGES ON SCHEMA pg_catalog FROM public;
REVOKE ALL PRIVILEGES ON SCHEMA information_schema FROM newrole;
REVOKE ALL PRIVILEGES ON SCHEMA information_schema FROM public;

ただし、システムはこの全面的な制限を常に尊重しているわけではありません。カタログは理由があって存在し、データベースに重要な機能を提供します。特に機能はまだ実行されるかもしれません。

一般に、自分が何をしているのかを本当に知っているでない限り、カタログをいじりたくないでしょう。

7
Patrick

これを実行できるはずです:

select *  FROM information_schema.table_privileges where grantee = 'newrole';

newroleのすべての特権を表示します。その情報を使用すると、「newschema」へのアクセス以外のすべてを明示的に取り消すことができるはずです。

3
scottjustin5000