【问题标题】:PostgreSQL: making a schema restricted/unchangable?PostgreSQL:使模式受限/不可更改?
【发布时间】:2010-12-11 00:00:39
【问题描述】:

我们喜欢我们的生产环境具有受限制/不可更改的架构 - 开发方可以由开发人员拥有并根据他们的喜好进行更改 - 我们喜欢在升级时审查更改。

我想知道这是否可以解决这个问题:

postgres% create proddb with owner=postgres;

unixside% pg_restore --dbname=devdb [--schema-only] --no-owner proddb
/* grants to users on schema objects appear to remain intact */

/* here's the magic, I hope... */
postgres% revoke create on schema public from public;
postgres% grant usage on schema public to produser(s);

一些测试似乎表明,这个新 proddb 中的用户可以正常与表交互(通过适当的授权)并且不能更改架构(更改表、创建表、删除表等)。但是我很偏执,而且对 Postgres 很陌生,所以...

问:这样说对吗?

问:我错过了什么吗?

非常感谢。

【问题讨论】:

    标签: postgresql schema


    【解决方案1】:

    是的,没错。唯一的补充是表的所有者可以随时删除或修改它。因此,如果架构中有 现有 表,它可能不起作用。

    【讨论】:

    • 明白。如果我做对了,生产中的表就不应该有所有者:从一开始,一切都应该归 postgres 所有。谢谢。
    【解决方案2】:

    发现了一个缺失的元素:序列。

    用户在他的脚本中发现了错误;日志中出现了类似的错误:

    ERROR:  permission denied for sequence <sequence>
    

    生产模式表明,尽管创建了序列,但它们归 postgres 所有,并且没有明确授予用户。根据 GRANT 文档:

    授予对表的权限不会自动将权限扩展到该表使用的任何序列,包括与 SERIAL 列相关的序列。序列的权限必须单独设置。

    我们的修复(本演示的详细说明)是查找所有序列:

    unixside% pg_dump --schema-only proddb > proddb.schema
    unixside% grep -i 'create sequence' proddb.schema
    

    ...并应用适当的授权(选择以防止表扫描,更新以防止上述错误):

    postgres% grant select,update on <sequence> to produser(s);
    

    到目前为止,用户说它正在工作并且日志中的错误已经停止......

    【讨论】:

      【解决方案3】:

      我忘记了 PostgreSQL 在哪个版本中添加了该语法,但在 PostgreSQL 中管理权限的最简单方法之一是通过“GRANT foo, priv ON ALL something IN SCHEMA”语法。

      BEGIN;
      GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA my_schema TO my_role;
      GRANT USAGE ON ALL SEQUENCES IN SCHEMA my_schema TO my_role;
      GRANT EXECUTE ON ALL FUNCTIONS IN SCHEMA my_schema TO my_role;
      COMMIT;
      

      确保始终正确设置权限非常方便。

      FUNCTIONS 的 EXECUTE 可能看起来很诡异,但除非您的函数是使用 SECURITY DEFINER 属性创建的(如果您使用 SECURITY DEFINER,则最好小心,因为您正在使用 PostgreSQL “setuid”函数的版本)。如果您根据预期的权限在不同的 SCHEMAS 中分隔 TABLES,那么当与 search_path 变量一起使用时,这将成为一个非常方便的约定。

      ALTER ROLE my_role SET search_path = my_schema, auth_schema, public;
      -- Avoid using the public schema (pretty please)
      

      其中 auth_schema 具有 my_role 不应具有直接读取或写入权限的表的集合。将权限分配给 GROUPS 也很有用。

      以下是一些相关文档:

      http://developer.postgresql.org/pgdocs/postgres/sql-grant.html

      不要忘记您可以在 psql 中使用“\h GRANT”来轻松找出语法或记住可以对架构中的所有对象执行的操作(搜索“IN SCHEMA”)。

      【讨论】:

      • 以下是 9.1(但不是我目前所在的 8.4)...“还有一个选项可以授予对一个或多个模式中相同类型的所有对象的权限。此功能是目前仅支持表、序列和函数(但请注意 ALL TABLES 被认为包括视图和外部表)。”不过,谢谢。
      猜你喜欢
      • 2010-11-09
      • 2016-05-25
      • 2010-12-09
      • 2017-12-09
      • 2017-11-20
      • 1970-01-01
      • 1970-01-01
      • 2010-09-16
      • 1970-01-01
      相关资源
      最近更新 更多