Иногда так случается, что в организации уже есть зрелый ИТ‑отдел и есть пара ИБ‑специалистов. ИТ‑отдел уже наладил дежурства, смены и организовал систему мониторинга инфраструктуры, построенной, к примеру, на zabbix, которая успешно работает. Отдел ИБ, ещё не имеет своего SOC центра, но тоже хочет мониторить события безопасности и своевременно на них реагировать.

Для мониторинга существует множество инструментов для сбора и анализа событий безопасности, одним из которых является Wazuh, который, предположим, и внедрила наша служба ИБ. Остаётся вопрос, как оперативно реагировать на важные события? Можно смотреть в два окна — но данное решение вызовет много дискуссий и сопротивление. Проще интегрировать сообщения от системы мониторинга безопасности прямо в родной и отлаженный механизм мониторинга zabbix. Далее мы рассмотрим пару способов, как это можно сделать.

Первый способ – Взаимодействие через API

Wazuh 4.8.1 + zabbix 7.0.2

В первом способе мы будем настраивать взаимодействие через API метод, который добавили в седьмой версии zabbix: history.push. Наш zabbix сервер в тестовом стенде имеет ip 192.168.1.123, а wazuh сервер — 192.168.1.124. 

Настройка zabbix

Добавим шаблон. Открываем меню шаблонов: Сбор данных→группы шаблонов→Template

И создаём шаблон: Сбор данных→шаблоны→T_Wazuh_integration

Идём в узлы, добавляем узел wazuh_server и к серверу добавляем наш шаблон

После чего создаём элемент данных. Тип данных ставим Zabbix траппер, Тип информации — Текст:

Зайдем в наш элемент и посмотрим его ID http://192.168.1.123/zabbix/history.php?action=showvalues&itemids%5B%5D=47608 Запомним его – 47608.

Далее потребуется пользователь в zabbix, от имени которого мы будем обращаться к API. Для этого необходимо создать группу, роль, пользователя, API token – скопировать и запомнить токен.

Роль

Права на доступ к API

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

Переходим к настройке Wazuh

Установка zabbix-agent на wazuh server:

# apt install zabbix-agent

nano /etc/zabbix/zabbix_agentd.conf – указываем адрес zabbix сервера

Server=192.168.1.123

systemctl enable zabbix-agent
systemctl start zabbix-agent
systemctl status zabbix-agent

Далее идём в веб-консоль. Открываем Notifications и создадим Channels. Назовём chanel_zabbix, и в поле Метод выберем POST, а в поле Webhook укажем ссылку на наш Zabbix  API как на скрине ниже.

Дальше идём в alerting → monitors

Для примера будем отслеживать технику T1070.001 событие Clear Windows Event Logs (подробнее об этом). Для этого создадим объект «monitor» с именем и параметрами как на скриншоте ниже.

monitor 104 event windows

создаём Triggers, если у нас есть хотя бы 1 событие за последнюю минуту.

и Actions, который будет отправлять сообщение на API zabbix.

Запрос, который мы использовали в качестве примера. В itemid ставим id, который мы посмотрели ранее в zabbix сервере. В auth — наш API токен:

{"jsonrpc":"2.0","method":"history.push","params":{"itemid":47608,"value":"{{ctx.trigger.name}} агент {{ctx.results.0.hits.hits.0._source}}"},"id":1,"auth": "277f62a7bdbfa7159574abbe6342aafdffea4162471d47d4613de246e564e92d"} 

Подробнее о методе history.push.

В zabbix видим сообщение

Далее настраиваем триггеры и сообщения для дежурных администраторов по своему вкусу.

Второй способ — через утилиту Send_zabbix


Wazuh 4.7.3 + zabbix 6.4

До 7 версии в zabbix отсутствовал API метод history.push, и для настройки взаимодействия можно использовать утилиту zabbix_sender.

Настройка zabbix

В настройке zabbix не сильно отличается от седьмой версии. Добавляем на zabbix новый узел – сервер wazuh.

Выбираем узел с сервером wazuh и создаём элемент данных. Тип элемента «Zabbix траппер». Тип информации «Журнал (лог)» ключ можно указать любой, в примере «trap», запомним его, он нам потребуется дальше.

Далее можно настроить триггер в зависимости от пересылаемых сообщений. На этом настройку zabbix сервера для приёма сообщений можно считать законченной.

Настройка сервера Wazuh

Устанавливаем zabbix-agent на wazuh server. Устанавливаем утилиту zabbix_sender в zabbix manger.

Запустим веб консоль wazuh, откроем Manager configuration для редактирования и добавим блок:

<integration>
    <name>custom-zabbix</name>
    <group>log_clearing,log_clearing_auditlog,logs_cleared</group>
    <alert_format>json</alert_format>
  </integration>

Где в поле <name>custom-zabbix</name> зададим имя нашего скрипта для обработки события.

<group>log_clearing,log_clearing_auditlog,logs_cleared</group> — Условие на «группу» события, при которых наш обработчик будет применяться к событиям, имеющим одну из трёх указанных групп.

Далее на сервере wazuh‑manager в папке /var/ossec/integrations/ добавим файл custom-zabbix, по аналогии с теми файлами, что там уже лежат. И добавляем скрипт на python с именем custom‑zabbix.py, который будет разбирать события с указанными группами и отправлять события в zabbix через утилиту zabbix_sender.

Весь скрипт приводить не будем, он не сильно отличается от остальных скриптов в той же папке. Посмотрим только модифицированную функцию send_msg, отвечающую за отправку сообщений в zabbix.

В функции def process_args(args) поправим вызов функции send_msg(msg, webhook, json_alert)  и добавим передачу исходного сообщения json_alert.

В функцию send_msg внесём небольшие изменения:

def send_msg(msg: str, url: str, alert: any) -> None:
    """
        Send the message to the API

        Parameters
        ----------
        msg : str
            JSON message.
        url: str
            URL of the API.
    """
    if str(alert['data']['win']['system']['eventID'])=="104" or str(alert['data']['win']['system']['eventID'])=="1102":
        mssg='"Alert.WAZUH.IB Очистка логов журнала. На хосте "' + alert['agent']['name']+'" ip "'+alert['agent']['ip']+'" пользователь "'+alert['data']['win']['logFileCleared']['subjectUserName']+'", Сообщение "' +alert['data']['win']['system']['message']+'", время: "' +alert['timestamp']

        cmd = '/usr/bin/zabbix_sender -z 192.168.0.123 -k trap -s "wazuh_server " -o ' + mssg
        process = subprocess.Popen(cmd, stdout=subprocess.PIPE, shell=True)
        output, error = process.communicate()

Здесь мы проверяем ID события, равно ли оно 104 или 1102. Далее формируем наше сообщение в mssg и отправляем его на сервер zabbix, указав наш сервер zabbix, ключ, который мы ранее запомнили, и название узла.

Очищаем журнал на наше подопытном сервере и смотрим сообщения в zabbix:

Отлично, работает. Дальше надеемся, что дежурные инженеры своевременно отреагируют на отправляемы wazuh сообщения о возможных нарушениях безопасности и примут необходимые меры.

Вот такая схема. Что думаете?

Спасибо за внимание! Ваш Cloud4Y.

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