Персональные данные
> Кратко. ФИО физических лиц, телефоны, 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для пользователя без права.
