【问题标题】:Revoking access to database does not seem to work撤销对数据库的访问似乎不起作用
【发布时间】:2015-09-14 23:26:23
【问题描述】:

我负责一门大学课程的 PostgreSQL 数据库,该课程有 23 个用户和 23 个数据库。每个用户应该只能访问一个数据库,如果他们尝试连接到不同的数据库,他们应该会被拒绝访问。 我已经有一个工作集,但我们必须格式化服务器。现在我正在尝试做同样的事情,但每个用户都可以访问彼此的数据库。我已经试过了:

REVOKE connect ON DATABASE group1 FROM PUBLIC;
REVOKE ALL PRIVILEGES ON DATABASE group1 FROM PUBLIC;
REVOKE ALL PRIVILEGES ON DATABASE group1 FROM group3;

我仍然可以通过任何方式连接到 group1 数据库:

psql -d group1

\c group1

我怎样才能阻止这种情况发生?

编辑:我使用的是 PostgreSQL 9.3.9。 我所做的是以 root 身份登录,然后通过以下方式将用户更改为 group3:

sudo su -
su group3
psql
Enter password:
\c group1
You are now connected to database "group1" as user "group3".

【问题讨论】:

  • “你”是谁?如果您以超级用户身份连接,您总是 可以访问。 (并且总是提到你的 Postgres 版本。)
  • 请显示\l+ group1\du+ group3输出

标签: sql database postgresql ubuntu privileges


【解决方案1】:

到目前为止,我们所看到的无法解释发生了什么。

如果您的用户 group3 已被授予其他角色(是其他角色中的成员),并且其中一个角色(递归!)具有可以解释它的访问权限:

SELECT r0.rolname AS parent, r1.rolname AS member
FROM   pg_roles r0
JOIN   pg_auth_members m ON m.roleid = r0.oid
JOIN   pg_roles r1 ON r1.oid = m.member
WHERE  r1.rolname = 'group3';

或者如果group3 拥有超级用户权限:

SELECT rolname, rolsuper
FROM   pg_roles
WHERE  rolname = 'group3';

【讨论】:

  • 我在 .sh 文件中发现了创建用户的故障。当它应该是 -S 时,它使用带有 -s 的 createuser,因此它们不是超级用户。您的第二个查询发现了故障。
  • @CristianEduardoLehuedeLyon:由于-S is the default for createuser,您可能会完全放弃该选项以避免混淆。
【解决方案2】:

这个:

REVOKE ALL PRIVILEGES ON DATABASE group1 FROM PUBLIC;

应该足够了,除非您将group3 创建为超级用户。

【讨论】:

    猜你喜欢
    • 2022-01-07
    • 2016-07-13
    • 1970-01-01
    • 2018-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-20
    • 1970-01-01
    相关资源
    最近更新 更多