我目前正在尝试在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强制启用行级安全性。
这可能是您试图从架构所有者查询的另一个原因。