控制用户对 PostgreSQL 数据库的访问
PostgreSQL 中的新数据库始终使用数据库 public
架构中的一组默认权限创建,允许所有数据库用户和角色创建对象。例如,这些权限使数据库用户能够连接数据库,并在连接后创建临时表格。
为了更好地控制用户对您在 RDS for PostgreSQL 数据库实例上创建的数据库实例的访问,我们建议您撤消这些默认 public
权限。撤消后,您可以更精确地为数据库用户授权,如以下过程中所示。
为新数据库实例设置角色和权限
假设您正在新创建的 RDS for PostgreSQL 数据库实例上设置数据库,以供几位研究人员使用,他们都需要对数据库的读写访问权限。
使用
psql
(或 pgAdmin)连接到 RDS for PostgreSQL 数据库实例:psql --host=
your-db-instance.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 DATABASE
lab_db
;CREATE DATABASE
在这个新数据库上,撤消
PUBLIC
架构的所有权限。postgres=>
REVOKE ALL ON DATABASE
lab_db
FROM public;REVOKE
为数据库用户创建角色。
postgres=>
CREATE ROLE
lab_tech
;CREATE ROLE
为具有此角色的数据库用户提供连接到数据库的能力。
postgres=>
GRANT CONNECT ON DATABASE
lab_db
TOlab_tech
;GRANT
向具有
lab_tech
角色的所有用户授予对此数据库的所有权限。postgres=>
GRANT ALL PRIVILEGES ON DATABASE
lab_db
TOlab_tech
;GRANT
创建数据库用户,如下所示:
postgres=>
CREATE ROLE lab_user1 LOGIN PASSWORD 'change_me';
CREATE ROLE
postgres=>
CREATE ROLE lab_user2 LOGIN PASSWORD 'change_me';
CREATE ROLE
-
向这两个用户授予与 lab_tech 角色关联的权限:
postgres=>
GRANT lab_tech TO lab_user1;
GRANT ROLE
postgres=>
GRANT lab_tech TO lab_user2;
GRANT ROLE
此时,lab_user1
和 lab_user2
可以连接到 lab_db
数据库。此示例未遵循企业使用的最佳实践,其中可能包括创建多个数据库实例、不同的架构和授予有限权限。有关更多完整信息和其他方案,请参阅管理 PostgreSQL 用户和角色
有关 PostgreSQL 数据库中特权的更多信息,请参阅 PostgreSQL 文档中的 GRANT