postgres RDS服务器中的rds_superuser角色

时间:2018-04-11 18:05:28

标签: postgresql amazon-web-services rds

我刚刚在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, 汤姆

2 个答案:

答案 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

enter image description here

  

创建数据库实例时,您所使用的主用户系统帐户   将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超级用户。