Автоматизация ИБ с workflow n8n

В компаниях, где отлажены процессы информационной безопасности, а также в центрах реагирования и мониторинга, используется ПО для автоматизации принятия решений при возникающих инцидентах, но даже в этом случае многим все еще необходимо писать сценарии для автоматизации рутинных операций. Что делать, если вы хотите автоматизировать рутину, но не хотите покупать дорогостоящее специализированное решение, разбираться с ним, а затем настраивать его в течение длительного времени в соответствии со своими потребностями? Более того, вы не хотите изобрестать велосипед со скриптами и делать что-то самостоятельно, изучая программирование и работая с базами данных?

Автоматизация ИБ с помощью workflow n8n

n8n — это просто конструктор, набор ингредиентов для готовки. Цель n8n — помочь обычному человеку завершить его рутинные рабочие процессы путем интеграции целого ряда различных объектов в единый оркестр. Это совсем не похоже на программирование.Однако, чтобы создать действительно мощный сборщик средств автоматизации, который соответствует вашим потребностям, желательно иметь опыт программирования на уровне Паскаля, способность находить и копировать код переполнения и, по крайней мере, иметь представление о том, как работает ваша сеть (интерфейс — это просто! ). n8n поможет приготовить чашку кофе в автомате по рекомендации любимого Telegram.

n8n играет роль серверной части процессов автоматизации, своего рода связующего звена между различными сущностями (скрипты, файлы, мессенджеры, веб-сайты, системы отчетности, CRM-системы, системы IP-телефонии, системы мониторинга — то есть почти все). Это помогает связать любое приложение с API и без него с любым другим приложением, и вы можете реализовать практически любую логику. Но, что наиболее важно, он может реализовать свою собственную логику с помощью программирования на JavaScript и запускать сценарии на сервере.

Настройка workflow интуитивно понятна и проста в модном веб-интерфейсе, рабочий процесс очень легко настроить. Отношения между сущностями и n8n реализуются с использованием различных архитектурных концепций, основной из которых является REST API. Данные могут поступать в различных форматах, для REST API обычно используется JSON / XML. Поскольку это открытый исходный код, вы можете написать свой собственный компонент или скрипт n8n на любом языке. N8n — отличный выбор для новичков в автоматизации.

Поскольку обзор функций решения немного утомительный и очень длинный, вы можете самостоятельно изучить руководства, изучить варианты интеграции и изучить примеры рабочих процессов, чтобы получить некоторые идеи. Также есть отличные статьи с примерами на medium и хорошая статья по установке в блоге LogRocket. Для начала вполне достаточно.

Идея

Многие слышали об OSINT и использовали различные инструменты для сбора информации о ресурсах и оценки своих инструментов безопасности. Все использовали мобильные приложения с простым и понятным интерфейсом. Было интересно изучить простой интерфейс Telegram со сложными инструментами, такими как Shodan и Masscan, а также проверить, чего стоит n8n в автоматизации. Это было первое, что пришло в голову после знакомства с n8n, и нужно было выяснить, как он справится с этим заданием.

Цель состоит в том, чтобы продемонстрировать процесс автоматизации случайно выбранной предметной области путем написания простого бота для Telegram, который, согласно информации от Shodan, может получать список возможных уязвимостей / эксплойтов по IP / URL. Для этого необходимо получить информацию об открытых портах, службах на этих портах и ​​возможных эксплойтах для этих служб. Полученную информацию в будущем придется проверять вручную. Это выходит за рамки данной статьи.

Установка

n8n написан на Node.JS, может работать как на Windows, так и на Linux. Всю информацию о рабочих процессах он хранит локально в БД SQLite. Может быть развернут как в докер-контейнере, так и прямо на хосте. Рассмотрим вариант установки прямо на хост Linux, для простоты. Есть опыт установки на CentOS 8.2  и Ubuntu 20.40 Desktop, отличия в установке минимальны. 

Установка необходимых пакетов:

sudo apt-get install nodejs npm build-essential python –y

Запуск поддержки БД:

