允许postgres用户只列出自己的数据库

Kai*_*Kai 6 postgresql

我正在使用postgresql服务器,我想禁止我的用户查看同一服务器上的其他数据库.

基本上\l应该只列出他自己的数据库.

我很确定我需要撤销用户的权利,但我无法在文档中找到它.

ara*_*nid 6

这似乎有效,但可能会产生不可预见的后果。它需要修改系统目录,这不是一个好主意!

首先,您必须允许超级用户通过将其添加到您的 postgresql 配置来更新系统目录:

allow_system_table_mods = on
Run Code Online (Sandbox Code Playgroud)

并重新启动。

现在,您可以使用 DDL 语句来修改系统目录(您应该害怕)。连接到用户数据库之一(测试数据库是个好主意)并且:

alter table pg_catalog.pg_database rename to pg_database_catalog;
create view pg_catalog.pg_database as
  select oid, 1262::oid as tableoid, pg_database_catalog.*
  from pg_catalog.pg_database_catalog
  where has_database_privilege(pg_database_catalog.oid, 'connect');    
grant select on pg_catalog.pg_database to public;
Run Code Online (Sandbox Code Playgroud)

您现在应该会发现,如果您以低权限用户身份连接到数据库,该\l命令将只列出该用户可以连接到的数据库。

问题是您现在需要猜测用户最初连接到哪个数据库来获取他们的数据库列表。如果他们最初连接到自己的数据库,那么此时您可能已经完成了。如果它们首先连接到postgrestemplate1,那么您需要在该数据库上进行此更改。

在我看来,这应该可行,因为pg_databasepostgres 后端直接通过 oid 引用目录,而不是通过名称,因此将其移开并更改其中显示的行对他们来说应该是不可见的。特别是,您不能停止服务器区分不存在的数据库和他们没有连接权限的用户。

我不会做出任何承诺,即这种改变不会把其他事情搞砸。如果它坏了,你可以保留碎片。

您可能希望在模板数据库中进行此更改,并在将来从中创建用户数据库,并allow_system_table_mods在完成后停用该设置(这需要重新启动服务器,请记住)。

另外,我在 9.0 上对此进行了测试:在我看来,它也应该适用于某些早期版本,请注意空客。