postgresql - 锁定 PostgreSQL 中的公共(public)组角色

标签 postgresql permissions database-administration

根据我阅读的有关权限的信息,我了解到在将任何权限分配给角色之前撤销权限是很好的做法。 我正在与 1 位名为 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;

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

那么...是否有某种名为“公共(public)”的隐式组角色正在影响该用户的权限?我不明白发生了什么事。我还尝试找出从 pgAdminIII 命令行显示组角色成员资格的位置,但也没有成功。顺便说一句,为了修复它,我只是反转了第一个命令(即将 SCHEMA PUBLIC 上的所有权限授予 GROUP PUBLIC);然而,这基本上撤销了我最初想做的事情(即简单地锁定表格)。

有什么想法吗?

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

最佳答案

好吧,这里的答案有点复杂,为什么事情会这样,在某种程度上可能值得讨论 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 对表拥有的所有权限。

关于postgresql - 锁定 PostgreSQL 中的公共(public)组角色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20413183/

相关文章:

android - 在 Android 6 中,用户 10632 和当前进程都没有 android.permission.READ_PHONE_STATE 错误

postgresql - 使用 Postgres 多模式有多安全?

SQL Server 数据类型更改

sql - 按 ts_rank_cd 排序时,PostgreSQL 全文搜索性能 Not Acceptable

regex - 在postgresql中按模式查找重复值

python - 填充 Postgres 数据库时为 "stdin is not a tty"

oracle - 在 CentOS 8 上安装 Oracle Database 19c - oraInstall<timestamp>.out(权限被拒绝)

sql - 如何指定要从联接结果中选择的列

permissions - 应用程序无法使用 Vagrant 创建可写文件夹

mysql - 如何借助 group by 子句在一个查询中获取两个不同表的不同行数