Πώς ενεργοποιούμε το Data Masking σε PostgreSQL

- Πώς ενεργοποιούμε το Data Masking σε PostgreSQL - 16 Σεπτέμβριος 2026
- Πώς κάνουμε Bulk Export Import στη PostgreSQL (pg_dump) - 14 Σεπτέμβριος 2026
- Πώς βρίσκουμε τα Missing Indexes σε PostgreSQL - 11 Σεπτέμβριος 2026
Σε αυτό το άρθρο θα δούμε πώς μπορούμε να εφαρμόσουμε ανωνυμοποίηση και masking δεδομένων σε βάση δεδομένων PostgreSQL 14 χρησιμοποιώντας το extension PostgreSQL Anonymizer. Θα καλύψουμε τη διαδικασία εγκατάστασης, τη ρύθμιση των κανόνων masking, καθώς και τις ιδιαιτερότητες που συναντάμε σε αυτήν την έκδοση σε σχέση με το Transparent Dynamic Masking και τη χρήση των Views.
Η εγκατάσταση
Για την εγκατάσταση του extension σε RHEL Unix τρέχουμε το παρακάτω:
sudo yum install -y postgresql_anonymizer_14
Για να μπορέσει η PostgreSQL να φορτώσει το extension στον πυρήνα της, πρέπει να το δηλώσουμε στα shared_preload_libraries στο postgresql.conf:
su postgres vi $PGDATA/postgresql.conf
Προσθέτουμε ή τροποποιούμε τη γραμμή:
shared_preload_libraries = 'anon'
Στη συνέχεια, κάνουμε επανεκκίνηση την υπηρεσία της PostgreSQL για να εφαρμοστούν οι αλλαγές:
sudo systemctl restart postgresql-14
Τώρα συνδεόμαστε στη βάση δεδομένων μας και ενεργοποιούμε το extension:
CREATE EXTENSION anon CASCADE;
(Προαιρετικά, αν το επιτρέπει η αρχιτεκτονική και η έκδοση, ενεργοποιούμε το transparent masking σε επίπεδο βάσης):
ALTER DATABASE db_test SET anon.transparent_dynamic_masking TO true;
(Σημείωση: Μετά από αυτή την εντολή ενδέχεται να χρειαστεί πάλι sudo systemctl restart postgresql-14).
Για να κάνουμε έλεγχο οτι ενεργοποιήθηκε τρέχουμε το παρακάτω:
SELECT name, setting FROM pg_settings WHERE name = 'anon.transparent_dynamic_masking';
Πώς ορίζουμε κανόνες Masking
Μπορούμε να ορίσουμε masking σε επίπεδο στηλών χρησιμοποιώντας SECURITY LABEL. Για παράδειγμα, στον πίνακα customers εφαρμόζουμε masking στα email, στις χώρες και μερική απόκρυψη στα επώνυμα:
SECURITY LABEL FOR anon ON COLUMN public.customers.email IS 'MASKED WITH FUNCTION anon.fake_email()'; SECURITY LABEL FOR anon ON COLUMN public.customers.country IS 'MASKED WITH FUNCTION anon.fake_country()'; SECURITY LABEL FOR anon ON COLUMN public.customers.last_name IS 'MASKED WITH FUNCTION anon.partial(last_name, 1, $$***$$, 1)';
Η συνάρτηση partial() είναι εξαιρετικά χρήσιμη καθώς μας επιτρέπει να κρατάμε ορατούς έναν συγκεκριμένο αριθμό χαρακτήρων στην αρχή και στο τέλος, γεμίζοντας τους ενδιάμεσους με κάποιο σύμβολο (όπως ***).
Η σύνταξή της είναι:
- prefix: Αριθμός χαρακτήρων που μένουν ορατοί στην αρχή.
- padding: Το σύμβολο με το οποίο θα καλυφθούν οι ενδιάμεσοι χαρακτήρες (π.χ.
***). - suffix: Αριθμός χαρακτήρων που μένουν ορατοί στο τέλος.

Διαχείριση Ρόλων και Δικαιωμάτων
Για να ορίσουμε ποιοι χρήστες επηρεάζονται από το masking, χρησιμοποιούμε security label στους ρόλους. Ο ορισμός ενός χρήστη ως Masked σημαίνει οτι θα βλέπει τα δεδομένα θα είναι masked εφόσον είναι ενεργός ο μηχανισμός:
SECURITY LABEL FOR anon ON ROLE test_user IS 'MASKED';
Σημαντική Σημείωση για το Dynamic Masking: Οι κανόνες απόκρυψης του
pg_anonεφαρμόζονται επιτυχώς μόνο όταν ο πίνακας καλείται με το απλό του όνομα (π.χ.SELECT * FROM customers). Εάν το query περιέχει όνομα με το schema (π.χ.SELECT * FROM public.customers), ο μηχανισμός ενδέχεται να παρακαμφθεί και ο χρήστης να αποκτήσει πρόσβαση στα κανονικά, ακατέργαστα δεδομένα.
Ο ορισμός ενός χρήστη ως Admin σημαίνει οτι βλέπει πάντα τα πραγματικά δεδομένα:
SECURITY LABEL FOR anon ON ROLE test_user IS 'ADMIN';
Αν θέλουμε να αφαιρέσουμε τους κανόνες masking τρέχουμε:
SECURITY LABEL FOR anon ON COLUMN public.customers.email IS NULL; SECURITY LABEL FOR anon ON TABLE public.customers IS NULL;
Data Masking μέσω View
O πιο σταθερός και σίγουρος τρόπος για να προσφέρουμε masked δεδομένα σε απλούς χρήστες (όπως ο test_user) είναι η δημιουργία ενός Masked View:
CREATE OR REPLACE VIEW public.customers_masked AS
SELECT
customer_id,
first_name,
anon.partial(last_name, 1, '***', 1) AS last_name,
anon.fake_email() AS email,
anon.fake_country() AS country
FROM public.customers;
REVOKE SELECT ON public.customers FROM test_user;
GRANT SELECT ON public.customers_masked TO test_user;
Με αυτόν τον τρόπο, όταν ο test_user εκτελεί το query του στο view:
SELECT * FROM public.customers_masked;

Έλεγχος και Troubleshooting
Αν θέλουμε ανά πάσα στιγμή να δούμε ποιοι κανόνες masking είναι ενεργοί, τρέχουμε το παρακάτω query:
SELECT
obj.relname AS table_name,
att.attname AS column_name,
label.label AS masking_rule
FROM pg_seclabel label
JOIN pg_class obj ON label.objoid = obj.oid
JOIN pg_attribute att ON label.objsubid = att.attnum AND label.objoid = att.attrelid
WHERE label.provider = 'anon';


