MODUL 5 - LEKCIJA 3

Sigurnost i Kontrola Pristupa

Implementacija Row-Level Security, Dynamic Data Masking i principa najmanje privilegije

⏱️ Trajanje: ~3 časa 📚 Nivo: Srednji do Napredni 🎯 Praktični primjeri: 5

📖 Slojevi Sigurnosti

Sigurnost baze podataka se ne svodi samo na lozinku. Profesionalna implementacija prati princip "Defense in Depth" (Dubinska odbrana), gdje svaki sloj štiti podatke ako prethodni padne.

🔑 Hijerarhija account-a

👓 Row-Level Security (RLS)

RLS omogućava da na nivou baze definišete koji korisnik vidi koje redove. Npr. regionalni menadžer prodaje vidi samo prodavce iz svog grada, uprkos tome što svi koriste istu tabelu.

🧠 Zašto ne filtrirati u aplikaciji?

Ako RLS postavite u bazu, on važi za SVE: Excel izvještaje, PowerBI, SSMS i vašu aplikaciju. To spriječava curenje podataka ako neko "zaobiđe" aplikativni kod.

🛠️ Implementacija RLS-a
-- 1. Funkcija koja određuje ko šta vidi
CREATE FUNCTION Security.fn_UserAccessPredicate(@SalesCity AS sysname)
    RETURNS TABLE
WITH SCHEMABINDING
AS
    RETURN SELECT 1 AS fn_access_result
    WHERE @SalesCity = USER_NAME() OR USER_NAME() = 'Manager';
GO

-- 2. Sigurnosna politika koja povezuje funkciju sa tabelom
CREATE SECURITY POLICY DepartmentFilter
ADD FILTER PREDICATE Security.fn_UserAccessPredicate(DepartmentID)
ON Stats.Reports
WITH (STATE = ON);

🎭 Dynamic Data Masking (DDM)

Maskiranje ne enkriptuje podatke na disku, već ih samo "sakriva" prilikom prikaza (SELECT). Korisno za call-centre korisnike koji ne trebaju vidjeti puni broj kreditne kartice.

⚡ Maskiranje osjetljivih polja
ALTER TABLE Stats.Employees
ALTER COLUMN JMBG ADD MASKED WITH (FUNCTION = 'partial(0, "XXXXXXX", 4)');

ALTER TABLE Stats.Employees
ALTER COLUMN Email ADD MASKED WITH (FUNCTION = 'email()');

ALTER TABLE Stats.Employees
ALTER COLUMN Salary ADD MASKED WITH (FUNCTION = 'random(1000, 5000)');

-- Korisnik bez UNMASK permisije će vidjeti: XXXXXXX1234, [email protected], i nasumičnu vrijednost između 1000-5000

🛡️ Princip Najmanje Privilegije

Nikada ne koristite 'sa' (System Administrator) account za vašu web aplikaciju. Aplikativni korisnik treba imati pristup samo specifičnim procedurama ili tabelama.

🚫 SQL Injection

Nijedan sigurnosni alat vas ne može spasiti ako vaš kod nije imun na SQL Injection. Uvijek koristite parametrizovane upite i procedure umjesto spajanja (concatenation) stringova.

🎯 Praktična Vježba: Sandbox Sigurnost

Zadatak: Zaštita tabele Plata

U tabeli HR.Salaries, obični zaposlenici smiju vidjeti svoje plate, ali ne smiju vidjeti plate kolega. Računovođa smije vidjeti sve.

💡 Rješenje
-- Implementacija slična RLS primjeru iznad
-- 1. Kreirati Predicated Function baziranu na EmployeeID = current_user()
-- 2. Kreirati Security Policy
-- 3. Testirati logovanjem kao običan user

✅ Zaključak

Sigurnost je sastavni dio dizajna baze, a ne nešto što se dodaje na kraju:

📚 Sljedeća Lekcija

U Lekciji 5.4 idemo korak dalje u Enkripciju. Naučićete o Always Encrypted tehnologiji - jedinom načinu da podaci budu sigurni čak i ako se haker (ili administrator) domogne same baze.