Как известно регулятором предъявляются требования к обработке конфиденциальной информации. Суть требований сводится к организации рабочих мест пользователей, сетей, информационных систем и сервисов, обрабатывающих информацию ограниченного распространения таким образом, чтобы обеспечить сохранность, конфиденциальность информации, защитить ее от несанкционированного доступа, а в некоторых случаях и от технических средств разведки. Вследствие дефицита таких защищенных систем в организации, либо по причине личной недисциплинированности, или в силу магнитных бурь на Солнце некоторые пользователи обрабатывают защищаемую информацию на не предназначенных для этого рабочих местах (зачастую не имеющих средств защиты информации, или имеющих подключение к внешним сетям), что в свою очередь создает предпосылки к утечке конфиденциальной информации.

Возможно Вы работаете офицером ИБ в одной из таких организаций и Вам поставлена задача выявлять факты нарушения порядка обработки пользователями информации ограниченного распространения. Хорошо, если организация снабдила Вас удобной DLP, а если нет и внедрение таковой не предвидится? В случае с нашей организацией раз в месяц происходила постановка задачи: "Иди собери экспедицию для поиска конфиденциальных документов там, где их быть не должно. Если что найдешь - напишешь, если не найдешь - плохо искал". Предполагалось выполнять задание врукопашную. Так как я программирую и выходить из кабинета мне лень, то опишу свой подход к выполнению подобных задач.

Исходные данные

В организации развернуто две сети. Сети состоят только из Linux-машин (привет импортозамещению). Первая сеть состоит из десятка хостов и предназначена для обработки информации ограниченного распространения (назовем ее ЗЛВС). Вторая - доменная сеть организации предназначенная для работы с неконфиденциальной информацией (назовем ее открытой). Доступа к puppet master во второй сети нет. Бывает, что пользователи делают конфиденциальные документы не в ЗЛВС, а на своем рабочем компьютере, являющимся хостом открытой сети.

Требуется: Выявить факт нарушения.

Решение

Очевидно, что для поиска такого рода документов надо иметь представление об их содержимом, иметь удаленный доступ к хостам в сети и средство полнотекстового поиска на хостах. С последними двумя пунктами мне повезло, чего не скажешь о первом. Впрочем документы ограниченного распространения как правило снабжают меткой конфиденциальности ("секретно", "архисекретно" и "перед прочтением сжечь"). Конечно искать по таким ключевым словам документы на пользовательских хостах неперспективно. Если удалить гриф конфиденциальности с документа, то в выдачу поиска он не попадет, поэтому нарушители такие метки убирают с документов. Зато помеченные документы вполне легально хранятся в ЗЛВС, надо только выделить из них семантическое ядро. Вторым этапом следует поиск документов в открытой сети по полученным поисковым запросам. Третьим - прогон поисковой выдачи через статистическую модельку, предварительно натренированную в ЗЛВС.

Что зачем

Вырисовываются контуры системы:

  1. Поисковик. Осуществляет возможность контекстного поиска по словам или по сложным логическим критериям на сетевых хостах.

  2. Система подготовки поисковых запросов. Выделяет тэги (ключевые слова) в найденных документах. Осуществляет кластеризацию тэгов для составления поисковых запросов. Назовем этот модуль тэгинатором.

  3. Система проверки. Представляет собой линейную статистическую модель, обученную на конфиденциальных документах в ЗЛВС. Она проверит выдачу поиска и вернет релевантность в %, т.е. похожесть найденного документа на конфиденциальный документ. Назовем этот модуль регрессором.

Забегая вперед скажу, что линейный регрессор (sklearn.linear_model.SGDRegressor) для системы проверки выбрал по нескольким причинам:

  1. Точность на уровне 85% вполне приемлема для меня, учитывая скорость обучения (существует необходимость регулярного обучения модели на слабом железе);

  2. Конфиденциальность (из модели невозможно получить информацию об обучающем дата-сете).

Что куда

Первый модуль будет развернут и в ЗЛВС и в открытой сети. В ЗЛВС он соберет в базу данных все документы, имеющие метку конфиденциальности. В открытой сети поисковик будет искать документы по подготовленным тэгинатором запросам, складывать по ним информацию и содержимое в базу данных.

