📖 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
- Server Logins: Identitet koji se spaja na SQL Server (npr. AD korisnik ili SQL login).
- Database Users: Mapa logina unutar specifične baze podataka.
- Roles (Uloge): Grupe korisnika (npr.
db_datareader,db_datawriter). Uvijek dodjeljujte permisije ulogama, nikada direktno korisnicima!
👓 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.
-- 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.
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.
-- 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:
- ✅ Roles olakšavaju menadžment permisija.
- ✅ RLS garantuje segregaciju podataka na nivou redova.
- ✅ DDM štiti privatnost korisnika u reporting aplikacijama.
📚 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.