Работая в современном коммерческом SOC’е я впервые столкнулся с масштабными средствами автоматизации, заточенными под самые разные инфраструктуры, которые позволяют экономить колоссальное количество времени и предотвращать тысячи киберинцидентов каждый день.
Пообщавшись с коллегами по цеху из других SOC’ов, пришел к выводу, что львиную долю из них эксплуатируют достаточно дорогие и сложные в настройки SOAR решения, а часть из них вовсе не могут себе позволить этого и занимаются некоторыми рутинными процессами вручную или не занимаются вовсе. В первой части статьи я бы хотел обсудить, что такое SOAR системы и зачем они используются в SOC’ах. Помимо этого, познакомится с молодым и перспективным Open Source решением под названием Shuffle.
Что такое SOAR и с чем его едят
Security Orchestration, Automation and Response (или же «Оркестровка безопасности, автоматизация и реагирование») – класс программных продуктов, предназначенных для координации и управления (оркестровки) различными системами безопасности.

Замысел SOAR систем заключается в том, чтобы осуществить сбор данных о событиях безопасности из соответствующих источников (WAF, IDS, NTA и другие), обработать их и исполнить автоматизированный сценарий реагирования, либо сформировать уведомление (Alert) и отправить его на дополнительную обработку вручную.
Современные платформы используют в своём арсенале машинное обучение, искусственный интеллект и кучу других технологий для автоматизации ряда рутинных задач, таких как сбор данных, их обогащение, корреляция и многие другие.
К тому же SOAR включает в себя так называемые плейбуки (Playbooks), содержащие инструкции, основанные на проверенных методах и процедурах. Применение плейбуков обеспечивает согласованность, соответствие нормативным требованиям, а также более быструю и надежную идентификацию и устранение инцидентов.
Функции SOAR систем
-
Получение, обработка, а также анализ данных и уведомлений из различных СЗИ
-
Способность устанавливать, разрабатывать и автоматизировать рабочие процессы, которые помогают специалистам приоритизировать, исследовать и реагировать на уведомления о событиях безопасности
-
Автоматизация большей части операций по обеспечению безопасности, избавляющая от рутинных задач и позволяющая специалистам сэкономить время и сосредоточиться на более сложных задачах
-
Возможность для проведения пост инцидентного анализа с целью улучшения своих процессов и предотвращения подобных проблем в будущем
-
Формирование визуализации данных (отчетности) по ключевым метрикам

Стоит отметить, что SOAR системы идеально подходят для SOC’ов с грамотно выстроенной инфраструктурой и достаточно высоким уровнем отладки процессов ИБ, которые желают интегрировать множество систем от различных вендоров, тем самым максимально автоматизируя процессы.
Теперь предлагаю познакомиться ближе с одной из перспективных SOAR платформ.
Shuffle как Open Source SOAR решение
Данная SOAR платформа разработана норвежским разработчиком Fredrik Saito Ødegårdstuen’ом. Ниже пару предложений от самого разработчика о том, как появился на свет данный проект.
Shuffle начался как проект в середине 2019 года для решения нескольких проблем, связанных с автоматизацией в сообществе CERT/SIRT. Пока текущие решения по автоматизации пытаются делать все одновременно: обрабатывать тикеты, индикаторы, данные об угрозах и многое другое на одной платформе. Мы сосредоточены на создании наилучшего решения, которое подойдет всем вашим существующим инструментам, следуя философии Unix: «Делай одно дело и делай это хорошо».

На данный момент Shuffle предоставляет три варианта реализации:
-
Cloud — индивидуальное решение с практически такой же кодовой базой, но ориентированное на микросервисы через Google Cloud Functions.
-
Self-Hosted — версия Shuffle размещенная на Github и поставляется «из коробки» без каких-либо ограничений.
-
Hybrid — вариант, позволяющий локальной и облачной версии работать вместе. Это позволит в дальнейшем устанавливать соединения между экземплярами Shuffle.
Исходя из списка выше можно подобрать наиболее подходящий вариант под собственную инфраструктуру, требования и законодательство. В первой части статьи рассматривается «Open Source» Self-Hosted версия.
Патформа разделена на две основные части: Server и Workers. В свою очередь сервер выступает в роли хоста, который отвечает практически за всю внутреннюю деятельность: Frontend, Backend, API, File System. А рабочие отвечают за общение и обмен между различными сервисами.
Верхняя и нижняя части могут быть установлены на разных хостах и кластеризованы. Рисунок представленный ниже описывает конфигурацию Server части.

