Быстрый старт
Развертывание
Моделирование данных
Подключение
Запись данных
Миграция
Запросы
Операции и обслуживание
Типовое обслуживание
Секционирование
Резервное копирование и восстановление
Масштабирование
Зеркалирование
Управление ресурсами
Безопасность
Мониторинг
Настройка производительности
Устранение неполадок
Справочник
Руководство по инструментам
Типы данных
Хранилище данных
Выполняющая система
Потоковая передача
Восстановление после сбоев
Конфигурация
Индексы
Расширения
Справочник по SQL
Часто задаваемые вопросы
Anonymizer — это расширение YMatrix, предназначенное для маскировки или замены персональных данных (PII) или коммерчески чувствительной информации, хранящейся в базах данных YMatrix. Эта функция реализует декларативный подход к анонимизации: пользователи могут определять правила анонимизации с помощью языка определения данных YMatrix (DDL) и применять политики анонимизации непосредственно в определениях таблиц.
Внимание!
Данная функция доступна только в коммерческой версии YMatrix Enterprise Edition. Чтобы попробовать её, нажмите Запросить демо-версию, чтобы назначить консультацию.
Перед использованием функции Anonymizer убедитесь, что расширение установлено в вашей базе данных:
-- Установите расширение anon
CREATE EXTENSION anon;
ALTER DATABASE demo SET session_preload_libraries = 'anon';
Статическая маскировка данных означает необратимое (или слабо обратимое при строгом контроле) преобразование чувствительных полей во время сохранения или копирования данных. Такой подход минимизирует риск утечки данных, сохраняя при этом их пригодность для бизнес-аналитики.
demo=# CREATE TABLE customer (
id SERIAL PRIMARY KEY,
firstname TEXT,
lastname TEXT,
phone TEXT,
birth DATE,
postcode TEXT
);
CREATE TABLE
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
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)
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)';
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)
Динамическая маскировка данных сохраняет информацию в исходном виде внутри базы данных и применяет маскировку или подстановку в реальном времени только при возврате результатов запроса — в зависимости от идентификации запрашивающего пользователя, его роли или политик безопасности.
vip_mgr): может просматривать все записи, кроме тех, которые помечены как «super vip».bank_emp): не может просматривать никакую чувствительную информацию о клиентах.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');
mydb=# ALTER DATABASE mydb SET anon.transparent_dynamic_masking TO true;
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
mydb=# GRANT SELECT ON customers TO cfo, vip_mgr, bank_emp;
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';
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)