Sigurnost u PostgreSQL-u

Izvor: SIS Wiki
Skoči na: orijentacija, traži

Temu rezervirala: Marija Jerbić

Sadržaj

Uvod

PostgreSQL jedna je od najnaprednijih open source baza podataka na svijetu, ali 82 dokumentirane sigurnosne ranjivosti također ju čine vrlo ranjivom. Odobreno, popularna objektno-relacijska baza smatra se superiornom kada je riječ o sigurnosti, no potrebne je provesti odgovarajuće mjere zaštite podataka.


Prava pristupa

Grupe i uloge

Create admin.png
Slika 1. Kreiranje grupa

Prilikom kreiranja grupa i korisnika, preporuka je zaštititi nadzor pristupa unutar PostgreSQL baze podataka. PostgreSQL ima nekoliko super uloga koje gotovo jamče sve privilegije. Te super uloge treba stalno pregledavati zbog neovlaštenog pristupa. U većini slučajeva uloga SUPERUSER-a te privilegije CREATEROLE i CREATEDB, trebaju biti ograničene na administratora baze podataka. Korištenje grupa/uloga su, u PostgreSQL-u, ista stvar. Ne postoji razlika između navedena dva kao u drugim sustavima za upravljanje bazom podataka, tako da prilikom stvaranja korisnika stvarate ulogu.

U sovjoj bazi podataka kreirala sam dvije grupe: korisnik i admin. Kao što se može vidjeti na slici, administrator ima privilegije superuser-a dok obični korisnik nema privilegija. Nakon toga, kreirala sam par uloga te sam svakome od njih odredila da li su član grupe korisnika ili grupe administratora te su time nasljedili privilegije dane grupe.

Privilegije administratora.png
Slika 2. Privilegije grupe administratira i korisnika

Role marija.png
Slika 3. Kreiranje korisnika sa ulogom administratora


Podjelom korisnika u grupe onemogućavamo korisnicima pregled tablica te bilo kakve promjene tablica nad kojima nemaju prava pristupa. Na sljedećoj slici možemo vidjeti da je korisnik 'iva' pokušao pristupiti tablici 'grupa' koju je krenirao korisnik 'antonio'. Pošto korisnik iva nema prava pristupa nad tablicom grupa, ne može joj ni pristupiti.

Select grupa iva permitted sql shell.png
Slika 5. Nedopušten pristup tablicama [4]

Ako bi korisnik ‘antonio’ želio dozvoliti pristup tablici ‘grupa’ (SELECT) korisniku ‘iva’, to će napraviti uz pomoć naredbe GRANT.

Grant antonio grupa to korisnik psql shell.png
Slika 6. Dopušten pristup tablici [5]

Na sljedećoj slici možemo vidjeti kako korisnik ‘iva’ sada može vidjeti tablicu ‘grupa’.

Select grupa iva allowed sql shell.png
Slika 7. Mogućnost pristupa tablici grupa [6]

Lozinke

Lozinke se pohranjuju kao nekriptirane ili kriptirane. Nekriptirane lozinke se pohranjuju kao čisti tekst i može ih se pročitati od strane superuser-a. Kriptiranje lozinke uključuje generiranje i pohranjivanje kao MD5 hash, koji se ne može čitati. Lozinka se potvrđuje prilikom prijave pomoću hash-a uspoređujući ga s onim što je već pohranjeno u klasteru podataka.

Hashevi su jednosmjerni te su najbolji za podatke poput lozinke kod koje samo treba provjeriti podudaranje a ne treba ju dešifrirati.

Slijedi nekoliko primjera stvaranja i upravljanja zaporkom:

CREATE ROLE user1 WITH LOGIN;

CREATE ROLE roger WITH LOGIN UNENCRYPTED PASSWORD '123';

ALTER ROLE user1 WITH ENCRYPTED PASSWORD '123'

Password2.png
Slika 4. Pristup lozinkama

Moguća sigurnosna ograničenja uključuju:

Trust security.png
Slika 5. pg_hba.conf - datoteka konfiguracije autentikacije klijenata

Pg hba.png
Slika 6. pg_hba.conf - mogućnosti

Prava pristupa objektima pod kontrolom korisnika

Sljedeća slika prikazuje kako korisnik 'patrik' može dobiti popis korisničkih računa i njihovih odgovarajućih svojstava. Obični korisnik ne može pristupiti lozinkama.

Pg user.png
Slika 8. Mogućnost pristupa korisničkim računima

