如何在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;

任何帮助将不胜感激!


Answers:


9

不,这很容易(现在无论如何)。

  1. 向新用户授予连接权限

    GRANT CONNECT ON DATABASE mydb TO myReadolyUser;
  2. 授予对所有当前数据库对象的权限。这是特定于架构的,您必须为希望用户使用的每个架构运行一个副本,

    GRANT SELECT ON ALL TABLES IN SCHEMA mySchema TO myReadonlyUser;

    该文档ALL TABLES包括你想要的一切。

    还有一个选项可以授予一个或多个模式中所有相同类型对象的特权。当前仅表,序列和函数支持此功能(但请注意,所有表均被视为包括视图和外部表。

  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 19'Mar 11'19

6

一种简单而又不错的方法是创建一个具有只读权限的超级用户。

  • 登录psql在Postgres或其他超级用户。
  • 创建新的超级用户角色并将其设置为只读:

    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 WRITEALTER USER backadm set default_transaction_read_only = off;不必数据库不受限制的访问了。
埃文·卡罗尔

无论事务是只读的,该用户仍将能够删除表/方案/数据库。
伊戈尔·穆欣

4

请注意,@ Gyre给出答案中引用的博客不适用于创建“应用程序”只读用户(即,用于为Web应用程序创建只读角色以连接到数据库),并且可能会打开安全漏洞,因为它很容易避免,如本postgresql list response中所述。供客户端覆盖会话设置以供参考:

SET SESSION CHARACTERISTICS AS TRANSACTION READ WRITE

有关更详细的方法,请参阅postgres Wiki中链接的“在Postgresql中管理权限”演示文稿,该方法类似于问题中发布的方法。


这不是一个真正的答案,它是对其他不安全答案的批评,我已将其复制为评论。我已经正确回答了这个问题。
埃文·卡罗尔

3

在使用Evan Caroll的解决方案进行测试后,我遇到了此错误:

错误:关系“表”的权限被拒绝

缺少另一个权限:

GRANT SELECT ON ALL SEQUENCES IN SCHEMA mySchema TO myReadonlyUser

添加此许可权使我可以与只读用户进行备份。


2

我已经做了一些适当的研究,并且确实可以找到解决方案。我看过这篇博客文章,该文章完美地解释了需要做的事情。我希望这对寻求与我相同答案的人们有所帮助。显然,以这种方式还原备份是一个不同的问题。


而不是简单地链接到博客文章,你应该在案件的一些细节添加到您的答案从链接腐博客文章遭罪(见en.wikipedia.org/wiki/Link_rot
最大弗农

博客文章的基本思想是ALTER USER set default_transaction_read_only = on;,这并不妨碍用户对其进行更改。
2015年

Ewww。要备份的超级用户?他特别要求只读。该用户是一个SET SESSION CHARACTERISTICS AS TRANSACTION READ WRITE或ALTER USER backadm set default_transaction_read_only = off; 可以不受限制地访问数据库。
埃文·卡罗尔
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.