【问题标题】:Locking down Public Group Role in PostgreSQL在 PostgreSQL 中锁定公共组角色
【发布时间】:2013-12-23 04:07:21
【问题描述】:

根据我一直在阅读的有关权限的信息,我了解到最好在将任何权限分配给角色之前撤消权限。 我有一个名为 appuser 的用户,我做了以下操作:

REVOKE ALL PRIVILEGES ON SCHEMA PUBLIC FROM GROUP PUBLIC;

GRANT SELECT
  ON public.table1 TO appuser;

GRANT SELECT
  ON public.table1_id_seq TO appuser;

GRANT SELECT
  ON public.table2 TO appuser;

GRANT SELECT
  ON public.table2_id_seq TO appuser;

我这样做是希望自动删除附加到任何新添加的用户的任何特权,这是公共角色成员资格的一部分。相反,我收到了一个错误,即 appuser 没有对架构的权限。然而,这是我对这个错误的误解。 1. PgAdminIII 在此架构的组角色下不显示公共角色 2. appuser 似乎不是名为 public 的组的成员(因为它不存在于界面中)。 3. appuser 的权限被明确授予,即使它是公共角色的一部分

那么...是否存在某种名为“Public”的隐式组角色会影响该用户的权限?我不明白发生了什么事。我还尝试从 pgAdminIII 命令行中找出在哪里显示组角色成员资格,但那里也没有运气。顺便说一句,我只是颠倒了第一个命令(即 GRANT ALL PRIVILEGES ON SCHEMA PUBLIC TO GROUP PUBLIC);然而,这基本上取消了我最初尝试做的事情(即简单地锁定表格)。

有什么想法吗?

更新:我有预感,我发现了问题所在。我认为 appuser 没有架构的权限。如果我没记错的话,必须先授予架构权限,然后才能访问架构下的任何对象。

【问题讨论】:

  • 如果错误表明角色没有架构的权限,为什么您没有授予 appuser 架构上的权限?毕竟,您为所有人撤销了它们,并且不给任何人。
  • 你需要显示你正在执行的确切命令和你得到的确切错误,而不是对它们的叙述性解释。
  • @Milen - 我认为你一针见血。什么是额头拍打。我要测试一下这个上午
  • @Peter - 在我发布这个之后,我实际上正在寻找命令。由于这是我继承的迁移过程,我仍在学习所有部分的位置。我会在做更多研究后发布更新。

标签: postgresql permissions database-administration


【解决方案1】:

好的,所以这里的答案有点复杂,为什么事情会以它们的方式运行,可能值得在某种程度上讨论 PostgreSQL 安全模型。

PUBLIC 不是角色或组,而是保留字。权限的工作方式是授予当前继承角色或PUBLIC 的访问权限。实际上,我过去在构建包装 PostgreSQL 角色的框架时就被这个问题困扰了。

总的来说,我的观点是你想做如下:

  1. 不要让所有人都登录数据库。

    REVOKE CONNECT ON DATABASE mydb FROM public;
    
  2. 可能也想撤销对公共架构和表的访问权限。

  3. 我认为您所做的是其他事情,即从架构中撤消权限(但不是架构中的表!),因此保留 PUBLIC 访问权限以获得对该架构中表的默认权限。这可能是也可能不是您想要的。无论如何,您发现您需要向架构添加回权限才能回到您所在的位置。

现在我不完全确定您要在这里做什么。如果你想完全锁定你的数据库,你也需要对所有表做同样的事情。否则,如果您:

 CREATE USER foo;
 GRANT USAGE ON SCHEMA PUBLIC TO foo;

然后 foo 将有权访问 PUBLIC 对表的所有权限。

【讨论】:

    猜你喜欢
    • 2012-08-15
    • 2010-09-29
    • 2018-05-13
    • 2018-10-12
    • 1970-01-01
    • 2021-04-18
    • 1970-01-01
    • 2011-10-19
    • 2018-11-25
    相关资源
    最近更新 更多