Postgres ACL for Schemas

时间:2015-06-26 06:13:08

标签: postgresql

我不是DBA,我对模式的访问控制有一些疑问。假设我有一个运行多个数据库的Postgres服务器。管理员用户是postgres。我有另一个用户tmpUser,我可以使用pgadmin3客户端登录到远程服务器。

我现在创建一个名为myDatabase的数据库,默认情况下由postgres用户拥有。然后我使用我的管理客户端使用tmpUser帐户远程登录到此myDatabase。

我现在在myDatabase中创建一个名为myDbSchema的新架构。我创建了一个名为myDbRole的新角色,并使用了一个授权,将myDatabase,myDbSchema全部授予myDbRole。

现在的问题是我应该如何控制对此myDatabase的访问。我尝试使用tmpUser登录到远程服务器,当我尝试执行select * from myTable myTable是myDatabase中的表时,它返回了一个权限被拒绝的sql消息。所以我将表的所有者更改为tmpUser,我真的不想这样做!

是否有关于如何在postgres中创建和组织模式角色的指南或内容?

1 个答案:

答案 0 :(得分:1)

您的问题是什么并不完全清楚(例如,角色“myDbRole”是什么,是组角色(NOLOGIN)还是用户角色(LOGIN)?)但是一般来说,您可以遵循这种权限管理模式:

  1. 创建特定角色以拥有数据库及其中的所有或大多数对象。出于安全原因,这应该是一个组角色(NOLOGIN)。不要使用postgres用户;如果您需要经常以该角色身份登录以进行常规数据库工作,那么您做错了什么。任何超级用户(或授予该角色的其他用户角色)都可以使用SET SESSION AUTHORIZATION“模拟”该所有者角色进行必要的维护。在生产环境中,这几乎不需要;在开发过程中,您可能需要考虑以LOGIN权限使用该角色以便于使用。
  2. 所有者创建应用程序所需的所有模式,表,视图,函数等。默认情况下,所有这些对象仅对数据库所有者可用,但函数除外。
  3. 定义许多组角色配置文件,每个配置文件都具有数据库的特定要求。例如,对于公司,您可以sales_staffproduct_managersaccountingsenior_management,或web_userweb_admin,{{1} }和app_developer用于网站。然后,数据库所有者GRANT根据需要访问数据库(app_manager),模式(CONNECT),表,视图和函数(USAGE)。出于安全原因,我通常EXECUTE
  4. 根据需要将组角色成员身份分配给用户角色:REVOKE ALL ON FUNCTION x() TO public。用户角色应具有GRANT sales_staff TO jane,以便他们可以登录并继承他们所属的组角色的权限。这包括连接数据库的权限和模式的使用权限。请注意,单个用户角色可以拥有多个组角色的成员身份。
  5. 最后,更新您的LOGIN INHERIT文件以启用对数据库的远程访问。