Приватность

Правила редактирования: как вычищать секреты до попадания в базу

Секрет, попавший в архив распознанного текста, вычищается из четырёх мест вместо одного и всё равно остаётся на исходном скриншоте. Готовые шаблоны правил, порядок проверки на своих данных и честный список того, чего маскирование не делает.

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

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

#Что понадобится

  • Работающий захват экрана с распознаванием. Маскирование применяется к тексту, который распознавание вытащило с картинки, и без него бессмысленно.
  • Список своих чувствительных паттернов. Универсальные наборы закрывают типовое; ваши внутренние идентификаторы, номера тикетов и имена систем — нет.
  • Инструмент предпросмотра. Правило, написанное с ошибкой, либо не срабатывает, либо вырезает половину текста. Проверять надо на образце, а не на боевом потоке.

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

#Почему «вычистить потом» дороже

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

Место Что там оказывается Уходит при удалении записи
Таблица распознанного текста Строка с секретом Да
Полнотекстовый индекс Зеркало той же строки для поиска Только при явной синхронизации
Резервная копия Всё вышеперечисленное на момент снимка Нет, и не должно
Исходный скриншот Секрет, видимый глазом на картинке Нет: маскирование текста изображения не трогает

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

И правило, которое действует независимо от всего перечисленного: секрет, попавший в архив, считается скомпрометированным. Отзывайте и меняйте его, а не только вычищайте записи.

#Шаг 1. Начните с готовых наборов

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

Набор Что ловит
Банковское Номера карт, IBAN и BIC, строки с остатком, коды проверки карты
Пароли Строки вида «пароль: …», ПИН-коды, мастер-фразы, сид-фразы
Учётные данные Ключи API распространённых форматов, токены, JWT, заголовки авторизации
Сетевое Адреса IPv4 и IPv6, маски подсетей, MAC-адреса
Персональное Адреса электронной почты, телефоны в международном и российском формате

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

#Шаг 2. Добавьте свои паттерны

Готовые наборы не знают про ваши внутренние системы. Типовые шаблоны, которые дописывают почти все:

(?i)\b(password|пароль|passwd|pwd)\s*[:=]\s*\S+
(?i)bearer\s+[A-Za-z0-9._\-]+
\b[A-Za-z0-9._%+\-]+@[A-Za-z0-9.\-]+\.[A-Za-z]{2,}\b
\b8\d{10}\b
\b(?:\d[ -]*?){13,19}\b

Первое ловит любое присвоение пароля, второе — заголовок авторизации, третье — почту, четвёртое — российский телефон без разделителей, пятое — номер карты с любыми пробелами и дефисами внутри.

Свои добавляйте по тому же принципу — якорь плюс значение, а не одно значение. Правило \b\d{6}\b вырежет из архива все шестизначные числа, включая суммы и номера домов. Правило (?i)\b(код|otp)\s*[:=]?\s*\d{4,8}\b вырежет только то, что подписано как код.

#Шаг 3. Проверьте на образце, а не на потоке

Возьмите реальный фрагмент распознанного текста — тот, где секрет заведомо есть, — и прогоните его через предпросмотр правил. Смотреть надо на две вещи сразу: исчез ли секрет и уцелел ли остальной текст.

Некорректное правило проявляется одним из двух способов. Либо не срабатывает — секрет остался, и обычно виноват якорь: в реальном тексте перед значением стоит не двоеточие, а перевод строки. Либо срабатывает слишком широко — вместе с секретом исчезло полстроки, и потом эта запись бесполезна для поиска.

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

#Шаг 4. Закройте то, что маскированием не решается

Три вещи, для которых правила не подходят по устройству:

  1. Приложения, которые нельзя снимать вовсе — менеджер паролей, банк-клиент, рабочая система под соглашением о неразглашении. Их место в списке исключений захвата: тогда скриншот не делается, и вопрос об изображении не возникает. Чек-лист исключений — в гайде про настройку приватности при записи экрана и звука.
  2. Приложения, где текст бесполезен, а картинка нужна — их можно оставить в захвате, но исключить из распознавания. Скриншот будет, распознанного текста не будет.
  3. То, что уже попало в базу до настройки правил. Правила действуют на будущее. Со старым архивом придётся разбираться отдельно: найти поиском и удалить, а секреты — отозвать. Механика поштучного удаления — в разборе как удалить факт из памяти ИИ.

#Проверка результата

Через сутки после настройки проведите четыре проверки.

  1. Поиск по своим секретам. Возьмите фрагмент токена, номера карты, почты и поищите по архиву. Ничего не нашлось — правила работают. Нашлось — правило не сработало на реальных данных, хотя проходило на образце.
  2. Поиск по маске. Найдите записи, содержащие ***. Их наличие подтверждает, что правила применяются, а не просто ничего не находят. Полное отсутствие маски через сутки активной работы — повод перепроверить.
  3. Проверка на переусердствование. Откройте несколько замаскированных записей и убедитесь, что текст вокруг маски остался читаемым и по нему всё ещё можно найти нужное. Особенности поиска по распознанному тексту разобраны отдельно в статье про поиск по OCR-тексту.
  4. Проверка изображения. Откройте скриншот, соответствующий замаскированной записи, и посмотрите, виден ли секрет на картинке. Скорее всего, виден — и это правильный момент, чтобы добавить приложение в исключения захвата.

#Что может пойти не так

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

Маскирование включили вместо исключения приложения. Для банк-клиента и менеджера паролей правильный ответ — не снимать вовсе. Маскирование здесь снижает риск наполовину: текст вычищен, изображение осталось.

Забыли про заголовки окон. Имя файла, адрес страницы и содержимое строки заголовка тоже попадают в базу, и там регулярно оказывается номер договора или фамилия клиента.

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

Замаскировали, но не отозвали. Секрет, побывавший в архиве, скомпрометирован. Правило маскирования не отменяет ротацию ключа.

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

#Маскирование удаляет секрет с самого скриншота?

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

#Что будет со старыми записями после настройки правил?

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

#Сильно ли маскирование ломает поиск?

Зависит от ширины правил. Узкие правила с якорями почти не мешают: из строки исчезает значение, а контекст остаётся, и запись всё ещё находится по соседним словам. Широкие правила вроде «все длинные числа» выедают текст и делают архив хуже.

#Помогает ли маскирование, когда я отправляю запрос облачной модели?

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

#Что вообще имеет смысл пускать в память ассистента?

Меньше, чем кажется на старте. Полезность памяти растёт от контекста работы, а не от полноты архива, и большая часть чувствительного не даёт ничего, кроме риска. Разбор границы — в статье про память и приватность, общая рамка — в материале про приватный ИИ и локальное хранение.

#Можно ли доверять маскированию для действительно критичных секретов?

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

#Вывод

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

Хотите ИИ, который помнит вас?

Persona держит контекст между чатами и работает на вашем железе — если развернуть её у себя и подключить локальную модель.

Создать аккаунт