【问题标题】:Is it possible for DEFAULT PRIVILEGES statements to be owned by another non-superuser role?DEFAULT PRIVILEGES 语句是否可以由另一个非超级用户角色拥有?
【发布时间】:2021-11-12 12:59:38
【问题描述】:

在我们试图不让任何个人员工用户拥有任何东西的环境中,我是一名偶然的 DBA。 (这样我们就可以在需要时在员工的访问权限上 DROP ROLE,而无需先研究/重新定位大量对象。)

我们也在努力确保我们可以尽可能地自动化与新创建的对象相关的访问权限。

员工拥有对 CREATE 对象的访问权限,因为他们拥有所有权角色,该角色对允许他们访问的架构具有 CREATE 权限。如果员工需要创建新对象,则 S.O.P.是在执行 CREATE 事务之前将 ROLE 设置为所有权角色,因为所有权角色设置了 DEFAULT PRIVILEGES 语句,以确保他们创建的新对象对需要不同访问级别的不同员工组具有正确的权限。

如果员工不遵守 S.O.P.并且忘记事先设置角色,他们的角色有权创建对象(因为他们是拥有角色的成员)但在他们还记得授予它们之前它不会拥有正确的权限。

解决方案似乎是为每个用户编写 DEFAULT PRIVILEGES 语句,以反映为拥有角色设置的那些。但是,我们发现即使这些默认权限是为用户角色创建的对象编写的,而在第二个管理角色中,权限本身仍然由第一个角色拥有。这违反了我们试图建立的设计。

我认为我们遇到了 Postgres 架构的基本现实;似乎我们不能同时允许员工可​​以(无意地)在他们自己的角色下创建对象允许这些对象具有默认权限的系统,除非我们愿意允许这些角色拥有默认权限。

对吗?我们是不是想把蛋糕也吃掉?


更多上下文:

我的团队中没有人可以访问数据库的超级用户权限;必须向 IT 请求超级用户下的任何内容。 (所以我们试图避免使用需要超级用户权限的系统。)

【问题讨论】:

    标签: postgresql


    【解决方案1】:

    一种解决方案是定义这样的角色:

    -- role that can create tables
    CREATE ROLE table_owner NOLOGIN;
    -- because it has the permission on the schema
    GRANT CREATE ON SCHEMA myschema TO table_owner;
    
    -- role that can do INSERT, SELECT, UPDATE, DELETE
    CREATE ROLE dml_role NOLOGIN;
    -- give it permissions
    GRANT INSERT, SELECT, UPDATE, DELETE
       ON ALL TABLES IN SCHEMA myschema TO dml_role;
    -- also for future tables
    ALTER DEFAULT PRIVILEGES FOR table_owner IN SCHEMA myschema
       GRANT INSERT, SELECT, UPDATE, DELETE ON TABLES TO dml_role;
    
    -- intermediary role that does *not* inherit privileges
    CREATE ROLE break_inherit NOLOGIN NOINHERIT IN ROLE table_owner;
    
    -- end user
    CREATE ROLE enduser LOGIN IN ROLE dml_role, break_inherit;
    

    现在enduser 不能直接在myschema 中创建表,因为它不继承自该角色。所以enduser只能先创建一个表,SET ROLE table_owner先!

    但是enduser 自动拥有使用myschema 中属于table_owner 的表的权限,因为它继承自dml_role

    如果您不喜欢SET ROLE,另一种解决方案是在每个CREATE TABLE 之后更改所有权和权限的事件触发器。

    【讨论】:

    • 有趣的是,我们确实已经在所有权和 DML 方面拥有了一个单独的角色,所以这应该不会是太大的提升。这有效地迫使用户SET ROLE 制作一个表,我对此很好,但在某些仅通过应用程序访问数据库的用户方面会有点混乱。所以听起来我们可能无法同时满足这两个要求,人们可以在自己的用户登录下创建表(没有 SET ROLE),并允许这些表在没有用户拥有默认权限的情况下拥有默认权限?
    • 每个可以创建表的用户都必须有一个ALTER DEFAULT PRIVILEGES。另一种方法是事件触发器。
    猜你喜欢
    • 2017-07-18
    • 2019-09-30
    • 2022-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-30
    相关资源
    最近更新 更多