§ БЛОГ

Защита данных в workflow: нода Staqflow находит и маскирует персональные данные и секреты

Новая нода «Защита данных» (Guardrails) находит в данных процесса телефоны, ФИО, паспорта, СНИЛС, карты, пароли и API-ключи и сообщает о них, делит поток на «Чисто» и «Найдено» или маскирует. Правила работают без модели и сверяют номера по контрольным суммам. Остальное, например адреса и даты рождения, может искать недорогая локальная модель на ваших серверах через Ollama или vLLM: тексты клиентов не уходят стороннему провайдеру.

Защита данных в workflow: нода Staqflow находит и маскирует персональные данные и секреты

Клиент пишет в чат поддержки: «Не проходит оплата, карта 4276 3800 1234 5678, телефон для связи +7 916 123-45-67». Через минуту это сообщение лежит в CRM, уходит в модель, которая готовит ответ, попадает в журнал и в отчёт для руководителя. Номер карты оказался в четырёх местах, где его быть не должно.

Такие данные приходят в процессы постоянно: в письмах, заявках, расшифровках звонков, выгрузках из 1С. Нода «Защита данных» (в английском интерфейсе Guardrails) стоит на пути этого потока и решает, что с ними делать: найти, отделить или замаскировать.

Что такое нода «Защита данных»

«Защита данных» - это нода Staqflow, которая находит в данных процесса персональные данные и секреты и по выбору сообщает о них, разделяет поток на «Чисто» и «Найдено» или заменяет найденное метками. Она распознаёт больше двадцати видов данных: e-mail, телефоны, ФИО, паспорта, СНИЛС, ИНН, банковские карты, счета, IP-адреса, пароли, API-ключи, строки подключения к базам и другие. Основная проверка идёт правилами на сервере Staqflow, без модели и без внешних запросов; номера документов и карт сверяются по контрольным суммам. По желанию подключается модель, которая ищет то, что правилам не под силу, например адреса и даты рождения; это может быть недорогая локальная модель на ваших серверах.

Три действия

ДействиеЧто делаетКогда брать
НайтиДобавляет к элементу отчёт со списком находок и их значениямиРазобраться, что вообще ходит по процессу
ПроверитьОтправляет элементы в выход «Чисто» или «Найдено»Не пускать данные дальше, пока их не посмотрит человек
ЗамаскироватьЗаменяет найденное в тексте и передаёт элемент дальшеОтправить текст в модель, журнал или внешний сервис без чувствительных данных

Проверять можно весь элемент целиком, со всеми вложенными полями, или один текст, заданный выражением, например {{ $json.body }}. В первом случае в отчёте указан путь к полю, где нашлось значение.

Что нода находит

Каждый вид данных включается отдельной галочкой. Большинство включены сразу, а те, что чаще дают ложные срабатывания, по умолчанию выключены.

Контакты и люди. E-mail, телефоны с «+» любой страны и без «+» в форматах выбранных стран (по умолчанию Россия, Казахстан, Узбекистан и Беларусь), ФИО, ники в мессенджерах и ссылки t.me. Имена и отчества ищутся по словарю, в который входят русские, среднеазиатские и кавказские имена во всех падежах, а фамилия засчитывается рядом с именем или инициалами. Можно передать свой список фамилий, например сотрудников из предыдущей ноды: они найдутся и без имени рядом.

Документы и деньги. Паспорт РФ, СНИЛС, ИНН, ОГРН, казахстанские ИИН и БИН, узбекские ПИНФЛ и паспорт, белорусский личный номер. Банковские карты проверяются по алгоритму Луна, IBAN по длине страны и контрольной сумме, расчётные счета, БИК и криптокошельки тоже распознаются. Номер, который не сходится по контрольной сумме, находкой не считается: так отсекается большая часть случайных длинных чисел вроде номеров заказов.

Секреты. Пароли после слов «пароль:», «pwd=» и в адресах вида user:pass@host, API-ключи по префиксам сервисов, токены Telegram-ботов, JWT, приватные ключи, строки подключения к PostgreSQL, MySQL, MongoDB, Redis. Для неизвестных ключей есть поиск случайных строк по энтропии с тремя уровнями чувствительности.

Инфраструктура. IP- и MAC-адреса, порты, внутренние хосты в зонах .local, .corp, .internal и в ваших доменах, сетевые пути и пути к файлам, логины вида ДОМЕН\логин и записи Active Directory, ID AnyDesk, TeamViewer и RustDesk.

