【问题标题】:How to create user(read-write & readonly) and admin roles for an existing postgres database?如何为现有的 postgres 数据库创建用户(读写和只读)和管理员角色?
【发布时间】:2020-05-06 17:58:16
【问题描述】:

我们有一个现有的postgres 数据库正在生产中,超级用户adm 用于执行所有操作。我们的 Web 应用程序使用相同的用户连接到数据库,并且管理员(用于修补/更新等)使用相同的凭据。

我们必须解决这个问题才能拥有角色,这样我们才能拥有read-writereadonlyadmin 角色。 我们不希望我们的 Web 应用程序和管理员以 superuser 的身份连接到数据库。

话虽如此,我已经创建了以下 sql 脚本来制作适当的角色。 我不是数据库专家(还不是)所以想知道问题或解决这个问题的更好方法。

ALTER ROLE adm NOLOGIN;

CREATE role user_role NOINHERIT;
CREATE role readonlyuser_role NOINHERIT;
CREATE role admin_role CREATEDB CREATEROLE NOINHERIT;
CREATE ROLE u_service LOGIN PASSWORD '<some password>' INHERIT;
CREATE ROLE u_admin LOGIN PASSWORD '<some password>' INHERIT;
CREATE ROLE u_reader LOGIN PASSWORD '<some password>' INHERIT;

GRANT SELECT ON ALL TABLES IN SCHEMA public TO readonlyuser_role;
GRANT ALL PRIVILEGES ON SCHEMA public TO admin_role;
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO user_role, admin_role;
GRANT ALL PRIVILEGES ON ALL FUNCTIONS IN SCHEMA public TO user_role, admin_role;
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO user_role, admin_role;
GRANT ALL PRIVILEGES ON ALL PROCEDURES IN SCHEMA public TO user_role, admin_role;
GRANT ALL PRIVILEGES ON ALL ROUTINES IN SCHEMA public TO user_role, admin_role;

GRANT ALL PRIVILEGES ON SCHEMA audit TO admin_role;
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA audit TO admin_role;
GRANT ALL PRIVILEGES ON ALL FUNCTIONS IN SCHEMA audit TO admin_role;
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA audit TO admin_role;
GRANT ALL PRIVILEGES ON ALL PROCEDURES IN SCHEMA audit TO admin_role;
GRANT ALL PRIVILEGES ON ALL ROUTINES IN SCHEMA audit TO admin_role;

GRANT admin_role TO u_admin;
GRANT user_role TO u_service;
GRANT readonlyuser_role TO u_reader;

【问题讨论】:

  • 仅供参考,这可能在姐妹网站 DBA.StackExchange.com 上问得更好
  • @BasilBourque 就是这么做的。谢谢。

标签: postgresql postgres-10


【解决方案1】:

需要考虑的一些事项。

说明 user_role 和 readonlyuser_role 可以做什么

首先从这两个角色撤消所有权限,然后仅在需要时将它们添加回来。这使您对角色应该做什么的意图更加清晰,并且在实践中更安全,因为比预期更高的权限不会意外潜入。

REVOKE ALL ON SCHEMA public FROM public;  --only authorized roles can do anything here.
REVOKE ALL ON SCHEMA public FROM user_role;
REVOKE ALL ON SCHEMA public FROM readonlyuser_role;


GRANT ...

数据库所有者是本地超级用户

我们通常让数据库所有者成为一个额外的角色;仅登录以创建或更改架构,然后优雅地退出的人。如果您的admin_role 不止于此,请考虑添加owner_role

公共角色是否需要连接?

考虑添加

 REVOKE CONNECT ON DATABASE yourdb FROM public;

这堵住了在同一数据库服务器上创建的任何角色可以登录到该数据库的漏洞。

在一个事务块中完成所有这些操作

在工作中途停止权限分配可能会导致各种麻烦,就像把钥匙锁在车里一样。尽可能将权限分配设为单个事务,这样丢失的分号就不会锁定您。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-02-21
    • 2018-07-17
    • 1970-01-01
    • 2017-02-15
    • 1970-01-01
    • 1970-01-01
    • 2017-08-10
    • 1970-01-01
    相关资源
    最近更新 更多