Estou tentando configurar a segurança em nível de linha em um banco de dados Amazon RDS (Postgres 15) para alimentar um projeto Django.
O usuário que passo para o Django não é superusuário e não herdou BYPASSRLS
nenhuma de suas funções. Eu sei disso a partir desta consulta:
SELECT
rolname,
rolsuper,
rolbypassrls
FROM
pg_roles
WHERE
oid in (
WITH RECURSIVE cte AS (
SELECT
oid
FROM
pg_roles
WHERE
rolname = current_user
UNION
ALL
SELECT
m.roleid
FROM
cte
JOIN pg_auth_members m ON m.member = cte.oid
)
SELECT
oid
FROM
cte
)
O usuário possui o banco de dados, o esquema e a tabela, mas quando adicionei a política também executei:
ALTER TABLE certain_table ENABLE ROW LEVEL SECURITY;
ALTER TABLE certain_table FORCE ROW LEVEL SECURITY;
Em um Postgres local (Docker) e na mesma configuração, executando SELECT row_security_active('certain_table')
return True
. No RDS ele retorna False
.
Estou faltando algum outro critério para ignorar a segurança em nível de linha?
Como resposta provisória, há algo
rds_superuser
que os faz ignorar o RLS. O que exatamente, isso ainda é desconhecido para mim. Mudei o usuário e o RLS está funcionando corretamente agora. Uma resposta melhor seria saber exatamente como está acontecendo o bypass, para que possa ser detectado a partir de uma consulta ao servidor.