Свои слова. Названия проектов, кодовые имена, всё, что у вас считается внутренним. Регистр не важен.

Письма в HTML тоже разбираются: адрес, разорванный тегом посередине, или кириллица, записанная HTML-сущностями, находятся так же, как обычный текст.

Как маскирует

У действия «Замаскировать» три режима замены.

  • Метка вида. Значение заменяется на <EMAIL>, <PHONE>, <CARD>. Модели и коллеге понятно, что здесь было, но не видно, что именно.
  • Частично. i***@mail.ru, +7 *** ***-**-67, **** **** **** 1234, ФИО превращается в инициалы. Удобно для операторов, которым нужно сверить последние цифры с клиентом. Пароли, ключи и логины в этом режиме всё равно заменяются меткой: по куску пароля его можно подобрать.
  • Хеш. Одинаковое значение получает одну и ту же метку во всех элементах, например <EMAIL:3f9a1c0b2e>. Так можно считать, сколько обращений пришло от одного клиента, не храня его адрес. Это псевдоним, а не шифрование: номер телефона по такому хешу подбирается перебором, нода прямо предупреждает об этом в описании режима.

Проверка моделью: можно своей, локальной

Правила хорошо находят то, у чего есть формат: номер, адрес почты, ключ с префиксом. Адрес доставки, дату рождения, диагноз или сумму сделки правилами не поймать. Для этого у ноды есть галочка «Дополнительно проверять моделью»: снизу подключается модель чата, и в поле «Что ещё считать чувствительным» можно своими словами описать, что искать, например «номера договоров, диагнозы».

Эту модель не обязательно брать у облачного провайдера. В ноде модели чата есть вариант «Своя или совместимая с OpenAI»: Ollama, vLLM, LM Studio, LiteLLM и любой сервер на том же протоколе. Модель можно поднять на сервере компании, и тогда тексты клиентов не уходят стороннему провайдеру моделей: проверка идёт на вашем железе. А если Staqflow тоже стоит на ваших серверах, данные вообще не покидают вашу сеть, ни на этапе правил, ни на этапе модели.

Для такой проверки не нужна большая и дорогая модель. Задача узкая: прочитать фрагмент текста и выписать из него дословные цитаты нужных видов. Текст уходит модели частями до 12 000 символов, это примерно 3-4 тысячи токенов, поэтому подойдёт небольшая открытая модель с коротким контекстом. Единственное требование: модель должна поддерживать вызов инструментов (function calling), потому что ответ нода принимает именно так. Перед запуском в работу прогоните на ней десяток настоящих текстов и посмотрите отчёт: так проще всего выбрать модель под свои данные.

Даже если модель облачная, лишнего она не получает. Модель видит текст, в котором всё найденное правилами уже заменено метками: значения карт, паспортов и ключей ей не уходят. Ответ проверяется: модель возвращает дословные цитаты, а нода сама ищет их в тексте. Если цитаты в тексте нет, значит, модель её придумала, и такая находка отбрасывается, а не маскирует постороннее слово. Для небольших локальных моделей это особенно полезно.

Если модель не ответила, можно остановить ноду или продолжить с пометкой в отчёте. В действии «Проверить» такой элемент уходит в «Найдено».

Неизвестно не значит чисто

Это главный принцип ноды. Если текст оказался больше заданного предела, проверка не уложилась во время или модель досмотрела текст не до конца, элемент не считается чистым:

  • в отчёте появляется complete: false и причина;
  • «Проверить» отправляет элемент в «Найдено»;
  • «Замаскировать» заменяет непроверенный хвост меткой <NOT_CHECKED>, а не пропускает его как есть.

Пределы настраиваются в «Параметрах»: размер текста на элемент (по умолчанию 5 миллионов символов), число находок и время на элемент.

Сценарии

Обращения в поддержку перед моделью

Сообщение клиента проходит через «Замаскировать» с метками вида и только потом попадает в ИИ-агента или ноду модели. Модели не нужно знать номер карты, чтобы понять, что у клиента не проходит оплата. Ответ при этом остаётся осмысленным: метка <CARD> говорит модели, что карту клиент прислал.

Задачи в таск-трекер и общие чаты

Заявку из формы перед публикацией в общий канал или задачей в трекере, куда смотрят подрядчики, прогоните через «Проверить». Чистые идут дальше автоматически, а с находками уходят ответственному на ручной разбор.

Логи и отладка

