Transformacija u upitu
Brza demonstracija ili kontrolisan izveštaj, ali ne sprečava direktno čitanje izvornih podataka.
Kako tehnički zaštititi podatke o ličnosti za analitiku: metode maskiranja, pristupna prava, testovi i primer sa sintetičkim podacima penzionog fonda u ClickHouse-u.
5. novembar 2026.
PII maskiranje skriva ili menja podatke o ličnosti za određene korisnike, tokove ili svrhe, a zadržava mogućnost dozvoljene analitike. To nije funkcija jednog proizvoda. Bilo da su podaci u bazi, warehouse sistemu, pipeline procesu ili API-ju, prvo treba odrediti osetljiva polja i granice pristupa.
SQL funkcija može sakriti ime, ali time nisu automatski zaštićeni izvorna tabela, druge uloge, eksport, backup ili male grupe. Prava implementacija polazi od potrebnog rezultata, bira odgovarajuću tačku kontrole i proverava ponašanje za dozvoljene i nedozvoljene korisnike.
Kao praktičan primer koristimo samo sintetičke podatke iz izmišljenog penzionog fonda i ClickHouse SQL. Ista logika važi za osiguranje, zdravstvo i druge organizacije.
Statičko maskiranje menja kopiju ili tok pre deljenja. Dinamičko maskiranje menja vrednost pri izvršavanju upita, često u zavisnosti od uloge. Potpuna redakcija zamenjuje celo polje, a delimično maskiranje ostavlja pojedine delove. Ako je za analitiku potreban samo zbirni pokazatelj, uklanjanje identifikatora ili agregacija mogu biti bolji izbor.
Maskiranje nije automatski anonimizacija. Izvorni podaci često ostaju sačuvani. Delimične vrednosti, stabilni ključevi i retke kombinacije mogu dovesti do identifikacije. Pseudonimizacija, tokenizacija i kriptografske metode imaju dodatne zahteve za čuvanje mapa, ključeva i upravljanje životnim ciklusom.
Najpre se evidentiraju podaci o ličnosti u izvornim tabelama, događajima, fajlovima, logovima i povezanim proizvodima. Definišu se dozvoljena svrha, osetljivost i korisnici kojima su pojedina polja stvarno potrebna. Katalog pomaže u dokumentaciji, ali pristup se sprovodi u bazi, identitetskom sistemu, API-ju i pri izvozu.
Zatim se definišu data proizvodi i uloge. Za zbirne izveštaje uklanjaju se nepotrebni identifikatori. Za detaljne upite bira se kontrolisani View, dinamička politika ili transformacija pre unosa. Na kraju se proveravaju dozvoljeni i zabranjeni pristupi i održavaju kontrole tokom promena šeme.
Penzioni fond služi samo kao ilustracija. Isto važi za podatke o polisama, pacijentima, zaposlenima i klijentima.
Brza demonstracija ili kontrolisan izveštaj, ali ne sprečava direktno čitanje izvornih podataka.
Stabilan interfejs sa ograničenim poljima; korisnik ne sme imati alternativan pristup sirovim podacima.
Prikaz zavisi od uloge i mora biti podržan u konkretnom sistemu.
Primerena kada originalni PII ne treba uopšte čuvati u analitičkom sloju.
Često najbolji pristup za zbirnu analitiku, uz proveru malih grupa i zaključivanja iz ponovljenih upita.
Najpre razlikujemo zaposlene koji obrađuju pojedinačne zahteve članova, analitičare, administratore platforme i spoljne primaoce podataka. Obradi konkretnog predmeta mogu biti potrebni lični identifikatori. Analitici fonda su obično potrebne ukupne obaveze, trendovi i odobreni segmenti, ali ne i imena ili brojevi računa. Administratorski nalog ne znači automatski i pravo poslovnog uvida u podatke svih članova.
Klasifikacija ne obuhvata samo očigledne PII kolone. `member_id` i `pension_account` jesu stabilni identifikatori koji omogućavaju povezivanje. Čak i finansijski iznos može postati identifikujući kada u izabranoj grupi ima veoma malo članova. Retka kombinacija fonda, perioda i neuobičajeno velikog iznosa može otkriti osobu i bez prikazanog imena.
Iz ovoga proizlaze proverljivi zahtevi: ograničiti sirove identifikatore, razdvojiti uloge, beležiti pristup i izvoz, kontrolisati detaljne upite i razmotriti rizik malih grupa. Dinamičko maskiranje je samo jedna od mera.
Identitet je dostupan za konkretan opravdan postupak, ne za masovni izvoz svih članova fonda.
Pristup odobrenim zbirnim pokazateljima. Identifikatori se uklanjaju ili maskiraju samo tamo gde je detaljan prikaz opravdan.
Najmanje potrebne privilegije i poseban, odobren i proverljiv postupak za privilegovani uvid.
Podaci ograničeni svrhom, definisanim nivoom detalja, kontrolom izvoza i rokovima čuvanja.
-- Primer: isključivo sintetički podaci
CREATE TABLE pension_members (
member_id UInt64,
full_name String,
email String,
pension_account String,
fund_id String,
accrued_pension_eur Decimal(14, 2)
) ENGINE = MergeTree
ORDER BY
(fund_id, member_id);
INSERT INTO
pension_members
VALUES
(
101,
'Mara Primer',
'mara@example.invalid',
'PF-000101',
'FUND-A',
128500.00
),
(
102,
'Luka Primer',
'luka@example.invalid',
'PF-000102',
'FUND-A',
91200.00
);
SQL funkcije mogu zameniti vrednosti u rezultatu. To je korisno za demonstraciju, ali samo po sebi ne ograničava prava na izvornu tabelu. Korisnik koji ima direktan pristup može pokrenuti drugi upit i videti originalne vrednosti.
Delimično sakrivanje e-mail adrese može biti korisno u određenim procesima podrške, ali i dalje otkriva identifikacione fragmente. Kada dodatni detalji nisu potrebni, prednost imaju potpuno maskiranje ili izostavljanje polja.
-- Ad-hoc masking does NOT restrict underlying table access
SELECT
fund_id,
'[MASKED]' AS member_name,
concat (
substring(email, 1, 2),
'****',
substring(email, position(email, '@'))
) AS email_preview,
accrued_pension_eur
FROM
pension_members
ORDER BY
fund_id;
View definiše dozvoljena polja i menja prikaz direktnih identifikatora. Uloga koja koristi View ne sme imati i pristup izvornoj tabeli ili njenim kopijama. Prava i kontekst izvršavanja View-a moraju se praktično testirati.
Primeri različitih postupaka su alternative, ne skup SQL naredbi koje treba bez provere sve izvršiti u istoj bazi.
Običan ClickHouse View uglavnom zahteva da korisnik ima prava na izvornu tabelu. Za korisnika koji sme da vidi samo odobreni View koristimo SQL SECURITY DEFINER i namenski nalog sa minimalnim pravima. Analitičar dobija SELECT na View, a ne na sirovu tabelu. Prava definera i alternativni pristupi moraju se posebno proveriti.
-- Izvršiti kao namenski View owner sa minimalnim pravima
-- SQL SECURITY DEFINER ne zahteva raw-table prava za čitaoca
CREATE VIEW pension_members_masked DEFINER = CURRENT_USER SQL SECURITY DEFINER AS
SELECT
fund_id,
'[MASKIRANO]' AS full_name,
'[MASKIRANO]' AS email,
accrued_pension_eur
FROM
pension_members;
-- Posebno proveriti i ograničiti privilegije vlasnika.
-- This role must not also receive direct raw-table access
CREATE ROLE pension_view_reader;
GRANT
SELECT
ON pension_members_masked TO pension_view_reader;
-- This account must already exist; review inherited grants
GRANT pension_view_reader TO reporting_reader;
Primer sadrži direktne identifikatore (`full_name`, `email`, `pension_account`), stabilni ključ (`member_id`) i polja za analitiku (`fund_id`, `accrued_pension_eur`). Klasifikaciju treba dokumentovati zajedno sa svrhom, vlasnikom podataka, dozvoljenim ulogama i rokovima čuvanja.
Dva sintetička reda dovoljna su za demonstraciju SQL-a, ali nisu dokaz statističke ili bezbednosne zaštite. U test okruženju treba obuhvatiti prazne vrednosti, duplikate, promene uloga, neobične JOIN operacije, alternativne naloge i male grupe.
Kada su potrebni samo agregati, analitičkom timu je često bolje ponuditi zaseban odobren data proizvod bez identifikatora. Dinamičko maskiranje ima smisla kada legitimni korisnici iste tabele treba da vide različite prikaze.
Metapodaci prikazuju kolone i tipove, ali sami ne određuju rizik. Stabilni identifikator člana ili neuobičajen iznos mogu omogućiti povezivanje sa osobom i kada naziv kolone ne sadrži očigledan PII pojam.
Klasifikaciju dopunjuju poslovna svrha, vlasnik podataka, dozvoljene uloge, rokovi čuvanja i ograničenja izvoza.
-- Metadata inventory only; human classification still required
SELECT
name,
type
FROM
system.columns
WHERE
database = currentDatabase ()
AND table = 'pension_members'
ORDER BY
position;
Nativne politike maskiranja mogu biti primerene kada različite legitimne uloge koriste istu fizičku tabelu, ali ne smeju videti iste podatke. ClickHouse Cloud dokumentuje ovu funkcionalnost od verzije 25.12. Analitička uloga u primeru vidi fiksne zamenske vrednosti za direktne identifikatore.
Sama politika nije dovoljna. Prava se ograničavaju na potrebne kolone, nepotrebni member_id namerno se izostavlja, a nasleđene dozvole i alternativni pristupi sirovim podacima moraju se proveriti. Ista logika važi i za druge platforme, uz različitu sintaksu.
-- ClickHouse Cloud 25.12+: izvorna masking politika
CREATE ROLE pension_analyst;
CREATE MASKING POLICY pension_member_pii ON pension_members
UPDATE full_name = '[MASKIRANO]',
email = '[MASKIRANO]',
pension_account = '[MASKIRANO]' TO pension_analyst;
-- Samo potrebne kolone; member_id se namerno izostavlja
GRANT
SELECT
(
full_name,
email,
pension_account,
fund_id,
accrued_pension_eur
) ON pension_members TO pension_analyst;
-- Korisnik analytics_reader mora prethodno da postoji
GRANT pension_analyst TO analytics_reader;
Masking Policy menja vrednosti koje dobija dodeljena uloga u trenutku izvršavanja upita. Originalni podaci ostaju sačuvani. Pravilo ne ukida druga prava i ne štiti kopije u povezanim sistemima. Zato se prava pristupa i masking izraz moraju testirati zajedno.
Analitičkoj ulozi dodeljujemo samo potrebne kolone. Nepromenjeni `member_id` nije neophodan za agregatne analize i ne treba ga dodeljivati. Takođe se proveravaju nasleđene dozvole, dodatni nalozi, servisi i izvoz. Jedan uspešno maskiran SELECT nije dokaz zaštite celog sistema.
Nativne masking politike dokumentovane su za ClickHouse Cloud od verzije 25.12. Pre uvođenja proveriti stvarno izdanje, verziju i evaluaciju pravila: https://clickhouse.com/docs/products/cloud/guides/security/data-masking.
-- Izvršava administrator sa odgovarajućim pravima:
SHOW MASKING POLICIES;
SHOW GRANTS FOR analytics_reader;
-- Ponovo se povezati kao analitički korisnik:
SELECT
fund_id,
full_name,
email,
pension_account
FROM
pension_members
LIMIT
10;
-- Očekivanje: prikazane vrednosti identifikatora su maskirane.
-- Testirati i druge naloge, role i puteve pristupa.
Pozitivnim testom proverava se da li analitički korisnik vidi maskirane vrednosti. Negativnim se proverava da li je zabranjen pristup nepotrebnom identifikatoru. Testovi se izvršavaju sa stvarnim korisničkim nalogom aplikacije, ne kao administrator.
Treba proveriti i nasleđene role, servisne naloge, direktna prava, izvoz, kopije i promene šeme. Jedan uspešan maskirani upit nije dokaz zaštite celog sistema.
-- Reconnect as analytics_reader; ensure pension_analyst is active
SELECT
full_name,
email,
pension_account,
fund_id
FROM
pension_members
LIMIT
10;
-- Expect masked identifiers, not raw values.
-- Run as analytics_reader, not as an administrator
SELECT
member_id
FROM
pension_members
LIMIT
1;
-- Expect ACCESS_DENIED; otherwise examine effective grants.
Sledeći zbirni upit pokazuje predviđenu poslovnu upotrebu. U produkcionoj arhitekturi analitičari bi po pravilu trebalo da pristupaju jasno odobrenim data proizvodima. Čak i uz maskirana imena, detaljni zapisi mogu omogućiti zaključivanje o pojedincima.
Potrebni su klasifikacija podataka, odvojene uloge, revizijski logovi, kontrola izvoza i pravila čuvanja i brisanja. Za testiranje su pogodniji sintetički podaci ili zasebno provereni postupci pseudonimizacije.
-- Upit analitičkog korisnika
SELECT
fund_id,
count() AS members,
sum(accrued_pension_eur) AS liabilities_eur
FROM
pension_members
GROUP BY
fund_id;
-- Provera pravila maskiranja
SHOW MASKING POLICIES;
U izveštaju nije neophodno prikazati ime da bi se otkrio osetljiv podatak. Ako izabrani segment sadrži samo jednog člana, prikaz njegovog penzijskog iznosa praktično otkriva podatak o toj osobi. Više preklapajućih upita može izdvojiti pojedinca oduzimanjem rezultata. Maskiranje direktnih identifikatora ne sprečava takvu analizu.
Primer ispod prikazuje minimalan broj članova po grupi. `HAVING` klauzula koju analitičar sam bira nije bezbednosna politika. U produkciji se dozvoljena granularnost mora nametnuti kroz kontrolisani data proizvod ili servisni sloj, uz proveru ponovljenih i kombinovanih upita.
Pošto testni skup sadrži samo dva reda, prag od deset članova namerno ne vraća nijedan rezultat. Odabir praga zavisi od procene rizika, a ne predstavlja univerzalni dokaz anonimnosti.
-- Ilustracija, ne kompletna kontrola otkrivanja podataka
SELECT
fund_id,
count() AS member_count,
sum(accrued_pension_eur) AS total_liabilities_eur
FROM
pension_members
GROUP BY
fund_id
HAVING
count() >= 10;
-- Dva sintetička člana ne ispunjavaju uslov.
Ne postoji univerzalno najbolje maskiranje. Funkcija u upitu je jednostavna, ali se može zaobići ako je dozvoljeno direktno čitanje izvorne tabele. Kontrolisani View ograničava interfejs; dinamičke politike obezbeđuju prikaz po ulogama; maskiranje pre unosa sprečava čuvanje originalnog PII u analitičkom sloju.
Baza je detalj implementacije, a ne tema članka. ClickHouse primeri prikazuju različite tačke kontrole i ne treba ih bez razmišljanja kombinovati: korisnik može naslediti više uloga, delimično maskiranje može otkriti identitet, a politika ne štiti podatke već kopirane van baze.
**Izvorne Masking Policies** imaju smisla kada različite uloge legitimno koriste istu tabelu, ali ne smeju da vide iste vrednosti. Prednost je primena pri upitu; ograničenja su očuvani originalni podaci, alternativni pristupi i kopije izvan baze.
**Odobreni Views ili posebni data proizvodi** pogodni su kada su analitici potrebni zbirni pokazatelji i odabrane poslovne dimenzije. Uklanjanje nepotrebnih identifikatora smanjuje rizik, ali zahteva kontrolu definicija, prava, promena šeme i stvarnog izvršavanja upita.
**Pseudonimizacija pre učitavanja** omogućava povezivanje događaja tokom vremena bez unošenja direktnih identiteta u analitiku. Mapa i ključevi moraju ostati odvojeno zaštićeni; brisanje, ispravke i migracije zahtevaju poseban dizajn.
Ovi pristupi nisu međusobno isključivi. Za regulisane podatke često je primerena kombinacija minimalnih data proizvoda, uskih prava i dodatnog maskiranja.
Alternativna arhitektura obrađuje podatke pre čuvanja u analitičkoj tabeli. ClickHouse EPHEMERAL polje može biti ulaz za MATERIALIZED izraz, a samo izvorno polje se ne čuva. Ovo je zaseban primer, ne dodatna konfiguracija prethodne tabele.
Delimično sakrivena e-mail adresa i dalje može biti lični podatak. Ako adresa nije potrebna, potpuno je ukloniti. Ako je potrebno povezivanje zapisa, koristiti zasebno zaštićenu tokenizaciju ili pseudonimizaciju.
-- Separate demonstration: ingest-time reduction
CREATE TABLE pension_export_minimized (
email String EPHEMERAL,
email_preview String MATERIALIZED concat (
substring(email, 1, 2),
'****',
substring(email, position(email, '@'))
),
fund_id String,
accrued_pension_eur Decimal(14, 2)
) ENGINE = MergeTree
ORDER BY
fund_id;
INSERT INTO
pension_export_minimized (email, fund_id, accrued_pension_eur)
VALUES
('sample@example.invalid', 'FUND-A', 128500.00);
SELECT
fund_id,
email_preview,
accrued_pension_eur
FROM
pension_export_minimized;
-- The partial email remains potentially identifying.
Promene masking politika verzionisati, pregledati i testirati sa dozvoljenim i nedozvoljenim ulogama. `CREATE OR REPLACE` je primer izmene prethodnog pravila, ne dodatni korak koji se uvek automatski izvršava.
-- Alternative revision of the earlier policy, not an extra layer
CREATE
OR REPLACE MASKING POLICY pension_member_pii ON pension_members
UPDATE full_name = '[REDACTED]',
email = '[REDACTED]',
pension_account = '[REDACTED]' TO pension_analyst;
SHOW MASKING POLICIES;
Popisati korisnike, servisne naloge, direktna prava, nasleđene uloge i mogućnosti izvoza.
Proveriti zabranjena polja, pogrešne uloge, ukinuta prava, druge API-je i kopije, ne samo uspešan maskirani upit.
Proveriti backup, staging, BI izvoz, fajlove, tikete i aplikativne logove.
Odrediti dozvoljene pokazatelje, grupe i dimenzije zajedno sa odgovornim timom.
Verzionisati politike, raditi regresione testove i ponovo proveravati promene šema i prava.
Definisati revizijske tragove, ukidanje prava, brisanje i postupanje u slučaju incidenta.
Tehnička referenca: https://clickhouse.com/docs/products/cloud/guides/security/data-masking. Primer koristi izmišljene podatke i nije potvrđen u stvarnoj produkcionoj ClickHouse instanci. Verziju, nasleđivanje prava i sve putanje pristupa treba testirati u ciljnom sistemu.
Maskiranje i pseudonimizacija nisu automatska anonimizacija. U konkretnom penzionom fondu treba proveriti primenljive propise o zaštiti podataka i obaveze sektora, uz odgovorne pravne i bezbednosne timove. Povezano: https://valanor.co/sr/data-governance.
Masking Policy je samo jedna kontrola u širem Data Governance modelu. Za kompletnu zaštitu potrebni su odgovornosti, ugovori o podacima, prava pristupa, evidencija i pravila izvoza. Više: https://valanor.co/sr/data-governance i https://valanor.co/sr/maskiranje-podataka.
ClickHouse, Snowflake, BigQuery, PostgreSQL i druge platforme koriste različitu sintaksu i semantiku prava. Osnovni postupak ostaje isti: klasifikacija, minimizacija, kontrola pristupa, testiranje svih puteva i nadzor izvoza.
U zdravstvu i osiguranju treba dodati sektorske obaveze i različite dozvoljene svrhe. SQL maskiranje samo po sebi nije garancija pravne usklađenosti. Više: https://valanor.co/sr/data-governance, https://valanor.co/sr/maskiranje-podataka i https://clickhouse.com/docs/products/cloud/guides/security/data-masking.
Samo ako su ograničene sve dozvole, alternativni izvori, povezani servisi i izvozi. Masking Policy sama po sebi nije dovoljna.
Maskiranje može biti odgovarajuća tehnička mera, ali su dodatno potrebni dozvoljena svrha, pravni osnov, procena rizika, minimizacija i organizacione kontrole.
Ne. Deterministički hash može se povezivati između izvora ili otkriti nagađanjem. Za trajne veze treba proceniti tokenizaciju ili druge bezbedne metode pseudonimizacije.
Ne. Ovde prikazana izvorna funkcija dokumentovana je za ClickHouse Cloud od verzije 25.12. Izdanje i verziju treba proveriti.
Tehnički razgovor
Razgovarajmo o modelu pristupa, klasifikaciji i proveri vašeg konkretnog data proizvoda.
Managing Director
aleks@valanor.co
Bulevar Milutina Milankovića 7Đ, 11070 Beograd, Srbija