Kreiranje i pristupanje korisnički definiranim funkcijama

Za razliku od tablica, obični korisnički račun ne zahtijeva posebna dopuštenja kada poziva tuđu funkciju, čak i ako ih je stvorio superuser. Na sljedećoj slici vidimo da ukoliko ne oduzmemo prava pristupa javnoj shemi, običan korisnik može pristupiti funciji.

Funkcija.png
Slika 9. Pristup funkciji od strane običnog korisnika

Na sljedećoj slici možemo vidjeti kako se zaštititi od neovlaštenog pristupa korisnički definiranih funkcija.

Funkcija2.png
Slika 10. Oduzimanje prava pristupa funkciji

Security definer

Security definer izvršava funkciju s privilegijama korisnika koji ju je stvorio, stoga korisnik može pristupiti tablici koja je u normalnim okolnostima inače nedostupna.

Na primjer, kao što je prikazano na sljedećim slikama, korisnik marija (administrator i superuser) je kreirao tablicu s dva stupca.

Kreniranje finkcije.png
Slika 11. Kreiranje funkcije od strane admina

Običan korisnik, iva, pozvat će funkciju pomoću parametra SECURITY DEFINER i dobiti vrijednost na temelju ulazne vrijednosti.

Security definer2.png
Slika 12. Pristup funkciji pomoću security definer-a

Kako bi spriječili nedopušten pristup korisnički definiranim funkcijama, treba se napraviti sljedeće:

Security definer3.png
Slika 13. Zabrana pristupa funkciji pomoću security definer-a


Javna shema

Prema zadanim postavkama, PostgresSQL koristi javnu shemu koja se koristi za pohranu informacija o bazama podataka, tablicama i procedurama. Ta shema prema zadanim postavkama dostupna je svim korisnicima, tako da svi mogu vidjeti strukturu ili procedure svake tablice. Korisnik može, primjerice, "data mine-ati" tablice. Čak bi bilo moguće mijenjati ih dodavanjem pravila i okidača, spremajući podatke u tablicama koje se nalaze u javnoj shemi, te ih zatim pokupiti. Prema tome, treba ukloniti javnu shemu tako da ona ne bude dostupna svim korisnicima. To možemo postići naredbom REVOKE.

Na sljedećoj slici možemo vidjeti da je korisnik 'antonio' (koji ima prava običnog korisnika) upisao \d čime vidi strukturu svih tablica koje trenutno postoje u bazi 'marijadb'.

Struktura dopusteno.png
Slika 14. Mogućnost pristupa strukturi tablica

Kako bi onemogućili korisnicima da imaju uvid u strukturu, ali i mogućnost bilo kakvog mijenjanja javne sheme, administrator treba napraviti sljedeće:

Revoke schema public.png
Slika 15. Uklanjanje zadane javne sheme

Za sigurnost, search_path bi trebao biti postavljen tako da isključuje sheme koje mogu pisati nepouzdani korisnici.

Na kraju možemo vidjeti kako korisnik 'antonio' nakon što upiše \d više ne može vidjeti strukturu tablica.

Struktura nedopusteno.png
Slika 16. Nemogućnost pristupa strukturi tablica

Sigurnosna kopija (Back-up)

Kao i sa svime što sadrži vrijedne podatke, PostgreSQL baze podataka trebaju biti redovito back-upirane. Iako je postupak u osnovi jednostavan, važno je imati jasno razumijevanje temeljnih tehnika i pretpostavki.

Postoje tri temeljno drugačija pristupa backupu PostgreSQL podataka:

SQL dump

Kreiranje sigurnosne kopije Ideja iza ove metode jest generiranje tekstualne datoteke s SQL naredbama koje će, kada se vrati na poslužitelj, ponovno stvoriti bazu podataka u istom stanju kakva je bila prije izvršenja naredbe pg_dump. Dobro je napomenuti kako pg_dump ne radi s posebnim dozvolama. Konkretno, mora imati pristup čitanju svim tablicama za koje želite napraviti back-up, tako da se u praksi gotovo uvijek morati pokrenuti kao superuser baze podataka.

Opći oblik naredbe izgleda ovako:

Command.png
Slika 17. Kreiranje sigurnosne kopije u Command Promptu

Vraćanje sigurnosne kopije

Da bi mogli vratiti sigurnosnu kopiju prvo je potrebno kreirati novu bazu podataka u koju ćemo prenijeti sve iz sigurnosne kopije.

Opći oblik naredbe za vraćanje kopije je:

