Row Level Security (RLS) в PostgreSQL на AWS RDS не работает - PullRequest
1 голос
/ 09 апреля 2020

В настоящее время я пытаюсь настроить RLS на моей PostgreSQL БД, работающей на AWS RDS. По какой-то причине я не могу заставить его работать на Postgres DB в 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, это не работает.

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

1 Ответ

1 голос
/ 09 апреля 2020

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

...