sudo npm install sqlite3 --save

Установка n8n глобально на хост:

sudo npm install n8n -g

Запуск n8n с параметром —tunnel:

n8n start --tunnel

Параметр --tunnel нужен для правильной работы веб-хуков если на сервере отсутствует адрес, доступный из сети Интернет. 

После запуска видим адрес, по которому доступен редактор, http://localhost:5678/, если доступ будет с другой машины в сети, то вместо localhost используем IP-адрес (не забыв открыть порт 5678 на файрволе). 

Автоматизация ИБ с workflow n8n

Чтобы быстро приступить к работе, вам нужно будет ознакомиться с этим разделом документации, он очень простой. После создания пустого рабочего процесса у нас есть несъемный стартовый узел. Узел — это единое целое в рабочем процессе. Рабочий процесс начинается либо на стартовом узле при запуске рабочего процесса, либо в триггере, когда процесс активен и сообщение было получено от внешней системы (API, сценарий на хосте).Триггер тем или иным образом получает информацию о событии от внешней системы и обрабатывает ее. Ноды взаимодействуют друг с другом через соединения. Нода может иметь несколько подключений к другим нодам. Нода выполняет все действия с информацией — получение, обработку / изменение, вывод во внешние системы. Полный список узлов есть в документации. На этом краткий обзор завершен, перейдем к практике.

Создание бота в Telegram

Про создание ботов в telegram написано огромное количество материалов. Опираемся на официальную документацию и на вот эту статью по созданию telegram бота для n8n. С помощью бота BotFather создаем своего бота, получаем его токен. Добавляем несколько команд и их описание:

hostinfo - <IP/URL> Show host info from Shodan

scan - <127.0.0.1> Show output of masscan for some open ports. Please, be patient..

whatweb - <URL> Show whatweb output

exploit - <name> Show searchsploit output

Для удобства работы с ботом создаем группу, куда добавляем бота и сохраняем id группы для дальнейшей настройки. 

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

Запускаем n8n в режиме «—tunnel», для корректного получения обновления от серверов telegram. При первом запуске в веб-интерфейсе видим пустой лист с одной лишь нодой Start. Добавляем на лист триггер telegram, в настройках забиваем Credentials (токен доступа, полученный ранее). В Updates выбираем либо *, либо Message. Так как это триггер, его не нужно соединять со стартовой нодой. 

Автоматизация ИБ с workflow n8n

Сохраняем workflow и делаем его активным с помощью переключателя в верхнем правом углу. Нажимаем Execute Workflow и пишем что-либо в окно чата с ботом. Видим, что статус «Waiting for webhook call..» меняется на Execute Workflow. На ноде триггера появляется зеленый круг, сигнализирующий об успешном выполнении триггера. В свойствах триггера видим результат – полученное сообщение об обновлении в формате JSON с содержанием сообщения и кучей полей. 

Автоматизация ИБ с workflow n8n

Далее добавляем на поле ноду Switch, которая отвечает за обработку команды, полученной от бота. Соединяем ее линией с триггером Telegram. В свойствах ноды Switch видим простейший выбор из 4-х вариантов. Выбираем Mode – RulesData Type – string, в Value после нажатия на шестеренку выбираем Add Expression и видим следующее окно:

Автоматизация ИБ с workflow n8n

Проваливаемся по списку входных данных – Current Node -> Input Data -> JSON -> message -> text для выбора содержимого сообщения. В нижней части результат Expression – содержимое нашего сообщения. Закрываем окно, в настройках Switch добавляем правило роутинга, сообщение должно содержать первую команду «host». Выбираем выход «0» для дальнейшей ветки обработки. Для четырех команд бота у нас должно быть четыре правила роутинга. Получился вот такой workflow:

Автоматизация ИБ с workflow n8n

В дальнейшем не будем расписывать настолько подробно, механика создания workflow действительно очень проста. В ходе работ не забываем сохраняться. 