Prema zadanim postavkama, psql skripta nastavit će se izvršavati nakon pogreške. Stoga bi bilo dobro pokrenuti psql s ON_ERROR_STOP setom varijabli kako bi promijenili to ponašanje te kako bi mogli izaći ako dođe do pogreške:

Aaa.png
Slika 18. Vraćanje sigurnosne kopije u Command Promptu

Nakon što smo prenijeli sve u novu bazu podataka, možemo vidjeti na sljedećoj slici kako administrator sada ima pristup svim elementima iz stare baze podataka.

Aaaa.png
Slika 18. Pristup elementima nove baze podataka

Ukoliko imamo više baza podataka, ovim načinom bismo morali izrađivati sigurnosne kopije za svaku bazu podataka. Ukoliko imamo cluster baza podataka na istome serveru, možemo koristiti naredbu pg_dumpall. Primjer jedne takve naredbe je: pg_dumpall > "cluster.sql". Ukoliko želimo prenijeti podatke iz takve datoteke trebamo koristiti naredbu psql -f "cluster.sql" <ime_baze_podataka (obicno postgres)>.


Važna prednost pg_dumpa nad ostalim metodama sigurnosnog kopiranja je da se datoteka napravljena kao izlaz naredbe pg_dump općenito može ponovno učitati u novije verzije PostgreSQL-a, dok su sigurnosna kopija na razini datotečnog sustava i kontinuirano arhiviranje ekstremno specificirane na verziju servera. pg_dump je također jedina metoda koja će raditi pri prijenosu baze podataka na drugu arhitekturu, kao što je npr. prelazak s 32-bitnog na 64-bitni poslužitelj.

Sigurnosna kopija na razini datotečnog sustava

Alternativna strategija sigurnosnog kopiranja je izravno kopiranje datoteka koje PostgreSQL koristi za pohranu podataka u bazi podataka tar -cf backup.tar /usr/local/pgsql/data Međutim, postoje dva ograničenja koja ovu metodu čine nepraktičnom ili barem inferiornom metodom od pg_dump-a

Sigurnosna kopija datotečnog sustava funkcionira samo za potpuni sigurnosni backup i obnavljanje cijelog klastera baze podataka.

Kontinuirano arhiviranje

U svakom trenutku, PostgreSQL održava zapisivanje u pg_xlog / poddirektorij direktorija klastera podataka. Zapisnik bilježi svaku promjenu napravljenu u podatkovnim datotekama baze podataka. Zapisnik postoji prvenstveno za sigurnosne svrhe: ako sustav padne, baza podataka se može vratiti ns prethodno stanje ponovnim unosom zapisnika od zadnje kontrolne točke.

SEPostgreSQL

Većina postojećih sustava za upravljanje relacijskom bazom podataka primjenjuju vlastite kontrole pristupa, primjerice naredbe GRANT i REVOKE, bez suradnje s operacijskim sustavom. To može rezultirati nedosljednim kontrolama pristupa u usporedbi s onima na datotečnom sustavu.

SE-PostgreSQL je ugrađeno (built-in) poboljšanje PostgreSQL-a, koje pruža precizne obvezne kontrole pristupa (eng. mandatory access control) za objekte baze podataka te donosi odluke o kontroli pristupa temeljenim na SELinux sigurnosnoj politici.

Dizajn većine ovih značajki temelji se na modelu referentnog monitora koji omogućava upravljanje cijelim sustavom centraliziranom sigurnosnom politikom.

Model referentnog monitora pretpostavlja da upravitelji objekata (npr. operacijski sustavi) mogu prihvatiti sve pristupe sustavu, a zatim donositi odluke o tome je li taj pristup dozvoljen ili odbijen. Sustav za upravljanje relacijskom bazom podataka (RDBMS) je upravitelj objekata za objekte baze podataka, slično operacijskim sustavima koji su upravitelji objekata za objekte datotečnih sustava.

Ranije su sustavi za upravljanje relacijskim bazama podataka donosili odluke o kontroli pristupa neovisno o centraliziranoj sigurnosnoj politici te se trebala pažljivo skrbiti za održavanje dosljednosti između operacijskog sustava i sustava za upravljanje bazom podataka.

SEPostgreSQL pruža sljedeće značajne značajke:

Obavezne kontrole pristupa (Mandatory Access Controls)

