1

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

我们必须解决这个问题才能拥有角色,这样我们才能拥有read-write,readonlyadmin角色。我们不希望我们的 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;
4

1 回答 1

2

有几点需要考虑。

说明 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 ...

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

我们通常让 db owner 成为一个额外的角色;仅登录以创建或更改架构,然后优雅地退出的人。如果您admin_role做的不止这些,请考虑添加一个owner_role.

公共角色是否需要联系?

考虑添加

 REVOKE CONNECT ON DATABASE yourdb FROM public;

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

在事务块中完成所有这些

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

于 2020-01-21T00:36:59.440 回答