AWS RDS上PostgreSQL中的行级安全性(RLS)不起作用



我目前正在尝试在AWS RDS上运行的PostgreSQL数据库上配置RLS。出于某种原因,我无法让它在AWS的Postgres DB上工作,但在本地它可以工作,一切似乎都是一样的。

这里是我的设置:

PostgreSQL版本:10.6

步骤:

SELECT * FROM pg_user;
|usename|usesysid|usecreatedb|usesuper|userepl|usebypassrls|passwd|valuntil|
|rdsadmin|10 |t| t|t| t| ******** | infinity|
|app_user|16393|t|f|f|f|********|infinity|
SELECT current_user;
> current_user
> ---------------
> app_user
CREATE TABLE rls_test (id int, name varchar(255));
INSERT INTO rls_test (1, 'test');
SELECT * FROM rls_test;
>  id | name
> ----+------
>  1  | test
SELECT * FROM pg_tables where tablename='rls_test';
>  schemaname | tablename | tableowner | tablespace | hasindexes | hasrules | hastriggers | rowsecurity
> ------------+-----------+------------+------------+------------+----------+-------------+-------------
>  public     | rls_test  | app_user   |            | f          | f        | f           | f
ALTER TABLE rls_test ENABLE ROW LEVEL SECURITY;
ALTER TABLE rls_test FORCE ROW LEVEL SECURITY;
SELECT * FROM pg_tables where tablename='rls_test';
>  schemaname | tablename | tableowner | tablespace | hasindexes | hasrules | hastriggers | rowsecurity
> ------------+-----------+------------+------------+------------+----------+-------------+-------------
>  public     | rls_test  | app_user   |            | f          | f        | f           | t
SELECT * FROM rls_test;
>  id | name
> ----+------
>  1  | test

在本地运行的Postgres数据库上执行相同的步骤。在新表上启用并强制RLS之后,用户不再看到表中的条目。只有在AWS RDS上运行的Postgres上,它才不起作用。

你知道我在这里会错过什么吗?

因此,在此期间,我发现AWS创建了一个"主"用户,我实际上在这里使用它(app_user(。授予此用户的权限可在此处找到:https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/UsingWithRDS.MasterAccounts.html创建一个具有数据库所需所有权限的新用户解决了这个问题。不过,我仍然有点困惑,因为用户表显示我的app_user不是超级用户,哪种特权阻止了这个主用户绕过行级安全性。如果有人对此还有答案,我将不胜感激:-(。

AWS postgres中的主用户默认启用BYPASSRLS选项。这将使任何和所有RLS策略被绕过。

另一个原因是,用户(模式所有者(将始终能够看到所有数据。即RLS将不适用于模式所有者,除非您添加

alter表xxxxx强制启用行级安全性。

这可能是您试图从架构所有者查询的另一个原因。

最新更新