我刚刚在aws上创建了一个新的postgres RDS实例(通过仪表板),我给了它一个默认用户,让我们给他打电话" jack"。
当我登录实例时,我看到了我创建的用户" jack",并且他有一个角色" rds_superuser "连接。 (所以我认为我可以做与常规postgres服务器上超级用户相同的事情。)
我检查了documentation,我看到那是不可能的。
以默认用户" stan"身份登录后,我创建了一个新的数据库用户,例如" stan",并希望创建一个新的数据库,其中所有者是用户&# 34; stan",我不能?
我输入了这样的内容:
CREATE DATABASE foobar WITH OWNER = stan;
但是我收到了一个错误,说的是:
错误:必须是角色的成员" stan"
所以,我所做的是,将角色" stan"作为默认用户" jack"注销,以" stan&#34登录到RDS实例;并以他作为所有者创建该数据库。
由于我有三个不同的用户,我不得不重复最后一步三次。
我的问题是,有没有办法,我可以让默认用户" jack"我在RDS postgres创建过程中创建的,能够创建新的数据库(如常规postgres服务器安装上的超级用户),并为这样的不同所有者提供:
CREATE DATABASE foobar WITH OWNER = stan;
TNX, 汤姆
答案 0 :(得分:4)
RDS实例由Amazon管理。因此,为防止破坏诸如复制之类的东西,“您的用户-甚至您在创建实例时设置的 root用户-都不会具有完整的超级用户权限
rds_superuser角色可以执行以下操作:
1。添加可用于Amazon RDS的扩展。有关更多信息,请参见支持的PostgreSQL功能和PostgreSQL文档。
2。管理表空间,包括创建和删除表空间。有关更多信息,请参见PostgreSQL文档中的表空间部分。
3。使用pg_stat_activity命令查看未分配rds_superuser角色的所有用户,并使用pg_terminate_backend和pg_cancel_backend命令终止其连接。
4。为所有不是rds_superuser角色的角色授予和撤销 rds_replication角色。有关更多信息,请参见PostgreSQL文档中的GRANT部分。
以下示例显示了如何创建用户,然后授予用户 用户rds_superuser角色。用户定义的角色,例如 rds_superuser,必须被授予。
postgres=> \du
List of roles
Role name | Attributes | Member of
------------------+------------------------------------------------------------+---------------------------------------------
masteruser | Create role, Create DB +| {rds_superuser}
| Password valid until infinity |
rds_ad | Cannot login | {}
rds_superuser | Cannot login | {pg_monitor,pg_signal_backend,rds_replication,rds_password}
rdsadmin | Superuser, Create role, Create DB, Replication, Bypass RLS+| {}
| Password valid until infinity |
rdsrepladmin | No inheritance, Cannot login, Replication | {}
testuser | Create DB | {}
------------------+------------------------------------------------------------+---------------------------------------------
create role testuser with password 'testuser' login;
CREATE ROLE
grant rds_superuser to testuser;
GRANT ROLE
Role name | Attributes | Member of
------------------+------------------------------------------------------------+---------------------------------------------
masteruser | Create role, Create DB +| {rds_superuser}
| Password valid until infinity |
rds_ad | Cannot login | {}
rds_superuser | Cannot login | {pg_monitor,pg_signal_backend,rds_replication,rds_password}
rdsadmin | Superuser, Create role, Create DB, Replication, Bypass RLS+| {}
| Password valid until infinity |
rdsrepladmin | No inheritance, Cannot login, Replication | {}
testuser | Create DB | {rds_superuser}
------------------+------------------------------------------------------------+---------------------------------------------
postgres=> CREATE EXTENSION IF NOT EXISTS "pgcrypto";
CREATE EXTENSION
创建数据库实例时,您所使用的主用户系统帐户 将create分配给rds_superuser角色。 rds_superuser角色 是类似于PostgreSQL超级用户的预定义Amazon RDS角色 角色(在本地实例中通常命名为postgres),但有一些 限制。与PostgreSQL超级用户角色一样,rds_superuser 角色在您的数据库实例上拥有最多特权,因此您不应 将此角色分配给用户,除非他们需要对数据库的最大访问权限 实例。
答案 1 :(得分:2)
为了做到这一点,您应该将stan
授予rds_superuser
。你做了:
rds=> create user stan;
CREATE ROLE
rds=> CREATE DATABASE foobar WITH OWNER = stan;
ERROR: must be member of role "stan"
你应该:
rds=> grant stan to su_rdsadm;
GRANT ROLE
rds=> CREATE DATABASE foobar WITH OWNER = stan;
CREATE DATABASE
我是以rds超级用户的身份做到的:
rds=> \du+ su_rdsadm
List of roles
Role name | Attributes | Member of | Description
-------------+-------------------------------+----------------------+-------------
su_rdsadm | Create role, Create DB +| {rds_superuser,stan} |
| Password valid until infinity | |
rds=> select current_user;
current_user
--------------
su_rdsadm
(1 row)
进一步了解这一点很好。 rds_superuser对所有权/授权等的此限制将一直打击您,直到您将要操作(或代表您要授予的代码)的对象授予rds超级用户。