web-dev-qa-db-ja.com

Postgresqlのすべてのデータベースに対する読み取り専用権限を持つユーザーを作成するにはどうすればよいですか?

すべてのデータベースのすべてのテーブルに対して、select権限のみを持つユーザーを作成したい。データベースのリストを取得して、データベースごとに次のコマンドを適用できると思いました。

GRANT select ON DATABASE dbname to user1;

しかし、私は次のエラーを受け取りました:

ERROR:  invalid privilege type SELECT for database

私がグーグルで言うとき、人々はgrant selectすべてのテーブルの操作。しかし、新しいテーブルは常に追加されています。したがって、これは私にとって許容できる解決策ではありません。誰かが回避策を知っていますか?

21
Alptugay

これはデータベースレベルでは実行できず、スキーマレベルでのみ実行できます。

各データベースでpublicスキーマのみを使用していると仮定すると、これを行うことができます:

GRANT SELECT ON ALL TABLES IN SCHEMA public TO user1;
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO user;
23

2つのことを行う必要があります。まず、既存のオブジェクトへのアクセスを許可します。次に、これから作成される新しいオブジェクトのデフォルトアクセスを設定します。

「TABLES」へのアクセスの許可にはビューは含まれますが、シーケンス(「SERIAL」列の自動インクリメント関数など)は含まれないため、おそらくそれらへのアクセスも許可する必要があることに注意してください。

以下では、publicスキーマですべてを実行することを想定しています。 ALTER DEFAULT PRIVILEGESステートメントは、IN SCHEMA ...句を省略してデータベース全体を操作できます。 GRANTは、スキーマごとに1回実行する必要があります。

-- Grant access to current tables and views
GRANT SELECT ON ALL TABLES IN SCHEMA public TO user1;
-- Now make sure that's also available on new tables and views by default
ALTER DEFAULT PRIVILEGES
    IN SCHEMA public -- omit this line to make a default across all schemas
    GRANT SELECT
ON TABLES 
TO user1;

-- Now do the same for sequences
GRANT SELECT, USAGE ON ALL SEQUENCES IN SCHEMA public TO user1;
ALTER DEFAULT PRIVILEGES
    IN SCHEMA public -- omit this line to make a default across all schemas
    GRANT SELECT, USAGE
ON SEQUENCES 
TO user1;

PostgreSQLマニュアル

24
IMSoP

これは受け入れられる答えではないとすでにおっしゃっていたと思いますが、とにかく正しい答えです。

セキュリティ(GRANTおよびREVOKE)の指定は、テーブルの設計とテストの一部です。

テーブル定義、セキュリティ、テスト、およびテストデータがバージョン管理される前に、テーブルを本番環境に移動しないでください。

そうは言っても、PostgreSQLにはデータベースに対するSELECTパーミッションはありません。データベースに対するCREATE、CONNECT、またはTEMP権限のみを付与できます。

特定のスキーマのすべてのテーブルにSELECTを付与できます。それがGRANTステートメントの実行後に作成されたテーブルにどのように影響するかはわかりませんが、テストはかなり簡単です。

PostgreSQL Grant構文

9.0より前のバージョンのPostgresの場合:

psql -d DBNAME -qAt -c "SELECT 'GRANT SELECT ON ' || tablename || ' TO USER;' 
FROM pg_tables WHERE schemaname = 'public'" | psql -d DBNAME

psql -d DBNAME -qAt -c "SELECT 'GRANT SELECT ON ' || viewname || ' TO USER;' 
FROM pg_views WHERE schemaname = 'public'" | psql -d DBNAME

psql -d DBNAME -qAt -c "SELECT 'GRANT SELECT ON ' || relname || ' TO USER;' 
FROM pg_statio_all_sequences WHERE schemaname = 'public'" | psql -d DBNAME
3
Vishnu Kumar