У любого workflow есть два варианта работы – testing (при нажатии на кнопку Execute Workflow) и production – когда активен переключатель Active в верхнем правом углу. В тестовом варианте работы workflow выполняется только один раз, в варианте работы production он работает постоянно и запускается при старте сервиса n8n. В тестовом режиме мы можем видеть данные для обработки в веб-интерфейсе n8n, в отличие от режима production. 

Перечень активных процессов можно увидеть через меню, выбрать пункт Open:

Автоматизация ИБ с workflow n8n

Как  я нашел баг

Немного отвлечемся от процесса создания нашего workflow и углубимся во внутренности работы триггера telegram. В данном случае для получения обновлений от API Telegram используется механизм веб-хуков. В отличие от традиционного метода обмена информацией по протоколу HTTP «запрос – ответ», механизм веб-хуков работает асинхронно. Заключается он в том, что серверу n8n необходимо «зарегистрироваться» на сервере Telegram с указанием URL-адреса, на котором он будет получать HTTPS-запрос POST, содержащий сериализованное обновление в формате JSON. Регистрация производится методом setWebhook при переводе workflow в активный режим либо при тестовом прогоне workflow. В этот момент сервер n8n отправляет с помощью запроса setWebhook свой URL-адрес для интеграции с API Telegram с целью получения обновлений. В момент остановки сервиса либо в момент окончания тестового процесса производится удаление интеграции с веб-хуком для того, чтобы уведомить API Telegram о том, что никто не сможет принять запросы об обновлении.

Поскольку у нас нет общедоступного URL-адреса для веб-хука в условиях тестирования, нам нужно получить его с помощью утилиты localtunnel. Для этого только при запуске указываем параметр –tunnel. Мы видим URL-адрес, полученный на консоли, и он также отправляется в Telegram API для обработки обновлений. URL-адрес создается динамически и отличается для каждого запуска службы.

Все началось с того, что я заметил странную работу триггера Telegram – при остановке и последующем запуске сервиса не приходили обновления от бота. Они приходили, если еще раз сделать workflow активным. Я еще раз изучил API Telegram и воспользовался методом getWebhookInfo для просмотра текущего URL веб-перехватчика. Оказалось, что после остановки сервиса n8n на хосте не производится отмена регистрации старого URL-адреса. Также при новом запуске сервиса не производится установка нового URL. Баг был отправлен разработчику, подтвержден и был исправлен в релизе n8n@0.79.3.

Получаем информацию от Shodan

В качестве примера давайте получим данные о хосте от широко известного в узких кругах поисковика Shodan. У него есть REST API, а у нас есть желание упростить себе жизнь в части инструментального анализа уязвимостей, получая информацию прямо в чат (или куда-то еще). Для этого нам необходимо зарегистрироваться и получить API -ключ для Shodan в настройках нашего аккаунта. 

В любом случае перед тем, как делать любой workflow, необходимо ответить себе на вопросы: что он будет делать, как он будет это делать, что потребуется для этого. В идеале рекомендую нарисовать простую блок-схему процесса на листке бумаги, чтобы было легче. 

Но так мы уже определились с целями, то приступим к реализации. 

Автоматизация ИБ с workflow n8n

Формат нашей команды – «/host example.com», где первая часть – это команда, вторая часть IP или корневой URL. Так как API Shodan выдает нам информацию только по IP-адресу, корневой URL переводить в IP мы будем с помощью новой технологии DoH в реализации Google. Можно сделать это множеством способов, но используем этот модный и стильный способ взаимодействия с DNS. Получаем IP-адрес и через Shodan API получаем и обрабатываем информацию, отправляя выжимку из нее в тот же чат в telegram. Звучит все просто. Для начала нам нужно знать, что подали на вход команды – IP или URL. JavaScript, функции на котором можно легко писать прямо в интерфейсе n8n, нам в этом поможет. Для этого добавим ноду типа Function и соединим ее с нодой sw_cmd

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

Получаем информацию от Shodan

Ищем, как отличить IP от URL и на stackoverflow находим нужное регулярное выражение. Пишем код в ноде func_isIP:

items[0].json.IP = items[0].json.message.text.split(' ')[1];

items[0].json.isIP = false;

if (/^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/.test(items[0].json.IP)) {  

  items[0].json.isIP = true;

  return (items);

}  

return (items);

Код получает на вход сериализованное JSON-сообщение, из него берет вторую часть после пробела, прогоняет ее регулярным выражением и в новую переменную isIP присваивает значение true, если это IP-адрес. Опережая комментарии про проверку ввода пользователя – не в данной статье, в ней мы минимально затрагиваем тему программирования. В случае неверного или нестандартного ввода в n8n есть процесс обработки ошибок, который необходимо настраивать. 

Далее добавляем ноду IF_is_IP для выбора дальнейшей ветки алгоритма. В зависимости от содержимого, нам надо будет с помощью ноды типа HTTP Request выполнить запрос через API. Добавляем ноду http_req_shHost, соединяем с нодой IF_is_IP и настраиваем параметры запроса в соответствии с документацией производителя API (в данном случае Shodan). Аналогично настраиваем еще одну ноду http_req_DoH для получения информации от DNS. Методы запроса и методы аутентификации описаны в документации, все делаем в соответствии с ней. 

Нужные переменные прокликиваем мышкой из Input Data, перед этом выполнив тестовый запуск workflow для получения ответа на запрос. Конструируем запрос:

Получаем информацию от Shodan

Результат выполнения запроса DoH URL: ya.ru в формате JSON:

Получаем информацию от Shodan

Ноду http_req_DoH соединяем с копией ноды http_req_shHost и мышкой прокликиваем ее новые параметры, меняя значение IP в параметрах запроса, чтобы получилось нужное значение: api.shodan.io/shodan/host{{$node[«http_req_DoH»].json[«Answer»][1][«data»]}}?key=<api_key_cutted>. Далее конструируем отчет, который будет отправлен в чат нодой Telegram2 (отправка сообщения в чат), выбирая нужные поля из Input Data:

Получаем информацию от Shodan

В чате видим сообщение с данным отчетом:

Сканируем порты с помощью masscan

Так как область, которую мы автоматизируем, не ограничивается получением информации через различные API (а многие API еще и стоят денег за каждый запрос), давайте попробуем скрипты. Для работы с ними в n8n есть нода типа Execute Command, добавим ее в нужную ветку sw_cmd под именем cmd_masscanPorts. Перед этим извлечем IP-адрес из строки сообщения с помощью функции func_getIP.

Сканируем порты с помощью masscan

Поставим на хост с n8n известный сканер masscan. Если у нас n8n работает в докер-контейнере, то ставить masscan нужно в контейнер. Установка довольно проста. После установки тестируем команды, с помощью которых мы будем сканировать порты. У меня получилась строка вида masscan  -p 1-1024,8080 127.0.0.1. Диапазон портов ограничен до 1-1024,8080, чтобы сократить время ожидания. В свойствах ноды cmd_masscanPorts мы настраиваем входные данные от функции func_getIP (значок шестеренки, Add Expression). 

Сканируем порты с помощью masscan

Получается команда masscan  -p 1-1024,8080 {{$node[«func_getIP»].json[«IP»]}}. Запускаем для теста workflow, вводим команду /scan 92.53.96.181 Обращаем внимание, что нода cmd_masscanPorts может выдавать для обработки как результат выполнения (stdout), так и результат ошибки или ход выполнения сканирования (stderr). Тестируем выполнение workflow, смотрим на выходные данные. Добавляем снова ноду для отправки сообщения в чат Telegram3, проверяем, видим в чате (спустя некоторое время выполнения команды masscan) стандартный вывод команды:

Сканируем порты с помощью masscan

Отлично, мы научились выполнять скрипты и обрабатывать их вывод. 

Определяем версии веб-компонентов с помощью whatweb

Как и в прошлом разделе, ставим whatweb на хост с n8n. Конструируем команду, пришлось отключить цветовое выделение, так как вывод некорректно обрабатывался при отправке сообщения в telegram. Получилась команда вида whatweb itlanit.ru —color=never. Результаты также отправляем сообщением в чат. 

