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

DLP-система

Доступно только на тарифе Корпорация

Встроенная в Пачку DLP-система (Data Loss Prevention) позволяет вам построить защиту от утечек конфиденциальной информации без интеграции сторонних сервисов.

Управление правилами DLP-системы доступно в разделе Настройки пространства > DLP. Вы можете изменять список правил, а также включать и отключать их.

Список правил DLP-системы

Создание правила

Чтобы внести новое правило нажмите на кнопку «Создать новое правило», укажите название правила (чтобы было проще его потом изменить или удалить), его приоритет и JSON объект условия.

Создание нового правила

Параметр «Приоритет» — целое число, определяющее порядок обработки правила. Большее число — выше приоритет: правило с приоритетом 10 обрабатывается раньше правила с приоритетом 5. Правила не могут иметь одинаковое значение приоритета.

JSON условие состоит из трёх полей: контекст применения правила (необязательное), условие срабатывания правила и действие при срабатывании правила. Параметры и пример условия вы можете посмотреть ниже.

В админке правило редактируется как обычный текст в одном поле — визуального конструктора нет. Пишите JSON руками или копируйте готовые примеры из этого гайда и подставляйте свои значения.

Структура правила

scope
object
Объект контекста применения правила
to_external
boolean
Применимость правила к внешним контактам. При значении true правило работает только при наличии гостей или мульти-гостей в чате.
По умолчанию:
false
channel_type[]
array of strings
Массив типов чата, для которых будет работать правило
Возможные значения
user_role[]
array of strings
Массив ролей пользователя в чате, для которых будет работать правило
Возможные значения
conditions
object
*
Объект условия срабатывания правила. Можно указать all, any или оба.
all[]
array of objects
Массив условий (все должны совпасть)
type
string
*
Тип условия
Возможные значения
max_hits
integer
Максимальное количество совпадений
min_hits
integer
Минимальное количество совпадений
По умолчанию:
1
pattern
string
Регулярное выражение для поиска в тексте. Используется синтаксис Google RE2. Обязательно, если type указано как regex.
value
string
Ключевое слово для поиска в тексте. Обязательно, если type указано как keyword.
any[]
array of objects
Массив условий (хотя бы одно должно совпасть)
type
string
*
Тип условия
Возможные значения
max_hits
integer
Максимальное количество совпадений
min_hits
integer
Минимальное количество совпадений
По умолчанию:
1
pattern
string
Регулярное выражение для поиска в тексте. Используется синтаксис Google RE2. Обязательно, если type указано как regex.
value
string
Ключевое слово для поиска в тексте. Обязательно, если type указано как keyword.
action
object
*
Объект действия при срабатывании правила
type
string
*
Тип действия
Возможные значения
message
string
Текст сообщения для пользователя
Пример:Сообщение заблокировано политикой безопасности
Пример правила #1
{    "conditions": {        "any": [            {                "type": "regex",                "pattern": "\\b(?:\\+7|7|8)\\s*\\(?\\d{3}\\)?\\s*\\d{3}[\\s-]*\\d{2}[\\s-]*\\d{2}\\b"            }        ]    },    "action": {        "type": "AUDIT_LOG",        "message": "Обнаружен номер телефона в сообщении"    }}
Пример правила #2
{    "conditions": {        "all": [            {                "type": "keyword",                "value": "паспорт"            },            {                "type": "regex",                "pattern": "\\b\\d{4}\\s?\\d{6}\\b"            }        ]    },    "action": {        "type": "BLOCK",        "message": "Нельзя отправлять паспортные данные"    }}

Условия

В одном правиле можно скомбинировать любое число условий через массивы all (логическое И — должны сработать все) и any (логическое ИЛИ — хотя бы одно). Допускается одновременное использование обоих массивов и вложенность.

Регулярные выражения

В условиях type: "regex" используется синтаксис Google RE2 — это не PCRE: lookahead/lookbehind, backrefs и рекурсия не поддерживаются, зато регулярка не сможет «зависнуть» на патологическом вводе. Максимальная длина паттерна — 2000 символов, время выполнения ограничено 200 мс на одно сообщение.

Ключевые слова

Условия type: "keyword" ищут целое слово (с учётом границ слова \b) без учёта регистра, плюс одну распространённую морфологическую форму с суффиксом на «н»:

  • "секрет" сматчит «секрет» и «секретная», «секретный», «секретное», но не «секреты» или «секрета».
  • Для остальных форм используйте regex.

Подсчёт совпадений

Поля min_hits и max_hits позволяют требовать определённое число совпадений в одном сообщении. По умолчанию min_hits = 1 и max_hits не задан.

Минимум два упоминания ключевого слова
{    "conditions": {        "all": [            { "type": "keyword", "value": "пароль", "min_hits": 2 }        ]    },    "action": {        "type": "AUDIT_LOG",        "message": "В одном сообщении упомянуто несколько паролей"    }}

Действия

ТипЧто происходит
AUDIT_LOGСообщение проходит без изменений, в журнал аудита пишется событие dlp_violation_detected.
BLOCKТекст сообщения подменяется на action.message (или на «Удалено DLP», если поле не задано). Сообщение остаётся в чате, никаких записей в аудите.
BLOCK_AND_AUDIT_LOGИ подмена текста, и запись события dlp_violation_detected в журнал аудита.

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

Контекст применения

Опциональный объект scope позволяет ограничить, к каким сообщениям применять правило. Все указанные параметры комбинируются через И; если scope не задан, правило применяется ко всем сообщениям.

  • to_external: true — только в чатах, где состоят гости или мульти-гости.
  • channel_type — массив из personal, discussion, channel, thread (тип чата).
  • user_role — массив ролей автора сообщения в чате: owner, admin, editor, member, subscriber, not_member.
Блокировать конфиденциальные данные при отправке внешним
{    "scope": {        "to_external": true,        "channel_type": ["discussion", "channel", "thread"]    },    "conditions": {        "any": [            { "type": "keyword", "value": "конфиденциально" }        ]    },    "action": {        "type": "BLOCK_AND_AUDIT_LOG",        "message": "Конфиденциальные сведения нельзя отправлять во внешние чаты"    }}

Порядок обработки

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

Например, в пространстве заведены два правила:

  • Правило A (priority: 10, BLOCK) — блокирует номера телефонов.
  • Правило B (priority: 5, AUDIT_LOG) — логирует упоминания слова «паспорт».

Сотрудник пишет в чат: «паспорт +7 999 123-45-67». Сообщение подходит под оба правила, но сначала проверяется A (приоритет выше): оно срабатывает, текст подменяется, в чате остаётся action.message. Правило B на этом сообщении не проверяется, в журнале аудита записи о нём не появится.

Журнал аудита

Действия AUDIT_LOG и BLOCK_AND_AUDIT_LOG добавляют в журнал аудита запись с типом dlp_violation_detected. У каждой записи журнала есть поле details — объект с подробностями события, структура которого зависит от типа.

Для срабатывания DLP-правила в details приходит:

dlp_rule_id
integer, (int32)
*
Идентификатор правила DLP
dlp_rule_name
string
*
Название правила DLP
message_id
integer, (int32)
*
Идентификатор сообщения
chat_id
integer, (int32)
*
Идентификатор чата
user_id
integer, (int32)
*
Идентификатор пользователя
action_message
string
*
Описание действия
conditions_matched
boolean
*
Результат проверки условий правила (true — условия сработали)

Получить такие события можно методом GETЖурнал аудита событий с фильтром event_key=dlp_violation_detected. Подробнее — в гайде по журналу аудита.