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 ProRidade 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 hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid 🔥 Osta usaldusväärne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid | ProHoster