Определяем версии веб-компонентов с помощью whatweb

Ищем эксплоиты с помощью searchsploit

Вы можете искать эксплойты по версиям программного обеспечения несколькими способами. Оставляем в стороне платные запросы API. Посмотрим, как это можно сделать бесплатно без смс и регистрации, помня при этом основы JS. Ставим searchsploit на хост, изучаем документацию, смотрим примеры команд и их вывод. Подозрение сразу вызывает два параметра, которые могут быть полезны:

-j, --json     Show result in JSON format    -w, --www     Show URLs to Exploit-DB.com rather than the local path

Определяем версии веб-компонентов с помощью whatweb

Добавляем ноду функции, которая должна вырезать нам имя софта из команды /exploit notepad, аналогично примеру выделения IP адреса из пункта про Shodan. При этом не забываем, что у нас может быть в запросе как название, так и версия софта, а значит из сообщения нам надо отбросить только команду. То есть надо выполнить простые операции со строками и массивами в JS. Итоговая функция func_getName:

emp = items[0].json.message.text.split(' '); temp = temp.slice(1, temp.length); items[0].json.soft = temp.join(' '); return items;

Добавляем ноду Execute Command, в команде указываем выражение: 

searchsploit -j -w {{$node[«func_getName»].json[«soft»]}}

И у нас опять есть проблема, в результате получаем JSON, но в формате простого текста. Для преобразования используем метод json.parse в функции func_getJSON:

items[0].json.p_json = JSON.parse(items[0].json.stdout);

return items;

Теперь у нас есть JSON, который можно разбирать и конструировать из него сообщение. Отметим, что количество эксплойтов может быть произвольным, а значит нам понадобится цикл для обработки. Итоговый код func_getMsg:

items[0].json.msg_text = '*Exploits list: *\n';

items[0].json.p_json.RESULTS_EXPLOIT.forEach(function (RESULTS_EXPLOIT){

  items[0].json.msg_text = items[0].json.msg_text + RESULTS_EXPLOIT.Title + ' \n '+ RESULTS_EXPLOIT.URL + '\n';

  });

return items;

Звездочки добавлены для разметки Markdown, URL умеет распознавать сам Telegram. Добавляем ноду для отправки сообщения Telegram. Вот наше итоговое сообщение в чате:

Определяем версии веб-компонентов с помощью whatweb

На этом завершим. У нас есть робот, который может собирать информацию из разных источников.
Как еще можно использовать n8n для выполнения рутинных операций специалистом по информационной безопасности? Например, получать обновления об уязвимостях, обнаруженных в RSS-каналах, и анализировать обновления по ключевым словам — названию программного обеспечения, используемого в организации. Если найдена новая уязвимость в ПО, то отправлять сообщение администратору безопасности. Также допустим, если мы собираем хэш-суммы файлов на рабочей станции, то n8n может дополнительно проверять их на VirusTotal, и проверять, не пропустил ли установленный антивирус нового зловреда и отправлять уведомление администратору.

Плюсы

  • Open source.
  • Низкий порог входа.
  • Хорошая документация.
  • Возможность расширения функционала: код на JS, хостовые скрипты.
  • Отзывчивое сообщество.

Минусы

  • Отсутствие русскоязычной документации.
  • Отсутствие компонентов интеграции с типовыми отечественными сервисами (1С, Bitrix, Яндекс, Mail.ru)

Подводя итоги, могу сказать, что продукт мне понравился. Да, он не уникален, и у него много конкурентов (Zapier, IFTT, automate.io и т. д.). Но вы можете видеть, что концепция продукта была хорошо продумана. Особенно с точки зрения простоты использования и расширяемости.
В статье рассматриваются различные случаи использования n8n. Надеюсь, статья была полезной и подтолкнула читателя к некоторым идеям по автоматизации своей деятельности.

Click to rate this post!
[Total: 0 Average: 0]

Leave a reply:

Your email address will not be published.