Тэгинатор будет развернут только в ЗЛВС. Его цель - пройти по базе данных, собранной первым модулем и подготовить кластер поисковых запросов.

Регрессор будет развернут только в открытой сети. От него требуется пройти по базе данных, собранной поисковиком по поисковым запросам тэгинатора и ответить на вопрос: "Какова вероятность того, что найденный документ конфиденциальный?"

Обо всем по порядку

Статья получается объемной, ограничимся рассмотрением в ней Поисковика.

Рабочие станции нашей организации функционируют под управлением операционной системы Astra Linux, в дистрибутив которой входит замечательная утилита полнотекстового контекстного поиска recoll.

Recoll предварительно индексирует содержимое документов, поэтому последующий поиск происходит достаточно быстро. Для того, чтобы утилита Recoll могла смотреть текстовые файлы doc и docx на хосте должна быть установлена утилита 'antiword' и пакет 'wv', а для odt-документов - 'python-libxslt1'.

Как отмечалось ранее, доступа к puppet master нет, но есть доступ к хостам по ssh. Для начала было полезным иметь средства автоматизации для выполнения списка команд, доставки и установки упомянутых пакетов, конфигурационных файлов recoll и cron на хосты. Затем, опираясь на эти средства автоматизации, описать алгоритм вызова recoll на хостах и помещения результатов в базу данных. Данная функциональность реализована мной на Python3, а для удобства развертывания подготовлен dockerfile. Поисковик опубликован на github.

Пару слов о том как там все устроено:

octo.py - точка входа в приложение. Взаимодействует с пользователем посредством CLI, с Docker-через системные переменные, содержит инструкции для установки необходимых для работы recoll пакетов и доставки настроек на хосты, отправляет команды на индексирование и поиск информации, а также парсит результаты поиска утилиты recoll и записывает в базу данных. Как видно, в скрипте идет работа с экземпляром класса NEThelper.

helpers.NEThelper собирает очередь заданий для выполнения на удаленных машинах. Для выполнения заданий существует метод start_task(), который выполняет асинхронный обход сетевых хостов. Ip-адреса хостов, на которых все задания выполнены успешно, записываются в текстовый файл, чтобы при повторном запуске задачи пропустить их. Отчеты о выполненных задачах с одноименным названием помещаются в каталог tsk_reports.

helpers.LANhelper непосредственно открывает ssh-сессию на удаленной машине посредством библиотеки paramiko. В нем описаны методы для установки/удаления пакетов, импорта/экспорта файлов и выполнения команд на сетевом хосте. Методы выполнения команд exec_command и silent_exec_command могут принимать на вход функции для обработки результата выполнения команды. Доставка файлов на удаленные машины осуществляется из каталога exfiles. Установка пакетов происходит следующим образом: Сначала пакет ищется в репозиториях ПО локальной сети и в случае успеха устанавливается оттуда. Если в репозитории пакет не найден, или отсутствует сам репозиторий, то поиск продолжается в каталоге packages. Найденные пакеты в каталоге packages доставляются на удаленную машину и инсталлируются.

helpers.PKGhelper проверяет наличие пакетов для установки в репозиториях ПО и в каталоге packages, возвращает информацию об этом в клиентский код.

helpers.YANLhelper парсит конфигурационный файл settings/settings.yaml, подготавливает настройки системы к передаче в приложение. Файл конфигурации содержит настройки для подключения к базе данных, список сетей для сканирования и подробно комментирован.

helpers.DBhelper - инструменты для работы с базой данных. Класс Files - модель таблицы Files базы данных. Проект использует популярную библиотеку SQLAlchemy, поэтому СУБД может быть любой из поддерживаемых библиотекой. Структура базы данных создается автоматически.

Рассмотрение тэгинатора и регрессора оставлю для следующих статей. Спасибо за внимание к материалу и конструктивные комментарии.

Комментарии (1)


  1. Kuprijan
    17.07.2022 22:56

    Антиплагиат это ты?