Маскировка данных с помощью Anonymizer

Anonymizer — это расширение YMatrix, предназначенное для маскировки или замены персональных данных (PII) или коммерчески чувствительной информации, хранящейся в базах данных YMatrix. Эта функция реализует декларативный подход к анонимизации: пользователи могут определять правила анонимизации с помощью языка определения данных YMatrix (DDL) и применять политики анонимизации непосредственно в определениях таблиц.

Внимание!
Данная функция доступна только в коммерческой версии YMatrix Enterprise Edition. Чтобы попробовать её, нажмите Запросить демо-версию, чтобы назначить консультацию.

Предварительные требования

Перед использованием функции Anonymizer убедитесь, что расширение установлено в вашей базе данных:

-- Установите расширение anon
CREATE EXTENSION anon;
ALTER DATABASE demo SET session_preload_libraries = 'anon';

1. Примеры использования

1. Статическая маскировка данных

Статическая маскировка данных означает необратимое (или слабо обратимое при строгом контроле) преобразование чувствительных полей во время сохранения или копирования данных. Такой подход минимизирует риск утечки данных, сохраняя при этом их пригодность для бизнес-аналитики.

1.1 Пример

  1. Создайте таблицу
demo=# CREATE TABLE customer (
    id SERIAL PRIMARY KEY,
    firstname TEXT,
    lastname TEXT,
    phone TEXT,
    birth DATE,
    postcode TEXT
);
CREATE TABLE
  1. Вставьте тестовые данные
demo=# INSERT INTO customer VALUES 
(100, 'jane', 'conor', '18888888888', '1965-10-10', '1001'),
(101, 'marco', 'skywalker', NULL, '1951-10-09', '1004'),
(103, 'eralle', 'conor', '17777777777', '1965-07-10', '1003'),
(108, 'rika', 'Wang', '19999999999', '1981-10-09', '1004');
INSERT 0 4
  1. Просмотрите исходные данные до маскировки
demo=# SELECT * FROM customer;
 id  | firstname | lastname  |    phone    |   birth    | postcode
-----+-----------+-----------+-------------+------------+----------
 103 | eralle    | conor     | 17777777777 | 1965-07-10 | 1003
 101 | marco     | skywalker |             | 1951-10-09 | 1004
 100 | jane      | conor     | 18888888888 | 1965-10-10 | 1001
 108 | rika      | Wang      | 19999999999 | 1981-10-09 | 1004
(4 rows)
  1. Определите правила маскировки
demo=# SECURITY LABEL FOR anon ON COLUMN customer.lastname 
IS 'MASKED WITH FUNCTION anon.dummy_last_name()';
SECURITY LABEL

demo=# SECURITY LABEL FOR anon ON COLUMN customer.phone 
IS 'MASKED WITH FUNCTION anon.partial(phone, 2, $$******$$, 2)';
  1. Примените правила маскировки навсегда
  • Маскировка только отдельных столбцов
demo=# SELECT anon.anonymize_column('customer', 'phone');
 anonymize_column
------------------
 t
(1 row)

demo=# SELECT * FROM customer;
 id  | firstname | lastname  |   phone    |   birth    | postcode
-----+-----------+-----------+------------+------------+----------
 103 | eralle    | conor     | 17******77 | 1965-07-10 | 1003
 101 | marco     | skywalker |            | 1951-10-09 | 1004
 100 | jane      | conor     | 18******88 | 1965-10-10 | 1001
 108 | rika      | Wang      | 19******99 | 1981-10-09 | 1004
(4 rows)
  • Маскировка всей таблицы согласно заданным правилам
demo=# SELECT anon.anonymize_table('customer');
 anonymize_table
-----------------
 t
(1 row)

demo=# SELECT * FROM customer;
 id  | firstname | lastname  |   phone    |   birth    | postcode
