Маскирование и обезличивание данных
Введение
Данные нужны не только в production. Тестирование, разработка, аналитика, обучение ML-моделей — всё это требует доступа к реалистичным данным. Но предоставить разработчику полный доступ к production-базе с ФИО и паспортными данными клиентов — нарушение и регуляторных требований, и здравого смысла. Маскирование данных (Data Masking) решает эту задачу: заменяет конфиденциальные значения реалистичными, но фиктивными данными.
Маскирование, анонимизация и псевдонимизация
Три термина, которые часто путают. Различие принципиально:
Маскирование данных (Data Masking)
Маскирование данных (Data Masking) — замена конфиденциальных значений реалистичными, но фиктивными данными. Оригинальные данные сохраняются в production, маскированная копия используется для непроизводственных целей.
Примеры:
[email protected]->i***@mail.ru+79001234567->***4567Иванов Иван Иванович->И*******
Обезличивание (Data Anonymization)
Обезличивание данных (Data Anonymization) — необратимое удаление связи между данными и субъектом. Восстановить оригинальные данные невозможно. GDPR не распространяется на полностью обезличенные данные.
Псевдонимизация (Pseudonymization)
Псевдонимизация — замена идентификаторов на псевдонимы с сохранением маппинга. Обратимый процесс: при наличии ключа маппинга можно восстановить связь с субъектом. GDPR считает псевдонимизированные данные по-прежнему персональными.
| Техника | Обратимость | GDPR-статус | Применение |
|---|---|---|---|
| Маскирование | Зависит от метода | Персональные данные | Dev/test среды, аналитика |
| Обезличивание | Необратимо | Не персональные данные | Публикация, открытые датасеты |
| Псевдонимизация | Обратимо (с ключом) | Персональные данные | Исследования, ML-обучение |
Проверка знанийBioGenesis заменяет patient_id на research_id в исследовательских датасетах, сохраняя маппинг в защищённой таблице. Это маскирование, обезличивание или псевдонимизация?
Техники маскирования
Основные методы маскирования данных:
1. Подстановка (Substitution)
Замена реальных значений на значения из справочника:
# Маскирование имён из справочника
fake_names = ["Александр Иванов", "Мария Петрова", "Дмитрий Козлов"]
masked_name = random.choice(fake_names)
2. Частичное скрытие (Partial Masking)
Сохранение части данных для идентификации формата:
def mask_email(email):
"""i***@mail.ru — первый символ + домен"""
local, domain = email.split("@")
return f"{local[0]}***@{domain}"
def mask_phone(phone):
"""***4567 — последние 4 цифры"""
return f"***{phone[-4:]}"
def mask_inn(inn):
"""77****93 — первые 2 + последние 2"""
return f"{inn[:2]}{'*' * (len(inn) - 4)}{inn[-2:]}"
3. Перемешивание (Shuffling)
Перемешивание значений между записями. Каждое значение реально, но принадлежит другой записи:
# Зарплаты перемешиваются между сотрудниками
salaries = [record["salary"] for record in dataset]
random.shuffle(salaries)
for i, record in enumerate(dataset):
record["salary"] = salaries[i]
4. Шифрование с сохранением формата (FPE)
Format-Preserving Encryption сохраняет формат данных (длину, тип символов), но значение зашифровано:
7707083893 -> 4521937861 # ИНН -> ИНН (10 цифр)
Статическое vs динамическое маскирование
Статическое маскирование (Static Data Masking)
Создаётся маскированная копия базы данных. Используется для dev/test сред:
Production DB --> [Маскирование] --> Dev/Test DB
(реальные данные) (маскированные)
Преимущества: полная изоляция, нет риска утечки. Недостатки: задержка обновления, хранение копии.
Динамическое маскирование (Dynamic Data Masking)
Маскирование применяется на лету при запросе, в зависимости от роли пользователя:
-- DBA видит: [email protected]
-- Аналитик видит: i***@mail.ru
-- Тот же запрос, разные результаты
SELECT email FROM customers;
Преимущества: всегда актуальные данные, нет копий. Недостатки: сложность реализации, нагрузка на производительность.
Маскирование по ролям
| ФИО пациента | Диагноз | Геномные данные | Дата рождения | Результаты анализов | |
|---|---|---|---|---|---|
| DBA | Allow | Allow | Allow | Allow | Allow |
| Лечащий врач | Allow | Allow | Deny | Allow | Allow |
| Исследователь | Deny | Conditional | Conditional | Conditional | Allow |
| ML Engineer | Deny | Deny | Conditional | Deny | Conditional |
| Внешний аудитор | Deny | Deny | Deny | Deny | Conditional |
Проверка знанийПочему ML Engineer в BioGenesis получает 'conditional' доступ к геномным данным, а не 'allow' или 'deny'?
Сценарий: BioGenesis Lab
Сценарий: BioGenesis Lab (БиоГенезис Лаб)
BioGenesis делится геномными данными с партнёрской лабораторией для совместного исследования. Текущий процесс: Data Engineer вручную удаляет столбцы
patient_nameиbirth_dateиз CSV-экспорта. Но:
- Столбец
diagnosis_icd10+clinic_id+admission_dateв 60% случаев позволяет идентифицировать пациента- Геномные данные уникальны по определению — полная анонимизация невозможна
- Партнёрская лаборатория не подпадает под 152-ФЗ (находится в Европе)
Решение: применить k-anonymity (группирование) для квази-идентификаторов + differential privacy для геномных данных + псевдонимизацию для связи с клиническими результатами.
Практика: Data Masking Function
В БиоГенезис необходимо автоматизировать маскирование PII-полей при экспорте данных для исследований. Напишите функцию, которая применяет различные методы маскирования в зависимости от типа данных: email, телефон, имя, ИНН.
Итоги
- Маскирование заменяет значения фиктивными, сохраняя оригинал. Обезличивание необратимо. Псевдонимизация обратима с ключом
- Четыре метода маскирования: подстановка, частичное скрытие, перемешивание, FPE
- Статическое маскирование создаёт копию базы; динамическое маскирует на лету по роли
- Уровень маскирования зависит от роли: DBA видит всё, исследователь — псевдонимизированные данные
- Полная анонимизация геномных данных невозможна — требуются differential privacy и k-anonymity
В следующем уроке мы рассмотрим фреймворки классификации данных — как проектировать и внедрять систему уровней конфиденциальности для всей организации.
Проверьте понимание
Закончили урок?
Отметьте его как пройденный, чтобы отслеживать свой прогресс
Войдите чтобы оценить урок