Row Level Security
La seguretat en l'àmbit de fila (RLS) és una característica que et permet restringir les files retornades per una consulta en funció de l'usuari que executa la consulta.
Introducció
Section titled “Introducció”El RLS et permet controlar l’accés a files individuals en taules segons l’usuari actual i condicions específiques definides per les polítiques.
Els passos bàsics per implementar la seguretat en l’àmbit de fila són els següents:
Primer, habilita la seguretat en l’àmbit de fila en una taula utilitzant la declaració ALTER TABLE
:
ALTER TABLE table_nameENABLE ROW LEVEL SECURITY;
En segon lloc, crea una nova política de seguretat en l’àmbit de fila per a una taula utilitzant la declaració CREATE POLICY
:
CREATE POLICY name ON table_nameUSING (condition);
A la política, es defineix una condició que determina quines files són visibles.
Tingues en compte que els superusuaris i rols amb l’atribut BYPASSRLS
poden ometre el sistema de seguretat de files quan accedeixen a una taula.
A més, els propietaris de taules també passen per alt la seguretat en l’àmbit de fila.
Per aplicar la seguretat en l’àmbit de fila als propietaris de taules, pots modificar la taula utilitzant l’opció FORCE ROW LEVEL SECURITY
:
ALTER TABLE table_nameFORCE ROW LEVEL SECURITY;
Exemple: department
Section titled “Exemple: department”Inicia una sessió psql en una base de dades.
Per exemple:
connect-wsl postgresdocker exec -it postgres psql -U postgres
A continuació crea una taula i uns rols on els rols poden recuperar dades de la taula on la columna manager
coincideixi amb el rol actual.
Crea una base de dades hr
:
create database hr;
Canvia la base de dades actual a la base de dades hr
:
\c hrYou are now connected to database "hr" as user "postgres".
Crea una nova taula department
per emmagatzemar dades del departament:
create table department ( id serial primary key, name text not null unique, manager name not null);
Insereix algunes files a la taula department
:
insert into department(name, manager)values('Sales', 'alice'), ('Marketing', 'bob'), ('IT', 'carol');
Crea un rol de grup anomenat manager
:
create role manager;
Atorga el privilegi select
de totes les taules de l’esquema public
al rol de grup manager
:
grant select on all tables in schema public to manager;
Crea tres nous rols alice
, bob
i carol
, i assigna’ls com a membres del rol de grup manager
:
create role alice with login password 'password' in role manager;create role bob with login password 'password' in role manager;create role carol with login password 'password' in role manager;
Els rols alice
, bob
i carol
heretaran implícitament els privilegis dels administradors de rols de grup.
En altres paraules, poden recuperar dades de totes les taules de l’esquema public
.
Canvia al rol alice
:
set role alice;
Si l’usuari alice
només vol accedir als seus registres pot utilitzar un where
:
select * from department where manager = 'alice'; id | name | manager----+-------+--------- 1 | Sales | alice(1 row)
Però la base de dades no impedeix a l’usuari alice
accedir a tots els registres de la taula department
:
select * from department; id | name | manager----+-----------+--------- 1 | Sales | alice 2 | Marketing | bob 3 | IT | carol(3 rows)
Torna al rol postgres
:
set role postgres;
Habilita la seguretat en l’àmbit de fila a la taula department
:
alter table department enable row level security;
Crea una política que permeti que l’usuari actual pugui accedir a les files on el valor de la columna manager
de la taula department
coincideixi amb el nom del rol actual:
create policy department_manager on department to managerusing (manager = current_user);
Tanca la connexió i torna a iniciar sessió com l’usuari alice
:
quitdocker exec -it postgres psql -U alice -d hr
Recuperar dades de la taula department
:
select * from department; id | name | manager----+-------+--------- 1 | Sales | alice(1 row)
La consulta retorna les files on la columna d’administrador és alice
.
Exemple: user
Section titled “Exemple: user”TODO: Postgres - RLS
Activitat: sales
Section titled “Activitat: sales”A continuació tens el disseny de la base de dades sales
:
La base de dades té tres rols: manager
, product
i customer
.
A continuació tens parcialment implementada la seguretat de la base de dades:
rol | product | customer |
---|---|---|
manager | select , update , insert | select |
anonymous | select | |
customer (in anonymous ) | select (rls), update (rls) |
Has de:
- Finalitzar de dissenyar i escriure el codi SQL corresponent.
- Inserir algunes dades de prova.
- Provar que la base de dades funciona correctament i és segura.
Abocaments parcials de dades
Section titled “Abocaments parcials de dades”Quan treballem amb bases de dades, és habitual crear un fitxer seed.sql
que conté un subconjunt de dades de producció per a fer proves.
Durant el desenvolupament inicial, és acceptable abocar tota la base de dades i restaurar-la a la màquina de desenvolupament. No obstant això, quan ja tens usuaris en producció això esdevé un problema de seguretat - realment vols abocar les dades dels teus usuaris a les teves màquines locals?
Hi ha moltes maneres de resoldre això, però una manera elegant de fer-ho utilitzant la Seguretat en l’àmbit de Fila (Row Level Security, RLS) de PostgreSQL.
El concepte és simple:
- Crear un usuari de base de dades amb accés restringit.
- Definir algunes regles RLS per a aquest usuari, limitant a quines dades pot accedir.
- Executar
pg_dump
com aquest usuari.
Per a aquest escenari, imagina’t que tens una taula anomenada profiles
a la teva base de dades::
…
El contingut d'aquest lloc web té llicència CC BY-NC-ND 4.0.
©2022-2025 xtec.dev