При настройке Shuffle для продакта разработчики рекомендуют использовать два или более серверов (ВМ), но для начала будет достаточно одного. Ниже представлены минимальные требования, также рекомендуется добавлять больше, чтобы избежать перегрузки:
-
CPU: 2vCPU
-
RAM: 8Gb
-
Disk: > 100Gb (SSD)
-
Services: Frontend, Backend, Orborus, Opensearch (All)
Внедрение Shuffle в собственную инфраструктуру
Установка Shuffle в настоящее время доступна для docker и kubernetes, однако в этой части статьи рассматривается установка с помощью docker.
Прежде всего стоит убедиться, что уже установлены Docker и Docker compose, если эти требования соблюдены, тогда можно приступать к установке.
[1] Клонируем репозиторий Shuffle:
cd /opt
git clone https://github.com/Shuffle/Shuffle
cd Shuffle

После клонирования репозитория вносим правки в скрытом файле .env
, который содержит в себе некоторые конфигурационные переменные окружения. Задаем первоначальные логин и пароль в соответствующих переменных SHUFFLE_DEFAULT_USERNAME
и SHUFFLE_DEFAULT_PASSWORD
, а также иные параметры для внедрения в собственную инфраструктуру.

[2] Вносим предварительные условия для БД Opensearch (Elasticsearch):
mkdir shuffle-database # Создаем директорию для БД
sudo chown -R 1000:1000 shuffle-database # Если возникает ошибка при использовании 'chown', тогда сначала добавьте пользователя командой 'sudo useradd opensearch'
sudo swapoff -a # Отключение своп-пространства
[3] Разработчик рекомендует увеличить значение параметра ядра vm.max_map_count
до 262144
для корректной работы Opensearch (подробнее по ссылке):
sudo sysctl -w vm.max_map_count=262144
[4] Запускаем сборку с помощью конфигурационного файла docker-compose.yaml
:
docker compose up -d

После установки всех модулей (frontend / backend / orborus / opensearch) перейдите по адресу: http://localhost:3001 (для соединения по HTTPS используйте порт по-умолчанию: 3443 указанный в файле .env
).

Чтобы войти используйте username
и password
, которые задавались ранее в файле .env
, на этом всё.
Поздравляю с успешной установкой Shuffle!
Чтобы заточить и сконфигурировать проект под собственные нужны и инфраструктуру необходимо ознакомиться с официальной документацией и GitHub.
Знакомство с Shuffle
Нас встречает достаточно, как принято сейчас говорить, user-friendly веб-интерфейс с четырьмя основными вкладками (которые в выпадающем меню слева), кнопками переключения между “организациями” и настроек УЗ, а также бесплатной технической поддержкой в виде чатика.
Пробежимся по основным вкладкам. Начать знакомство стоит с “настройки собственной организации“. Перейти в соответствующий раздел можно с помощью вкладки Admin.

Под “организацией” имеют в виду способ организации данных в Shuffle. Данные из приложений, рабочих процессов, уведомлений, файлов и так далее связаны с организацией, из которой пользователи получают доступ на основе своих прав доступа.
После установки, по-умолчанию будет создана организация под названием default
, в дальнейшем здесь можно настроить: репозиторий резервных копий, функцию единого входа (SSO), многофакторную аутентификацию (MFA), аутентификацию приложений, окружение, файлы, триггеры и многое другое!
Далее перейдём к приложениям (Apps), которые помогают в создании автоматизированных кейсов, предоставляют доступ к библиотеке функций и создаются с использованием OpenAPI или чистого Python.

