控制用户对 PostgreSQL 数据库的访问 - Amazon Relational Database Service

控制用户对 PostgreSQL 数据库的访问

PostgreSQL 中的新数据库始终使用数据库 public 架构中的一组默认权限创建,允许所有数据库用户和角色创建对象。例如,这些权限使数据库用户能够连接数据库,并在连接后创建临时表格。

为了更好地控制用户对您在 RDS for PostgreSQL 数据库实例上创建的数据库实例的访问,我们建议您撤消这些默认 public 权限。撤消后,您可以更精确地为数据库用户授权,如以下过程中所示。

为新数据库实例设置角色和权限

假设您正在新创建的 RDS for PostgreSQL 数据库实例上设置数据库,以供几位研究人员使用,他们都需要对数据库的读写访问权限。

  1. 使用 psql(或 pgAdmin)连接到 RDS for PostgreSQL 数据库实例:

    psql --host=your-db-instance.666666666666.aws-region.rds.amazonaws.com --port=5432 --username=postgres --password

    出现提示时请输入密码。psql 客户端会建立连接并显示默认的管理连接数据库 postgres=>,作为提示符。

  2. 要阻止数据库用户在 public 架构中创建对象,执行以下操作:

    postgres=> REVOKE CREATE ON SCHEMA public FROM PUBLIC; REVOKE
  3. 接下来,创建一个新数据库实例:

    postgres=> CREATE DATABASE lab_db; CREATE DATABASE
  4. 在这个新数据库上,撤消 PUBLIC 架构的所有权限。

    postgres=> REVOKE ALL ON DATABASE lab_db FROM public; REVOKE
  5. 为数据库用户创建角色。

    postgres=> CREATE ROLE lab_tech; CREATE ROLE
  6. 为具有此角色的数据库用户提供连接到数据库的能力。

    postgres=> GRANT CONNECT ON DATABASE lab_db TO lab_tech; GRANT
  7. 向具有 lab_tech 角色的所有用户授予对此数据库的所有权限。

    postgres=> GRANT ALL PRIVILEGES ON DATABASE lab_db TO lab_tech; GRANT
  8. 创建数据库用户,如下所示:

    postgres=> CREATE ROLE lab_user1 LOGIN PASSWORD 'change_me'; CREATE ROLE postgres=> CREATE ROLE lab_user2 LOGIN PASSWORD 'change_me'; CREATE ROLE
  9. 向这两个用户授予与 lab_tech 角色关联的权限:

    postgres=> GRANT lab_tech TO lab_user1; GRANT ROLE postgres=> GRANT lab_tech TO lab_user2; GRANT ROLE

此时,lab_user1lab_user2 可以连接到 lab_db 数据库。此示例未遵循企业使用的最佳实践,其中可能包括创建多个数据库实例、不同的架构和授予有限权限。有关更多完整信息和其他方案,请参阅管理 PostgreSQL 用户和角色

有关 PostgreSQL 数据库中特权的更多信息,请参阅 PostgreSQL 文档中的 GRANT 命令。