PostgreSQLのバックアップ用に読み取り専用ユーザーを作成するにはどうすればよいですか?


15

PostgreSQLで読み取り専用のバックアップユーザーを作成することは不可能ですか?

IRCチャンネルで、所有権のないバックアップのみのユーザーを作成することはできないとアドバイスを受けました。私はそれが非常に奇妙だと思うので、何かを見逃していないことを確認したいと思います。

以下は私が試したものですが、探している結果が得られません。私がpg_dump与えられたテーブルで行うとき、私は得ていPermission denied for relation...ます:

GRANT SELECT ON ALL TABLES IN SCHEMA public TO backup; 
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO backup; 
GRANT SELECT, USAGE ON ALL SEQUENCES IN SCHEMA public TO backup;
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT, USAGE ON SEQUENCES TO backup;

どんな助けも大歓迎です!


回答:


9

いいえ、簡単です(とにかく)。

  1. 新しいユーザーに接続権限を付与します

    GRANT CONNECT ON DATABASE mydb TO myReadolyUser;
  2. 現在のすべてのデータベースオブジェクトに対する権限を付与します。これはスキーマ固有であり、ユーザーが使用するスキーマごとに1つのコピーを実行する必要があります。

    GRANT SELECT ON ALL TABLES IN SCHEMA mySchema TO myReadonlyUser;

    ドキュメントALL TABLESあなたがしたいと思うすべてが含まれています。

    1つ以上のスキーマ内の同じタイプのすべてのオブジェクトに特権を付与するオプションもあります。この機能は現在、テーブル、シーケンス、および関数でのみサポートされています(ただし、すべてのテーブルにはビューと外部テーブルが含まれていると見なされることに注意してください

  3. 次にALTER DEFAULT PRIVLEGES、まだ作成されていないオブジェクトの将来の SELECT特権を付与します。

    ALTER DEFAULT PRIVILEGES IN SCHEMA mySchema
    GRANT SELECT ON TABLES TO myReadonlyUser;

実行ALTER DEFAULT PRIVILEGES ... myReadonlyUserすると、ダンプに2行追加されることに気付きましたALTER DEFAULT PRIVILEGES FOR ROLE root IN SCHEMA public REVOKE ALL ON TABLES FROM PUBLIC; ALTER DEFAULT PRIVILEGES FOR ROLE root IN SCHEMA public REVOKE ALL ON TABLES FROM root;。このような音は、rootが新しいテーブルで何もできないことを意味します。これは本当ですか?
dthor

また、テーブルでbigint読み取り専用ユーザーを使用する場合も必要になる可能性が高いGRANT SELECT ON ALL SEQUENCES
-dthor

6

シンプルで便利な方法は、読み取り専用権限を持つスーパーユーザーを作成することです。

  • psqlpostgresまたは他のスーパーユーザーとしてログインします。
  • 新しいスーパーユーザーロールを作成し、読み取り専用に設定します。

    CREATE USER backadm SUPERUSER  password '<PASS>';
    ALTER USER backadm set default_transaction_read_only = on;
    • 交換 <PASS>選択したパスワードにます。
    • backadm選択したユーザー名で置き換えることができます。(私backadmBackup Administrator)。
    • パスワードの単一引用符を忘れないでください。

これで、このロールを使用してバックアップできます。


6
Ewww。バックアップするスーパーユーザーですか?彼は特に読み取り専用を要求しました。そのユーザーは、データベースへの無制限のアクセス権を持っていないSET SESSION CHARACTERISTICS AS TRANSACTION READ WRITEか、またはALTER USER backadm set default_transaction_read_only = off;離れています。
エヴァンキャロル

このユーザーは、トランザクションが読み取り専用であっても、テーブル/スキーマ/データベースを削除できます。
イゴールムヒン

4

@Gyre回答で参照されているブログは、「アプリケーション」読み取り専用ユーザーの作成(つまり、データベースに接続するWebアプリケーションの読み取り専用ロールの作成)では機能せず、深刻な問題を引き起こす可能性がありますこのpostgresqlリスト応答で説明さているよう、簡単に回避できるため、セキュリティの脆弱性。参照用に、セッション設定をオーバーライドするクライアントによる:

SET SESSION CHARACTERISTICS AS TRANSACTION READ WRITE

質問に投稿されたものと同様のより詳細な方法については、postgres wikiにリンクされている「postgresqlでの権利の管理」プレゼンテーションを参照してください。


これは本当に答えではなく、コメントとしてコピーした、安全でないことに対する他の答えに対する批判です。私は今、この質問に適切に答えました。
エヴァンキャロル

3

Evan Carollのソリューションでバックアップをテストした後、このエラーに遭遇しました。

エラー:リレーション 'table'の許可が拒否されました

他に1つの許可がありません:

GRANT SELECT ON ALL SEQUENCES IN SCHEMA mySchema TO myReadonlyUser

このアクセス許可を追加すると、読み取り専用ユーザーでバックアップできるようになりました。


2

私はいくつかの適切な研究を行ってきましたが、その解決策があるようです。私は、このブログ投稿に出くわして、何をする必要があるかを完全に説明しています。これが私と同じ答えを探している人々に役立つことを願っています。明らかに-この方法で行われたバックアップの復元は別の質問です。


単にブログ投稿にリンクするのではなく、ブログ投稿がリンク腐敗に苦しむ場合に回答に詳細を追加する必要があります(en.wikipedia.org/wiki/Link_rotを参照)
Max Vernon 14

ブログ投稿の基本的な考え方はALTER USER set default_transaction_read_only = on;であり、これはユーザーによる変更を妨げません。
ブルー化された

Ewww。バックアップするスーパーユーザーですか?彼は特に読み取り専用を要求しました。そのユーザーは、1つのSET SESSION CHARACTERISTICS AS TRANSACTION READ WRITEまたはALTER USER backadm set default_transaction_read_only = off; データベースへの無制限のアクセスを避けます。
エヴァンキャロル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.