На данный момент в Shuffle есть более 2000 готовых приложений, которые постоянно пополняются разработчиками и комьюнити, но также есть очень крутая возможность создавать собственные приложения с помощью App Creator или напрямую на Python.
Исходя из того какие используются СЗИ и стека технологий, находящихся в проде, можно определиться с приложениями и возможными вариантами кейсов по автоматизации. Впрочем Shuffle предоставляет, так называемые Usecases, хорошо зарекомендовавшие в практиках других SOC’ов.

Здесь можно найти 5 основных категорий (похожих на одну из версий NIST Cybersecurity Framework): Collect (сбор), Enrich (обогащение), Detect (обнаружение), Respond (реакция) и Verify (подтверждение) — описывающие полный цикл обработки киберинцидентов. В каждой категории есть несколько готовых вариантов действий.
Переходим к рабочим процессам (Workflows), которые можно найти на одноименной вкладке. Здесь можно создавать как собственные процессы, так и воспользоваться уже готовыми и обкатанными вариантами.

Рабочие процессы используют 4 основные категории инструментов: Apps (приложения), Triggers (триггеры), Conditions (условия) и Vars (переменные) для создания мощной автоматизации.

Итак, слева располагаются инструменты с помощью которых и строятся автоматизированные Workflows.
В разделе Your Apps находится список приложений готовых к внедрению в процесс.
В разделе Triggers находятся 4 основных триггера — операторы, используемые для автоматического выполнения Workflow. Чаще всего они принимают аргумент выполнения, который будет использоваться для выполнения рассматриваемого рабочего процесса. На рисунке приведены: Webhook (обработчик данных в реальном времени с помощью HTTP методов), Schedule (локальные расписания, по-типу Cron), Shuffle Workflow (запуск процессов внутри других процессов, по-типу подпотоков) и User Input (пользовательский ввод, разрешение).
В разделе Popular Actions находятся часто используемые действия (выполнить код Python, выгрузить метаданные из файла и другие) из встроенного приложения Shuffle Tools
. Со списком всех встроенных действий можно нажав на само приложение, а затем нажав по иконке документов, которая откроет документацию к данному приложению (это работает для всех приложений).
Настало время создать первый Workflow!
Первый Workflow
В качестве перового кейса предлагаю — автоматизировать процесс проверки входящих электронных писем на предмет вредоносного вложения. Представленный ниже рисунок лишь слегка приоткрывает завесу над логикой данного Workflow.

[1] Приступим, создав новый Workflow, перетаскиваем приложение Email
(также можно взять уже готовое приложение заточенное под вендора, по-типу Outlook, Gmail), позволяющее получить письма из папки “Входящие” по протоколу IMAP.

Для того, чтобы приложение получало список всех писем необходимо выбрать действие Get emails imap
, соответственно для аутентификации по IMAP необходимо ввести свой почтовый адрес (Username
), пароль (Password
), доменный адрес IMAP сервера (IMAP server
). Также снизу будут дополнительные параметры с помощью которых и будет осуществлена доставка вложения из письма на Shuffle: Unread → True
, Include attachment data → True
, Upload attachments shuffle → True
, Mark as read → False
.
Проверяем исправность работы путем запуска (снизу кнопка воспроизведения в зеленом квадрате) этого Workflow, в результате получаем список из входящих с набором информации о письме в формате JSON
. Интерпретируемое значение в данном кейсе является attachment_uids
— вложение, которое было загружено в Shuffle, с помощью этого значения можно к нему обращаться внутри Workflow. Также посмотреть данный файл можно по следующему пути: Organizations → Files.

[2] Следующим шагом будет проверка файла с помощью YARA правил. Для чего нужно выбрать действие Analyze file
и передать значение attachment_uids
из прошлого шага с помощью переменной. Когда у двух приложений есть связь между собой, тогда они могут передавать данные между собой, чтобы передать необходимое значение можно использовать символ $
, который объявит переменную к которой можно будет обратиться: $get_emails_inbox.messages.#.attachment_uids
, которая передает это значение в формате JSON.

Также проверим работоспособность сканирования полученного файла с помощью Yara правил.