Перед записью ошибок и данных запросов в журнал или внешнюю систему мониторинга маскируйте секреты: пароли, токены, строки подключения. Случайно залогированный ключ от базы перестаёт быть утечкой.

Аудит существующих данных

Действие «Найти» на выгрузке из CRM, таблицы или базы покажет, где у вас лежат паспорта, СНИЛС и карты, которых там быть не должно. Сводка summary в отчёте считает находки по видам, и по ней удобно строить отчёт.

Документы после распознавания

Скан договора или анкеты сначала проходит через извлечение из документа, а полученный текст через «Защиту данных». Так в архив или в общий доступ уходит копия без паспортных данных.

Как собрать проверку за пять минут

  1. Поставьте ноду «Защита данных» после триггера, который получает тексты: вебхук формы, Telegram, почта.
  2. Выберите действие «Проверить» и оставьте «Весь элемент».
  3. Пройдитесь по галочкам: выключите то, что в вашем потоке нормально и не требует внимания, например ссылки или ники.
  4. К выходу «Чисто» подключите основной процесс, к выходу «Найдено» уведомление ответственному.
  5. Запустите на нескольких настоящих сообщениях и посмотрите отчёт guardrails в выходе ноды.

Что учесть

Значения в отчёте. «Найти» всегда пишет найденные значения в отчёт, а отчёт сохраняется в истории запусков. Для «Проверить» и «Замаскировать» значения в отчёт по умолчанию не попадают: только вид, поле и позиция. Включайте их, только если они правда нужны дальше по процессу.

Ложные срабатывания. Поиск случайных строк по энтропии реагирует на идентификаторы и хеши, поэтому выключен по умолчанию. Если включаете, начните со сбалансированного уровня. Для ссылок есть список разрешённых доменов: ссылки на ваш сайт находкой не считаются.

Это не замена политике. Нода снижает риск того, что данные уйдут не туда, но не отменяет разграничения доступа и правил обработки персональных данных в компании.

Частые вопросы

Отправляет ли нода данные во внешние сервисы

Без проверки моделью нет: правила работают на сервере Staqflow. С проверкой моделью текст уходит той модели, которую вы подключили. Если это своя модель через Ollama или vLLM на сервере компании, сторонний провайдер моделей текст не получает. Если облачная, она получает текст уже с метками вместо значений, найденных правилами.

Какая модель нужна для проверки

Подойдёт небольшая открытая модель на своём сервере, если она поддерживает вызов инструментов. Мощная модель для этой задачи не нужна: она читает куски текста до 12 000 символов и выписывает цитаты, а нода сама проверяет, что цитаты есть в тексте. Это снижает стоимость проверки и снимает вопрос о передаче данных внешнему провайдеру.

Если нужен полностью закрытый контур, Staqflow можно поставить на свои серверы рядом с моделью.

Можно ли искать данные своей компании

Да. Свои слова и фразы задаются списком, свои внутренние домены отдельным полем, а фамилии сотрудников можно передать выражением из предыдущей ноды. Для того, что словами не перечислить, есть описание для модели.

Найдёт ли нода номер паспорта, если рядом не написано «паспорт»

Большинство номеров документов засчитываются только рядом со своим словом или в поле с подходящим названием, например inn. Иначе любое десятизначное число становилось бы находкой. Исключения: ИНН из 12 цифр и СНИЛС в своём формате, их видно по самому номеру и контрольной сумме.

Какие страны поддерживаются

Телефоны с «+» распознаются для любой страны, номера без «+» в форматах двенадцати стран, от России и Казахстана до Грузии и Молдовы; список настраивается. Документы и налоговые номера распознаются для России, Казахстана, Узбекистана и Беларуси.

Что будет с картинками и файлами в элементе

Нода проверяет текстовые поля и передаёт файлы дальше без изменений. Чтобы проверить содержимое скана или PDF, сначала извлеките из него текст.

Можно ли восстановить замаскированное значение

Нет, замена необратима: нода не хранит соответствие меток и исходных значений. Если исходный текст нужен дальше, сохраните его в процессе до маскирования, например в отдельной ветке.

Попробуйте

  1. Откройте Staqflow, поставьте ноду «Защита данных» после ручного триггера и вставьте в поле текста сообщение с телефоном, почтой и номером карты.
  2. Попросите ИИ-клиента через MCP встроить проверку в ваш процесс поддержки: перед моделью маскировать, перед общим каналом проверять.
  3. Посмотрите в каталоге интеграций, какие системы получают от ваших процессов тексты клиентов.