EtĂŒĂŒd PostgreSQL-i ridade taseme turvameetmete rakendamisest

TĂ€ienduseks EtĂŒĂŒd Ă€riloogika rakendamisest PostgreSQL-i salvestatud protseduuride tasandil ja peamiselt pĂ”hjaliku vastuse jaoks . Tundub, et kommentaar.

Teoreetiline osa on dokumentatsioonis suurepĂ€raselt kirjeldatud Postgres Pro — Ridade kaitse poliitikad. Allpool kĂ€sitletakse vĂ€ikese konkreetse Ă€riprobleemi — kustutatud andmete peitmine. EtĂŒĂŒd on pĂŒhendatud rakendamisele Rollimudel koos RLS-iga on esitatud eraldi.

EtĂŒĂŒd PostgreSQL-i ridade taseme turvameetmete rakendamisest

Artiklis ei ole midagi uut, pole peidetud tÀhendust ega saladusi. Lihtsalt visand teoreetilise idee praktilisest rakendamisest. Kui see huvitab, lugege. Kui ei, siis Àrge raisake oma aega.

Ülesande seadmine

Mitte sĂŒvenedes sĂŒgavale teemasse, on ĂŒlesanne lĂŒhidalt jĂ€rgmine: on tabel, mis rakendab mingit Ă€riĂŒksust. Tabelist saavad read kustutatud, kuid fĂŒĂŒsiliselt ei tohi ridu kustutada, neid tuleb peita.

Nagu öeldud — 'Ära kustuta midagi, lihtsalt nimetage ĂŒmber. Internet hoiab KÕIKE'

Samas on soovitav mitte kirjutada ĂŒmber juba olemasolevaid salvestatud funktsioone, mis töötavad selle ĂŒksusega.

Selle kontseptsiooni rakendamiseks on tabelil atribuut is_deleted. Edasi on kĂ”ik lihtne — tuleb teha nii, et klient nĂ€eb ainult ridu, kus atribuut is_deleted on vale. Selleks kasutatakse Ridade taseme turvalisust.

Rakendamine

Loome eraldi rolli ja skeemi

LOODE ROLLI repos;
LOODE SKEEM repos;

Loome sihtotstarbelise tabeli

LOODE TABEL repos.file
(
...
is_del BOOLEAN DEFAULT FALSE
);
LOODE SKEEM repos

LĂŒlitame sisse Rea taseme turvalisuse

MUUDA TABEL repos.file  LUBA REA TASEME TURVALISUS ;
LOODE POLIITIKA file_invisible_deleted  ON repos.file KÕIK DBA_ROLLILE KASUTAMINE (MITTE is_deleted );
ANNE KÕIK TABELILE repos.file dba_rollile ;
ANNE KASUTUS SKEEMILE repos dba_rollile ;

Teenindusfunktsioon — rida kustutamine tabelis

LOODE VÕI ASENDA repo.delete( curr_id repos.file.id%TÜÜP)
NAJAL integer KUI $$
ALUSTAGE
...
UUENDAGE repos.file
SEADKE is_del = TÕENE 
KUS id = curr_id ; 
...
LÕPP
$$ KEEL plpgsql TURVALINE DEFINIATOR;

Ärifunktsioon — dokumentide kustutamine

LOODE VÕI ASENDA business_functions.deleteDoc( doc_for_delete JSON )
NAJAL JSON KUI $$
ALUSTAGE
...
SOORITUSTA repos.delete( doc_id ) ;
...
LÕPP
$$ KEEL plpgsql TURVALINE DEFINIATOR;

tulemused nÀitasid ainult nelja ebaolulise koodibloki kattuvust, mis olid tingitud POSIX ja ANSI C nÔuetest.

Klient kustutab dokumendi

VALI business_functions.delCFile( (VALI json_build_object( 'CId', 3 )) );

PÀrast kustutamist ei nÀe dokumendi klient

VALI business_functions.getCFile"( (VALI json_build_object( 'CId', 3 )) ) ;
-----------------
(0 rida)

Kuid andmebaasis ei ole dokument kustutatud, vaid ainult atribuudi is_del

psql -d my_db
VALI  id, name , is_del FROM repos.file ;
id |  name  | is_del
--+---------+------------
 1 |  test_1 | t
(1 rida)

Just seda nĂ”uti ĂŒlesande mÀÀramisel.

KokkuvÔte

Kui teema tundub huvitav, siis jĂ€rgmises etĂŒĂŒdis saab nĂ€idata nĂ€idet rollimudeli rakendamisest andmete juurdepÀÀsu jagamiseks, kasutades Row Level Security't.

Allikas: habr.com

Osta usaldusvÀÀrne veebimajutus DDoS-kaitsega veebisaitidele, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne veebimajutus DDoS-kaitsega veebisaitidele, VPS VDS serverid - ProHoster