Прежде чем перейти к статье, хочу вам представить, экономическую онлайн игру Brave Knights, в которой вы можете играть и зарабатывать. Регистируйтесь, играйте и зарабатывайте!
В настоящее время практически все ИТ-продукты работают с персональной информацией пользователя: ФИО, телефон, e-mail, паспортные и другие идентифицирующие данные. Для обеспечения защиты прав и свобод, человека и гражданина при обработке его персональных данных в Российской Федерации существует Федеральный закон от 27.07.2006 N 152-ФЗ “О персональных данных”.
Согласно пункту 2 статьи 5 обработка персональных данных должна ограничиваться достижением конкретных, заранее определенных и законных целей, а в статье 6 установлено, что обработка персональных данных осуществляется с согласия субъекта персональных данных. Все это накладывает определенные ограничения на разработку программных продуктов и заставляет разработчиков думать о возможных последствиях несоблюдения норм законодательства.
Хочется заметить, что во многих случаях для непосредственной разработки личные данные пользователя не важны, необходима сама структура данных, их полнота и количество. По этой причине, а также в рамках соблюдения закона, персональные данные пользователя можно анонимизировать, чем и пришлось заниматься в рамках своей профессиональной деятельности.
Под анонимизацией в рамках статьи стоит понимать процесс изменения данных введенных пользователем и сохраненных в БД на программно сгенерированные данные, которые по виду и типу совпадают с реальными, но не имеют отношения к конкретному пользователю. О том, как была организована работа по этому вопросу и какой в итоге получился результат и будет эта статья.
Начало законопослушного программиста
Прежде чем приступить к описанию процесса анонимизации базы данных, опишу задачу, которая была мне поставлена:
Подключить и использовать библиотеку django-gdpr-assist.
Реализовать локальный плагин для Flake8, который проверял бы корректность анонимизации данных.
Написать
manage.py
команду для анонимизации базы данных.
В своей работе я использую Django Rest Framework, по этой причине ниже представленный код будет реализован на языке программирования Python. Структура статьи будет соответствовать задаче, описанной выше, а в конце поделюсь мыслями, к которым пришел при ее выполнении и ссылкой на код плагина. Также приведу код модели, с которой мы будем работать.
from django.db import models
from django.utils.translation import gettext_lazy as _
from django_nova_users.models import User
from rules.contrib.models import RulesModelBase, RulesModelMixin
class Account(RulesModelMixin, models.Model, metaclass=RulesModelBase):
"""Аккаунт."""
user = models.OneToOneField(
User,
on_delete=models.CASCADE,
related_name='account',
)
photo = models.ImageField(
_('аватар'),
upload_to='media',
blank=True,
null=True,
)
birth_date = models.DateField(
_('дата рождения'),
blank=True,
null=True,
)
passport_series = models.CharField(
_('серия паспорта'),
max_length=4,
blank=True,
)
passport_number = models.CharField(
_('номер паспорта'),
max_length=4,
blank=True,
)
class Meta(object):
verbose_name = _('аккаунт')
verbose_name_plural = ('аккаунты')
def str(self):
return self.user.full_name
Использование библиотеки django-gdpr-assist для анонимизации данных
Общий регламент защиты персональных данных (General Data Protection Regulation, GDPR) — постановление Европейского Союза, направленное на возможность дать гражданам контроль над собственными персональными данными.
Не смотря на то, что Россия не входит в Европейский союз, Федеральный закон № 152 “О персональных данных” содержит в себе ключевые принципы данного положения, а рассматриваемая библиотека позволяет из соблюсти: анонимизировать личные данные пользователя.
Данная библиотека работает следующим образом:
Создается база данных
gdpr_log
, которая состоит из двух таблиц: таблица, где содержится информация о миграциях и таблица-журнал, где фиксируется действие, приложение, модель иpk
объекта надо которым осуществлено действие. По умолчанию записи в журнале создаются при анонимизации экземпляра или при использовании командыanonymise_db
данной библиотеки.В базе данных, которая являются стандартной (default) в проекте, создается таблица
gdpr_assist_privacyanonymised
, где также фиксируются объекты, которые подверглись изменению.Процесс анонимизации представляет собой изменение определенных данных, которые хранятся в стандартной (default) базе данных на программно-сгенерированные данные.
Данные, которые были изменены в ходе процесса анонимизации, нельзя привести к первоначальному виду.
Установка и настройка данной библиотеки не займет много времени и хорошо описана в официальной документации, перейдем сразу к вопросам ее использования. GDPR-assist позволяет анонимизировать определенные поля модели двумя способами:
Автоматическая регистрация через определение параметра конфиденциальности в
PrivacyMeta
классе модели.Ручная регистрация через использование функции
gdpr_assist.register(<ModelClass>, [<PrivacyMetaClass>])
.
После изучения документации я решил воспользоваться первым способом для анонимизации данных, но в ходе его реализация я столкнулся с проблемой: в модели не был доступен атрибут _privacy_meta
. В ходе некоторых манипуляций мне так и не удалось получить доступ к данному атрибуту, поэтому я воспользовался вторым способом: использовал функцию gdpr_assist.register()
.
Анонимизация полей, указанных в переменной fields внутри class PrivacyMeta может происходить по умолчанию, а может быть переопределена пользовательским анонимайзером через метод класса PrivacyMeta anonymise<field_name>
(для генерирования данных я использую библиотеку Faker).
Реализация локального плагина для Flake8 по контролю анонимизации данных
Изначально, я хотел написать статью только о том, как я реализовывал испытывал мучения и страдал плагин для Flake8, но после, не найдя чего-то похожего, решил рассказать все, что удалось узнать в ходе выполнения задачи.
Кто-то из вас может задаться вопрос причем тут анонимизация БД и плагин? При разработке мы часто меняем модели данных, удаляем и добавляем поля. Плагин контролирует разработку, позволяет программисту не держать в голове тонну информации, а сконцентрироваться на поставленной задаче. Разрабатываемый плагин будет учитывать изменения, вносимые в модели данных и позволит не забыть анонимизировать данные, идентифицирующие пользователя, а также подскажет как правильно это делать.
Написание плагина для flake8 у меня отняло много времени, сил и нервов, но по итогу я сделал для себя некоторые выводы, о которых поделюсь в самом конце. Теперь от лирики перейдем к делу! Мой путь начался с поиска информации в Интернете и ее изучении. Самое полезное что мне удалось найти, и что стало моей отправной точкой:
Видео о написании плагина на flake8 и официальная документация.
Первоначальная информация об абстрактном синтаксическом дереве и официальная документация модуля ast.
Статья How to write Flake8 plugins