Postgresql数据库超级用户

4

我正在尝试保护由多个模式组成的数据库,如下所示:

-public
-foo
-bar
-foobar

我想创建一个用户,该用户可以阅读任意模式,可以在bar中创建表格,在foo、bar和foobar中进行插入/更新/删除操作。
我希望将用户创建为数据库超级用户,然后根据需要撤销权限。
我的想法是:
CREATE USER test_superuser;
GRANT ALL on DATABASE test to test_superuser;

虽然执行这些命令后,test_superuser无法访问模式,但我仍希望创建一个用户,该用户具有与postgres超级用户相同的权限,但仅限于指定的数据库。

3个回答

4

结果证明,要实现这个目标需要进行大量的调整:-

     CREATE ROLE test_database_superuser
     NOSUPERUSER INHERIT NOCREATEDB NOCREATEROLE NOREPLICATION VALID UNTIL '2020-03-06 00:00:00';


    CREATE ROLE test_user LOGIN
      ENCRYPTED PASSWORD 'md52b250919b406b707999fffb2b9f673fb'
      NOSUPERUSER INHERIT NOCREATEDB NOCREATEROLE NOREPLICATION VALID UNTIL '2020-03-06 00:00:00';

    GRANT test_database_superuser TO test_user;

    --DATABASE LEVEL PRIVELEGES
    GRANT ALL PRIVILEGES ON DATABASE test to test_database_superuser;

    --SCHEMA LEVEL
    GRANT ALL ON SCHEMA bar TO GROUP test_database_superuser;
    GRANT USAGE ON SCHEMA foo TO GROUP test_database_superuser;
    GRANT USAGE ON SCHEMA foobar TO GROUP test_database_superuser;

    GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA foo TO GROUP test_database_superuser;
    GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA foo TO GROUP test_database_superuser;

    GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA bar TO GROUP test_database_superuser;
    GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA bar TO GROUP test_database_superuser;

    GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA foobar TO GROUP test_database_superuser;
    GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA foobar TO GROUP test_database_superuser;


    --PUBLIC
    GRANT USAGE ON SCHEMA public TO GROUP test_database_superuser;

在 GRANT ALL ON SCHEMA 之后,为什么需要在模式 BAR 中授予表/序列的 ALL PRIVILEGES 权限? - Andrew Wolfe

1

允许使用模式

GRANT { { CREATE | USAGE } [,...] | ALL [ PRIVILEGES ] }
    ON SCHEMA schema_name [, ...]
    TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ]

类似这样的:

 GRANT USAGE ON SCHEMA your_schame TO test_superuser;

顺便说一下,这不是“超级用户”,只是一个拥有很多权限的普通用户...

数据库中有很多模式,难道真的不能在数据库层面上完成吗? - user1331131

0
这是一个例子:
$ sudo su - postgres
postgres@derrick:~$ createuser -P
Enter name of role to add: web_app
Enter password for new role: 
Enter it again: 
Shall the new role be a superuser? (y/n) n
Shall the new role be allowed to create databases? (y/n) n
Shall the new role be allowed to create more new roles? (y/n) n
postgres@derrick:~$

postgres@derrick:~$ createdb --owner web_app dbTest
postgres@derrick:~$ logout

这并没有回答上述特定权限的要求,它只是将所有权交给了用户web_app。 - user1331131
回想起来,你是正确的。我确实有一个问题,如果你有时间的话。这样一个复杂的设置的情况是什么?数据库是通过网络访问的吗? - diek
这是为一个 Web 应用程序。我总是提供最低所需的访问权限,而不是最大值,这些要求代表基本设置。 - user1331131

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接