Таким образом Shuffle получил вложения из письма с помощью Email
, передал его значение из локального хранилища, а приложение Yara
в свою очередь просканировало данный файл на основе своих правил (которые можно разрабатывать самостоятельно и загружать на платформу для обогащения) и нашла 5 совпадений.
P.S. в качестве вложения я прикрепил EICAR-Test-File.txt, который используется для проверки срабатывания различной детектирующей логикой (подробнее по ссылке).
[3] Позаботимся об формировании оповещения (алерта) с некоторой полезной информацией и его доставке. В данном шаге можно поставить какую-нибудь IRP платформу (по-типу TheHive, IRIS и иных), но в целях демонстрации и обучения – обрисую вариант с отправлением оповещения в Telegram канал, написанного на Python (хотя готовое приложение Telegram также есть “из коробки“).
Для этого нам понадобится приложение Shuffle Tools, внутри которого есть действие Execute python. Готовый код вставляем в поле Code.

Для удобства прилагаю ниже разобранный код, написанный на Python для отправления в тг-канал алерта:
import requests # Библиотека для работы с HTTP-запросами
# Словарь с информацией об письме
data = {
'Subject': '$get_emails_inbox.messages.#.header.subject',
'Date': '$get_emails_inbox.messages.#.header.date',
'From': '$get_emails_inbox.messages.#.header.from',
'Filename': '$get_emails_inbox.messages.#.attachment.#.filename',
'Extension': '$get_emails_inbox.messages.#.attachment.#.extension',
'Size': '$get_emails_inbox.messages.#.attachment.#.size',
'MD5': '$get_emails_inbox.messages.#.attachment.#.hash.md5'
}
token = '123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11' # Уникальный API Token бота
chat_id = '-9999999999999' # ID чата/канала в телеграмм
url = f'https://api.telegram.org/bot{token}/sendMessage'
# Формирование строки text_message с помощью генератора списков и метода join
text_message = "n".join([f"<b>{key}:</b> {value}" for key, value in data.items()])
# Словарь для данных, которые будут отправлены в теле HTTP-запроса
payload = {
'chat_id': chat_id,
'text': text_message,
'parse_mode': 'HTML'
}
# Отправляет сообщение с данными формата JSON по указанному URL
response = requests.post(url, json=payload)
# Небольшой блок на проверку результатов отправки
if response.status_code == 200:
print("Message has been sent!")
else:
print(f"An error occurred: {response.status_code} - {response.text}")
Проверяем правильность работы и получаем следующий результат:

[4] Последним шагом добавим расписание проверки и условие при котором будет отправляться алерт в Telegram. Для чего добавим приложение Schedule
, которое запускает целый Workflow по определенному расписанию, что позволит сделать сканирования регулярными и полностью автоматическими.

Чтобы данное расписание работало нужно выставить в течении скольких секунд (X
), например, каждые 2 минуты (= 120), необходимо запустить цепочку выполнения. В поле Runtime Argument
указывается стартовое приложение и действие для него, но в данном случае они связаны и поэтому этого указывать не требуется.
А для того, чтобы исключить ложные срабатывания – составляем условие, например, если количество совпадений Yara правил больше 0, то тогда выполняется следующее действие.

Слева в поле Source
указывается: {{ $yara_scan_attachment.#0.matches | size }}
, которое получает размер массива matches
(количество правил, которые обнаружили вредонос), справа в destination
указывается количество данных сработок, а между ними знак сравнения, то есть если хотя бы одно правило сработало, тогда будет отправлено уведомление в Telegram.

В принципе на этом этапе можно остановиться, но вся прелесть Shuffle в том, что можно создавать практически неограниченное количество Workflow под самые разные задачи. Все будет зависеть от наличия тех или иных СЗИ, также знаний как наладить процессы и самое главное фантазии.
В целом на этом все. В дальнейших статьях постараюсь показать еще больше классных приложений и функционала, процесс создания своего кастомного приложения и более увлекательных, сложных и ценных Workflows!
Если Вам нужна помощь | хотите обсудить тему более подробно, обращайтесь.
~rare_an0maly
Автор: rare_an0maly