PostgreSQL koristi koncept superuser-a baze podataka koji može zaobići (bypass) sve kontrole pristupa nativnog PostgreSQL-a. Naprotiv, SE-PostgreSQL provodi kontrolu pristupa svakog klijenta, bez iznimke, čak i ako je klijent superuser baze podataka. Klijenti mogu pristupiti objektima baze podataka samo kada pristup dopušta i nativni PostgreSQL i SE-PostgreSQL.

Primjer:

SELECT a,b FROM t WHERE c = 'aaa'

Nativni mehanizam privilegije baze podataka prvo provjerava ima li trenutačna uloga (role) baze podataka privilegiju superuser-a baze podataka, ili ne. Ako uloga ima navedenu privilegiju, ostatak provjera odobrenja se zaobilazi. U suprotnom, provjerava naredbu SELECT na tablici t. Ako nije dopušteno, ona također provjerava naredbu SELECT nad svim referenciranim stupcima.


SE-PostgreSQL provjerava sve potrebne dozvole pojedinačno. Ako klijent baze podataka pokuša izvršiti određenu akciju kao superuser baze podataka, provjerava naredbu db_database:{superuser}. Zatim također provjerava db_table:{select} za tablicu t i db_column:{select} na stupcu a, b i c pojedinačno, neovisno o odluci o kontroli pristupa nad db_database:{superuser} i db_table:{select }.

Ovo prikazuje načelo SELinuxa. Njegov sigurnosni model donosi odluke o tome može li korisnik izvršiti određenu operaciju na određenom objektu ili ne, temeljenu samo na odnosu između korisnika i objekta kojem se pristupa. Nikada nije nadjačano bilo kojim drugim dozvolama (eng. permissions), kao što je db_database: {superuser}. Ta se osobina naziva analizibilnost sigurnosne politike.


Precizne kontrole pristupa (Fine-grained Access Controls)

Granularnost kontrole pristupa ovisi o sustavu za upravljanje relacijskom bazom podataka. SE-PostgreSQL omogućuje da kontrola pristupa bude konfigurirana na razini stupaca i redaka. Stupci i redci su najmanja jedinica objekata baze podataka. Kontrola pristupa nad tim objektima omogućuje administratorima baze podataka da primjenjuju fleksibilnu kontrolu pristupa nad njima.

Dosljednost kontrole pristupa (Consistency in Access Controls)

SELinux zahtijeva da svi procesi i objekti imaju sigurnosni kontekst koji predstavljaju njegove privilegije i atribute. SE-PostgreSQL dodjeljuje sigurnosni kontekst nad svakim objektom baze podataka i donosi odluke kontrole pristupa na temelju privilegija i atributa. SE-PostgreSQL treba sigurnosne kontekste (Security Context) da donese svoje odluke. Ovo je bitna značajka za konzistentnost u kontroli pristupa, time što su privilegije za klijente i atributi za objekte zastupljeni u istom obliku.

Literatura

[1] IBM, Total security in a PostgreSQL database, Preuzeto sa: https://www.ibm.com/developerworks/library/os-postgresecurity/

[2] Trustwave, Helping to Secure your PostgreSQL Database, Preuzeto sa: https://www.trustwave.com/Resources/SpiderLabs-Blog/Helping-to-Secure-your-PostgreSQL-Database/

[3] Wiki, SEPostgreSQL Development, Preuzeto sa: https://wiki.postgresql.org/wiki/SEPostgreSQL_Development

[4] Kohei K., Security-Enhanced PostgreSQL, Preuzeto sa: http://www.pgcon.org/2008/schedule/attachments/38_pgcon2008-sepostgresql.pdf

[5] PostgreSQL, PostgreSQL 8.3.23 Documentation, Preuzeto sa: https://www.postgresql.org/docs/8.3/static/auth-pg-hba-conf.html

[6] OWASP, Backend Security Project PostgreSQL Hardening, Preuzeto sa: https://www.owasp.org/index.php/OWASP_Backend_Security_Project_PostgreSQL_Hardening

[7] PostgreSQL 9.1.24 Documentation, File System Level Backup, Preuzeto sa: https://www.postgresql.org/docs/9.1/static/backup-file.html

[8] PostgreSQL 9.1.24 Documentation, SQL Dump, Preuzeto sa: https://www.postgresql.org/docs/9.1/static/backup-dump.html

[9] PostgreSQL 9.1.24 Documentation, Continuous Archiving and Point-in-Time Recovery (PITR), Preuzeto sa: https://www.postgresql.org/docs/9.1/static/continuous-archiving.html

Osobni alati
Imenski prostori
Inačice
Radnje
Orijentacija
Traka s alatima