Персональные данные

> Кратко. ФИО физических лиц, телефоны, e-mail, ИИН, лицевые счета и номера договоров потребителей полностью видит только пользователь с правом «Персональные данные потребителей полностью» (piiview). Остальным API отдаёт их замаскированными. Данные в базе не меняются: маскируется ответ. Часть путей маскирование не проходит — они перечислены ниже.

Читаю как

Кто видит полностью

  • Шаблоны ролей Редактор и Администратор. Просмотр, Режимщик и Оператор сети видят замаскированные данные.
  • Пользователь, которому право выдано отдельно (общие права в окне «Пользователи»).
  • Роль PostgreSQL (AUTH_BACKEND=pg) с правом «акты» (tgid_cap_acts) или администратор.
  • Все, если вход выключен (AUTH_DISABLED=true): каждый запрос идёт от администратора dev. На стенде с копией боевой базы это значит, что ПДн видны любому, кто открыл стенд.

Запрос без токена или с неверным токеном получает маскированный ответ.

Что маскируется

Поле узнаётся по имени колонки, значение — по виду.

Колонка (часть имени) Пример Без права
телефон: phone, telefon, kontaktn… 8-700-000-00-88 *-***-***-**-88
e-mail: mail, email, e_mail [email protected] t***@example.kz
ИИН, ИНН: iin, inn 123456789012 ********9012
лицевой счёт, договор: lic…schet, ls, lsch, account…, dogovor, contract_number 12345 *2345
владелец, абонент, заявитель: owner, owner_dop, abonent, vladelets…, vladelec…, organization_name ИП ПЕТРОВА АННА СЕРГЕЕВНА, тел. 8 700 000 0012 ИП П*** А. С., тел. * *** *** **12
то же ТОО "Пример" без изменений: организация

В полях владельца и абонента узнаются «Фамилия Имя Отчество» в любом регистре, в том числе с казахскими отчествами (-ұлы, -қызы) и с буквами, потерянными при перекодировке (? внутри слова), а также «Фамилия И. О.». Длинные номера внутри текста (от 6 цифр) маскируются как телефон. Названия организаций остаются как есть.

Свободный текст — колонки title, description, note, comment (описание нарушения, заголовок наряда, заметка): туда диспетчер вписывает ФИО и телефон жителя. В нём маскируются только «Фамилия Имя Отчество», телефоны вида +7 или 8 и десять цифр и e-mail; инициалы, даты, номера камер и участков остаются. Свободный текст маскируется только тем, кто его не правит, — у кого нет прав «Журналы» и «Справочники» (просмотр, ключи API v2 и ArcGIS, встраиваемая карта): иначе при сохранении карточки замаскированный текст затёр бы исходный.

ФИО сотрудников — начальников участков, ответственных в журналах, исполнителей нарядов — это рабочие данные, они не маскируются.

Где маскирование действует

  • JSON-ответы API — слой PiiMaskMiddleware. Ответ разбирается, только если в нём есть ключи полей ПДн.
  • MCP и помощник ИИ — инструменты маскируют результат сами, по правам владельца токена.
  • Похожие аварии — тексты маскируются для пользователя без права. В Claude API для пересортировки тексты уходят замаскированными всегда.
  • Выгрузка отчёта сверки АЛСЕКО (report.xlsx).

Где маскирования нет

Путь Почему
Ответ JSON больше PII_MAX_BYTES (16 МБ) Отдаётся как есть: рассчитано на GeoJSON сети. Списки с ПДн постраничные
Файлы Excel, Word, CSV, GeoPackage и другие выгрузки, кроме сверки АЛСЕКО Слой смотрит только на JSON
Поток помощника (NDJSON) Идёт мимо слоя; данные закрывают инструменты
Вход, администрирование пользователей (/api/v1/admin), /health, /metrics Исключены из разбора
Слои и тайлы GeoServer и martin Идут мимо API. Атрибуты слоя видны в тайлах и в карточке по клику
Помощник ИИ у пользователя с правом pii_view Ответ инструмента не маскируется — ПДн уходят в Claude API

Где в данных лежат ПДн

Категории, сверенные на копиях баз:

  • Нагрузки АЛСЕКО (Алматы, nagruzki.owner): владельцы-предприниматели и физические лица, иногда с телефоном. Отдаются через /api/alseko/* и маскируются.
  • Акты (Астана, таблица act: абонент, телефон) и телефоны организаций. Слой актов публикует GeoServer, мимо API, поэтому эти данные не маскируются. Закрыть их можно только на сервере: опубликовать слой через представление без этих колонок или с маскированием либо исключить колонки из слоя.
  • Технические условия — заявитель (organization_name) бывает физическим лицом; маскируется.
  • Раскопки и сближения — владельцы сетей; маскируются.
  • Сотрудники: логины, адреса IP и браузер в журнале действий; треки бригад (tgid_field_track) — где был сотрудник; координаты фото нарядов; упоминания в комментариях на карте.

Журналы и сроки хранения

Что Где Сколько хранится
Журнал действий: логин, город, действие, адрес запроса (параметры token, password, key заменены на ***), код ответа, IP, браузер UsersDB, activity_log ACTIVITY_LOG_DAYS, по умолчанию 730 дней (не меньше 30)
Неудачные входы — логин и адрес, без пароля там же там же
Треки бригад база города, tgid_field_track 90 дней: старые точки удаляются при записи новых
Журналы служб (stdout uvicorn) файлы журналов служб пока не удалены. Строки доступа содержат полный адрес запроса с параметрами

Подробно о журнале действий — Журнал действий.

Рекомендации

  • На сервере с доступом извне: AUTH_DISABLED=false и AUTH_REQUIRED_GET=true. Иначе чтение API открыто без входа, а GeoServer пускает всех — вместе со слоями, где лежат ПДн.
  • Право pii_view — только тем, кому оно нужно по работе. Шаблон «Редактор» его включает: снимите право галочкой, если редактору оно не нужно.
  • PII_MASKING=false — только на закрытом стенде без настоящих данных.
  • Стенды на копиях боевых баз держите с включённым входом или во внутренней сети.
  • Резервные копии баз и .env содержат ПДн и секреты: храните их с ограниченным доступом — Резервные копии.
  • Слои GeoServer с ПДн (акты, организации) публикуйте без этих колонок.

Для разработчика

  • Правила — database/pii.py (masker_for, mask_json, mask_record, may_contain), слой — pii_middleware.py, право — permissions.GENERAL["pii_view"]. Тесты — tests/test_pii.py; описание — docs/pii.md в репозитории API.
  • Новый ответ с ПДн в JSON маскируется сам, если имя ключа совпадает с правилами. Перечни лучше отдавать списком объектов {owner, …}, а не словарём с ФИО в ключах: ключи слой не проверяет.
  • Новая выгрузка файла с такими полями — через pii.mask_record для пользователя без права.
Хотите увидеть эту функцию на своих данных?Покажем ТГИД на демонстрации и ответим на вопросы инженеров.
Запросить демо