-----+-----------+-----------+------------+------------+----------
 103 | eralle    | Kertzmann | 17******77 | 1965-07-10 | 1003
 101 | marco     | McKenzie  |            | 1951-10-09 | 1004
 100 | jane      | Ward      | 18******88 | 1965-10-10 | 1001
 108 | rika      | Schulist  | 19******99 | 1981-10-09 | 1004
(4 rows)

2. Динамическая маскировка данных

Динамическая маскировка данных сохраняет информацию в исходном виде внутри базы данных и применяет маскировку или подстановку в реальном времени только при возврате результатов запроса — в зависимости от идентификации запрашивающего пользователя, его роли или политик безопасности.

2.1 Обзор политики доступа к данным

  • Финансовый директор (CFO): может просматривать все записи клиентов.
  • Менеджер VIP-клиентов (vip_mgr): может просматривать все записи, кроме тех, которые помечены как «super vip».
  • Обычный сотрудник (bank_emp): не может просматривать никакую чувствительную информацию о клиентах.

2.2 Пример

  1. Создайте таблицу
mydb=# CREATE TABLE customers (
    id     INT PRIMARY KEY,
    status TEXT,          -- regular / vip / super vip
    pii    TEXT           -- чувствительное поле
) USING mars3;

mydb=# INSERT INTO customers VALUES 
(1, 'regular', 'Wang Wei'), 
(2, 'vip', 'Liu Han'), 
(3, 'super vip', 'Ma teng');
  1. Включите механизм динамической маскировки
mydb=# ALTER DATABASE mydb SET anon.transparent_dynamic_masking TO true;
  1. Убедитесь, что требуемые роли существуют; создайте их при необходимости
mydb=# DO $$
BEGIN
  IF NOT EXISTS (SELECT 1 FROM pg_roles WHERE rolname = 'cfo') THEN CREATE ROLE cfo LOGIN; END IF;
  IF NOT EXISTS (SELECT 1 FROM pg_roles WHERE rolname = 'vip_mgr') THEN CREATE ROLE vip_mgr LOGIN; END IF;
  IF NOT EXISTS (SELECT 1 FROM pg_roles WHERE rolname = 'bank_emp') THEN CREATE ROLE bank_emp LOGIN; END IF;
END$$;
DO
  1. Предоставьте привилегии SELECT на таблицу
mydb=# GRANT SELECT ON customers TO cfo, vip_mgr, bank_emp;
  1. Объявите правила динамической маскировки
mydb=# SECURITY LABEL FOR anon ON COLUMN customers.pii
IS 'MASKED WITH FUNCTION anon.ternary(
        (CURRENT_ROLE = ''bank_emp'')
        OR (CURRENT_ROLE = ''vip_mgr'' AND status = ''super vip''),
        ''****''::text,
        pii
    )';

mydb=# SECURITY LABEL FOR anon ON ROLE vip_mgr IS 'MASKED';
mydb=# SECURITY LABEL FOR anon ON ROLE bank_emp IS 'MASKED';
  1. Выполните запросы от имени разных ролей
  • От имени bank_emp (все PII замаскированы)
mydb=# \c mydb bank_emp
You are now connected to database "mydb" as user "bank_emp".

mydb=> SELECT * FROM customers;
 id |  status   | pii
----+-----------+------
  1 | regular   | ****
  2 | vip       | ****
  3 | super vip | ****
(3 rows)
  • От имени cfo (полный доступ)
mydb=> \c mydb cfo
You are now connected to database "mydb" as user "cfo".

mydb=> SELECT * FROM customers;
 id |  status   |    pii
----+-----------+------------
  1 | regular   | Wang Wei
  2 | vip       | Liu Han
  3 | super vip | Ma teng
(3 rows)
  • От имени vip_mgr (PII для «super vip» замаскированы)
mydb=> \c mydb vip_mgr
You are now connected to database "mydb" as user "vip_mgr".

mydb=> SELECT * FROM customers;
 id |  status   |   pii
----+-----------+----------
  1 | regular   | Wang Wei
  2 | vip       | Liu Han
  3 | super vip | ****
(3 rows)