数据库所有者的特权;应用用户

And*_*vis 15 postgresql amazon-rds

快速版本:

我应该发出什么命令来启用数据库所有者以允许它访问此数据库中的表,并且这可以从该所有者的帐户中完成吗?


更长的版本:

我正在 RDS 上创建一个数据库。我有一个在亚马逊上配置的“root”用户。

Amazon 会自动创建组角色“rds_superuser”,该角色非常有特权,但实际上并不是超级用户。

我正在为应用程序创建一个数据库和用户,如下所示:

create database master_integration;
CREATE ROLE master_application LOGIN ENCRYPTED PASSWORD '...' VALID UNTIL 'infinity';
GRANT ALL ON DATABASE master_integration TO GROUP rds_superuser WITH GRANT OPTION;
GRANT ALL ON DATABASE master_integration TO GROUP master_application;

\c master_integration;
ALTER DEFAULT PRIVILEGES GRANT INSERT, SELECT, UPDATE, DELETE, TRUNCATE, REFERENCES, TRIGGER ON TABLES TO rds_superuser;
Run Code Online (Sandbox Code Playgroud)

我更新了这个脚本以反映 Craig Ringer 关于我应该如何处理这个问题的建议。

当应用程序连接(使用 master_application 凭据)时,它会创建(并因此拥有)这些表。

我的问题是我不能使用我的管理 (rootish) 登录来运行查询,因为该用户在表上没有权限。

我以前通过从应用程序帐户运行以下命令来解决这个问题:

GRANT ALL privileges ON ALL TABLES IN SCHEMA public to rds_superuser;
Run Code Online (Sandbox Code Playgroud)

但是让下属用户将 privs 授予管理用户似乎很麻烦。

那么...是否有一个命令可以在我从应用程序创建表之前或之后运行,以确保数据库的所有者可以访问数据库中的表?


重新尝试更改默认权限后更新...

这仍然不会授予对表的访问权限;我看到它在其他地方被建议并且完全有道理,但它对我不起作用。从 psql shell:

master_integration=> \ddp
                           Default access privileges
      Owner       | Schema | Type  |             Access privileges             
------------------+--------+-------+-------------------------------------------
 integration_root |        | table | integration_root=arwdDxt/integration_root+
                  |        |       | rds_superuser=arwdDxt/integration_root
(1 row)

master_integration=> \dp users
                           Access privileges
 Schema | Name  | Type  | Access privileges | Column access privileges 
--------+-------+-------+-------------------+--------------------------
 public | users | table |                   | 
(1 row)
Run Code Online (Sandbox Code Playgroud)

integration_root 是我的超级用户,而 users 是我数据库中的一个表。


更新

我从亚马逊的某个人那里得到了一个相当无用的回应。

他们让我从 master_application 登录中调用 ALTER DEFAULT PRIVILEGES。虽然这可能会奏效,但它不会回答我的问题(这是我如何仅通过 rds_superuser 帐户实现这一点)。

我要求他们澄清这一点,然后他们就走了。

Cra*_*ger 9

你要ALTER DEFAULT PRIVILEGES

授予rds_superuser对所有新表的默认访问权限。

这仅影响在ALTER. 对于现有表,您必须GRANT拥有权限。