如何为 PostgreSQL 中的备份创建只读用户?

mil*_*dos 23 backup permissions postgresql-9.1

在 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;
Run Code Online (Sandbox Code Playgroud)

任何帮助将不胜感激!

Eva*_*oll 16

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

  1. 授予新用户连接权限

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

    GRANT SELECT ON ALL TABLES IN SCHEMA mySchema TO myReadonlyUser;
    
    Run Code Online (Sandbox Code Playgroud)

    docsALL TABLES包括你想要的一切。

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

  3. 然后ALTER DEFAULT PRIVLEGES为尚未创建的对象授予未来的 SELECT权限。

    ALTER DEFAULT PRIVILEGES IN SCHEMA mySchema
    GRANT SELECT ON TABLES TO myReadonlyUser;
    
    Run Code Online (Sandbox Code Playgroud)

  • 另外,如果您的表使用“bigint”,您的只读用户可能还需要“GRANT SELECT ON ALL SEQUENCES” (2认同)

Rém*_* B. 9

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

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

    CREATE USER backadm SUPERUSER  password '<PASS>';
    ALTER USER backadm set default_transaction_read_only = on;
    
    Run Code Online (Sandbox Code Playgroud)
    • 替换<PASS>为您选择的密码。
    • 您可以替换backadm为选择的用户名。(我backadmBackup Administrator)。
    • 不要忘记密码的单引号。

您现在可以使用此角色进行备份。

  • 嗯。要备份的超级用户?他特别要求只读。该用户是一个`SET SESSION CHARACTERISTICS AS TRANSACTION READ WRITE`或`ALTER USER backadm set default_transaction_read_only = off;`远离对数据库的无限制访问。 (10认同)

小智 7

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

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

缺少另一个权限:

GRANT SELECT ON ALL SEQUENCES IN SCHEMA mySchema TO myReadonlyUser
Run Code Online (Sandbox Code Playgroud)

添加此权限使我能够使用我的只读用户进行备份。


小智 6

请注意@Gyre 给出答案中引用的博客不适用于创建“应用程序”只读用户(即,用于为 Web 应用程序创建只读角色以连接到数据库),并且可能会打开一个严重的安全漏洞,因为它很容易规避,正如在这个 postgresql list response 中解释的那样。作为参考,由客户端覆盖会话设置:

SET SESSION CHARACTERISTICS AS TRANSACTION READ WRITE
Run Code Online (Sandbox Code Playgroud)

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


小智 5

如果您想要(或可以接受)备份用户对所有数据库具有只读访问权限,则可以使用自 Postgres 14 发布以来的pg_read_all_data角色。

您可以通过运行以下命令来创建具有读取所有内容的权限的新用户:

CREATE ROLE backup WITH ROLE pg_read_all_data LOGIN PASSWORD '<password>';
Run Code Online (Sandbox Code Playgroud)


mil*_*dos 3

我做了一些适当的研究,似乎确实有一个解决方案。我看到这篇博文,它完美地解释了需要做什么。我希望这对正在寻找与我相同答案的人有所帮助。显然 - 以这种方式恢复备份是一个不同的问题。

  • 呃。超级用户来备份?他特别要求只读。该用户是一个 SET SESSION CHARACTERISTICS AS TRANSACTION READ WRITE 或 ALTER USER backadm set default_transaction_read_only = off; 远离对数据库的无限制访问。 (2认同)