控制用户对 PostgreSQL 数据库的访问
PostgreSQL 中的新数据库始终使用数据库 public 架构中的一组默认权限创建,允许所有数据库用户和角色创建对象。例如,这些权限使数据库用户能够连接数据库,并在连接后创建临时表格。
为了更好地控制用户对您在 Aurora PostgreSQL 数据库集群主节点上创建的数据库实例的访问,我们建议您撤消这些默认 public 权限。撤消后,您可以更精确地为数据库用户授权,如以下过程中所示。
为新数据库实例设置角色和权限
假设您正在新创建的 Aurora PostgreSQL 数据库集群上设置数据库,以供几位研究人员使用,他们都需要对数据库的读写访问权限。
-
使用
psql(或 pgAdmin)连接到 Aurora PostgreSQL 数据库集群上的主数据库实例:psql --host=your-cluster-instance-1.666666666666.aws-region.rds.amazonaws.com --port=5432 --username=postgres --password出现提示时请输入密码。
psql客户端会建立连接并显示默认的管理连接数据库postgres=>,作为提示符。 -
要阻止数据库用户在
public架构中创建对象,执行以下操作:postgres=>REVOKE CREATE ON SCHEMA public FROM PUBLIC;REVOKE -
接下来,创建一个新数据库实例:
postgres=>CREATE DATABASElab_db;CREATE DATABASE -
在这个新数据库上,撤消
PUBLIC架构的所有权限。postgres=>REVOKE ALL ON DATABASElab_dbFROM public;REVOKE -
为数据库用户创建角色。
postgres=>CREATE ROLElab_tech;CREATE ROLE -
为具有此角色的数据库用户提供连接到数据库的能力。
postgres=>GRANT CONNECT ON DATABASElab_dbTOlab_tech;GRANT -
向具有
lab_tech角色的所有用户授予对此数据库的所有权限。postgres=>GRANT ALL PRIVILEGES ON DATABASElab_dbTOlab_tech;GRANT -
创建数据库用户,如下所示:
postgres=>CREATE ROLE lab_user1 LOGIN PASSWORD 'change_me';CREATE ROLEpostgres=>CREATE ROLE lab_user2 LOGIN PASSWORD 'change_me';CREATE ROLE -
向这两个用户授予与 lab_tech 角色关联的权限:
postgres=>GRANT lab_tech TO lab_user1;GRANT ROLEpostgres=>GRANT lab_tech TO lab_user2;GRANT ROLE
此时,lab_user1 和 lab_user2 可以连接到 lab_db 数据库。此示例未遵循企业使用的最佳实践,其中可能包括创建多个数据库实例、不同的架构和授予有限权限。有关更多完整信息和其他方案,请参阅管理 PostgreSQL 用户和角色
有关 PostgreSQL 数据库中特权的更多信息,请参阅 PostgreSQL 文档中的 GRANT