Безопасность на уровне строк (RLS) в PostgreSQL на AWS RDS не работает

В настоящее время я пытаюсь настроить RLS в моей базе данных PostgreSQL, работающей на AWS RDS. По какой-то причине я не могу заставить его работать с БД Postgres в AWS, но локально он работает, и все кажется идентичным.

Вот моя установка:

Версия 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 в новой таблице пользователь больше не видит записи в таблице. Только на Postgres, запущенном на AWS RDS, это не работает.

Есть идеи, что мне здесь может не хватать?

3 ответа

Тем временем я узнал, что AWS создает "главного" пользователя, которого я фактически использовал здесь (app_user). Права, предоставленные этому пользователю, можно найти здесь: https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/UsingWithRDS.MasterAccounts.html Создание нового пользователя со всеми необходимыми привилегиями для БД решило проблему. Я все еще немного озадачен, какая из привилегий помешала этому главному пользователю обойти защиту на уровне строк, поскольку таблица пользователей показывала, что мой app_user не является суперпользователем. Если у кого-то еще есть ответ, я был бы признателен:-).

У главного пользователя в AWS postgres по умолчанию включена опция BYPASSRLS. Это приведет к обходу всех без исключения политик RLS.

Другая причина - пользователь (владелец схемы) всегда сможет видеть все данные. т.е. RLS не будет работать для владельца схемы, если вы не добавите

alter table xxxxx принудительно включить защиту на уровне строк.

Это может быть еще одной причиной того, что вы пытаетесь запросить владельца схемы.