Сборка сенсора для анализа трафика

6 мин

Сборка сенсора для анализа трафика

Сенсор будет мониторить трафик и обнаруживать сетевые угрозы.

Назначение элементов сенсора

  1. tzsp2pcap - утилита, которая принимает поток TZSP (TaZmen Sniffer Protocol) — например, зеркалирование трафика с MikroTik — очищает его от лишних заголовков пересылки и транслирует в виртуальный интерфейс, на котором трафик будут анализировать zeek и suricata.
  2. tshark - консольная версия Wireshark: будет захватывать трафик с интерфейса и сохранять в файл для последующего анализа (если он потребуется для разбора обнаруженных событий). Её использование опционально - запись всего трафика может делать и tzsp2pcap, но если необходима запись с фильтрами захвата, то tshark удобнее. Для самого сенсора он необязателен.
  3. suricata - система обнаружения вторжений (IDS): анализирует живой трафик и генерирует алерты по имеющимся у неё правилам (Emerging Threats, ET).
  4. zeek - анализатор сетевого трафика: создаёт подробные структурированные логи соединений и протоколов (HTTP, DNS, TLS, SSH и др.) для поведенческого анализа и расследований.
  5. wazuh - SIEM платформа: в онлайн-режиме собирает и визуализирует логи консольных suricata и zeek, формирует алерты и отчёты.
  6. zui (бывший brim) - desktop-инструмент для офлайн-анализа логов suricata и zeek, а также pcap-файлов.

    Wazuh и ZUI нужны, в первую очередь, для визуализации полученных от Suricata и Zeek алертов, которые (в свою очередь) будут генерировать на основе трафика от Mikrotik, полученного и очищенного tzsp2pcap`ом.

    Все элементы будут устанавливаться на одну и ту же машину. Если вы планируете использовать сенсор в масштабах среднего или крупного офиса - имеет смысл сразу вынести wazuh на отдельную машину, а логи и трафик писать в отдельное хранилище.

Технические требования

Потребляемые ресурсы сильно зависят от количества трафика, который вы планируете закидывать на сенсор. Минимальная конфигурация под 3-5 сетевых устройств: 8 vCPU, 8 GB RAM, 250 GB. Такого количества дискового пространства хватит на несколько часов (если захватывать трафик в pcap) или на несколько дней (если ограничиться метаданными без записи пакетов). Для постоянно работающего сенсора рекомендуется рассматривать хранилища в несколько терабайт.

В примере установка будет производиться на виртуалку с Ubuntu 24.04.5 LTS, все команды в инструкции выполняются от имени пользователя root. Перед началом рекомендуется обновить ОС и установить правильный часовой пояс:

apt update && apt upgrade -y
timedatectl set-timezone Europe/Moscow

Настраиваем получение трафика по tzsp

  1. Устанавливаем зависимости:
apt install -y git build-essential libpcap-dev tcpreplay screen
  1. Собираем бинарник tzsp2pcap с git`а:
git clone https://github.com/thefloweringash/tzsp2pcap.git
cd tzsp2pcap
make
cp tzsp2pcap /usr/local/bin/

Для работы zeek и suricata нужен виртуальный (dummy) интерфейс, на который tzsp2pcap будет закидывать полученный трафик. Netplan такие интерфейсы создавать не умеет, поэтому воспользуемся средствами systemd-networkd.

  1. Создайте файл /etc/modules-load.d/dummy.conf и поместите в него тип интерфейса:
dummy
  1. Создайте файл /etc/systemd/network/10-dummy0.netdev и объявите в нём виртуальный интерфейс:
[NetDev]
Name=dummy0
Kind=dummy
  1. Создайте файл /etc/systemd/network/10-dummy0.network поместите в него параметры виртуального интерфейса:
[Match]
Name=dummy0
[Link]
MTUBytes=3000
[Network]
DHCP=no
LinkLocalAddressing=no
  1. Включите демон systemd-networkd:
systemctl enable --now systemd-networkd.service
  1. Проверьте, что интерфейс появился:
ip link show dev dummy0
  1. Создайте конфиг демона tzsp2pcap, который будет принимать трафик от mikrotik на порту 37008 и отдавать его в интерфейс dummy0:
systemctl edit --force --full tzsp2pcap.service
[Unit]
Description=TZSP to PCAP
After=network.target systemd-networkd.service
Requires=systemd-networkd.service

[Service]
Type=simple
ExecStart=/bin/sh -c "/usr/local/bin/tzsp2pcap -f -p 37008 | /usr/bin/tcpreplay --topspeed -i dummy0 -"
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target
systemctl daemon-reload && systemctl enable --now tzsp2pcap.service
  1. Проверьте, что демон tzsp2pcap слушает порт 37008:
ss -tulpan | grep 37008
  1. Для проверки работы tzsp2pcap включите tcpdump на интерфейсе dummy0 с ограничением на несколько пакетов:
tcpdump -i dummy0 -n -c 30
  1. На mikrotik включите встроенный сниффер (замените ip на адрес сенсора и проверьте интерфейс mikrotik`а, трафик которого планируете анализировать):
/tool sniffer set filter-interface=bridge1 filter-ip-address=!10.10.10.50/32 filter-stream=yes streaming-enabled=yes streaming-server=10.10.10.50

Если все сделано верно - в tcpdump на сенсоре вы увидите несколько пакетов.

Запись трафика в файл

Опциональная возможность, используйте с оглядкой на дисковое пространство. Zeek и Suricata не пишут трафик полностью, они запоминают его метаданные (заголовки), без самого тела сетевых пакетов.

Для включения записи (в примере - с чанкованием по 100 МБ) используйте tshark на интерфейсе dummy0:

apt install tshark
tshark -i dummy0 -b filesize:102400 -w capture.pcapng

Настройка Suricata

  1. Установите Suricata и обновите базу угроз:
apt-get install -y suricata
suricata-update
  1. Отредактируйте конфиг /etc/suricata/suricata.yaml, указав интерфейс для получения копии трафика:
...
# Linux high speed capture support
af-packet:
- interface: dummy0
...
  1. Перезапустите Suricata для применения настроек:
systemctl restart suricata
  1. Проверьте лог Suricata, в нём должны появляться проанализированные сетевые события:
tail -f -n 10 /var/log/suricata/eve.json

Настройка Zeek

  1. Добавьте репозитарий и ключи:
echo 'deb http://download.opensuse.org/repositories/security:/zeek/xUbuntu_24.04/ /' | sudo tee /etc/apt/sources.list.d/security:zeek.list
curl -fsSL https://download.opensuse.org/repositories/security:zeek/xUbuntu_24.04/Release.key | gpg --dearmor | sudo tee /etc/apt/trusted.gpg.d/security_zeek.gpg > /dev/null
  1. Установите Zeek:
apt update && apt install zeek
  1. Добавьте в конфиг /opt/zeek/etc/node.cfg информацию об интерфейсе:
...
[zeek]
type=standalone
host=localhost
interface=dummy0
...
  1. Отредактируйте конфиг /opt/zeek/share/zeek/site/local.zeek, добавьте в конец параметр для записи событий в формате JSON (иначе Wazuh не сможет их обработать):
redef LogAscii::use_json = T;
  1. Запустите Zeek:
/opt/zeek/bin/zeekctl deploy
  1. Проверьте, что Zeek обрабатывает трафик и генерирует события:
watch ls -lh /opt/zeek/logs/current/
tail -f -n 10 /opt/zeek/logs/current/conn.log

Настройка Wazuh

  1. Проверьте, что используемые Wazuh порты не заняты:
ss -tulpan | grep -e 443 -e 1514 -e 1515 -e 9200 -e 55000
  1. Скачайте и запустите установщик :
curl -sO https://packages.wazuh.com/4.14/wazuh-install.sh 
bash ./wazuh-install.sh -a

По окончанию установки обратите внимание на учетные данные администратора и ссылку для входа в веб-интерфейс:

INFO: You can access the web interface https://<wazuh-dashboard-ip>:443
User: admin
Password: <password>
  1. В конфиге /var/ossec/etc/ossec.conf укажите расположение алертов Zeek и Suricata для их индексации в Wazuh.
<ossec_config>
...
  <localfile>
    <log_format>json</log_format>
    <location>/var/log/suricata/eve.json</location>
  </localfile>

  <localfile>
    <log_format>json</log_format>
    <location>/opt/zeek/logs/current/*.log</location>
  </localfile>
</ossec_config>
  1. В конфиге /var/ossec/etc/local_internal_options.conf увеличьте число полей, получаемых декодером, до максимального:
analysisd.decoder_order_size=1024
  1. Перезапустите демон wazuh-manager:
systemctl restart wazuh-manager
  1. Проверьте лог Wazuh на наличие ошибок:
tail -f /var/ossec/logs/ossec.log | grep -Ei 'wazuh-agent|file|error'
  1. В веб-интерфейсе Wazuh события из Zeek и Suricata будут видны в разделе Threat intelligence - Threat Hunting - Events.

    wazuh

Настройка ZUI

ZUI предназначен для офлайн-анализа событий Zeek и Suricata на отдельной машине.

  1. На вашем десктопе скачайте и установите ZUI с официального сайта.
  2. Скачайте pcapng-файл с копией трафика, если вы его записывали, и файлы с событиями на машину с установленным ZUI. Места их хранения на сенсоре:
/var/log/suricata/eve.json # Все события из Suricata - в одном файле
/opt/zeek/logs/current/*.log # События из Zeek - рассортированы в несколько log-файлов
  1. В интерфейсе создайте новый пул данных (new pool), внутри него нажмите загрузить данные (load data) и укажите скачанные на предыдущем шаге файлы по одному.
  2. После загрузки файлов кликните на query pool - данные отобразятся в удобном интерфейсе.

    zui

Очистка событий

Если вы планируете включать сенсор эпизодически и\или проверять трафик точечно - нет смысла занимать дисковое пространство старыми алертами. Ниже представлены способы очистки логов каждого из компонентов сенсора:

Очистка событий в Suricata:

find /var/log/suricata -name eve.json -delete
find /var/log/suricata -name *log -delete

systemctl restart suricata.service

Очистка событий в Zeek:

find /opt/zeek/logs/ -name *log -delete
find /opt/zeek/logs/ -name *log.gz -delete
find /opt/zeek/logs/ -type d -empty -delete

/opt/zeek/bin/zeekctl stop
/opt/zeek/bin/zeekctl deploy

Очистка событий в Wazuh производится в веб-интерфейсе. В разделе Indexer management - Dev tools выполните запросы к базе:

DELETE /wazuh-alerts-*
DELETE /wazuh-archives-*

Послесловие

Если у вас всё получилось - отлично. Теперь можете скачать SecurityOnion и пользоваться им. Он из коробки умеет всё то же самое: под капотом у него - те же Zeek и Suricata; а для визуализации встроены Elasticsearch, Kibana, Grafana и преднастроенные дашборды xD Существенная разница состоит в том, что:

  1. SecurityOnion не работает через TZSP, ему нужно полное зеркалирование трафика на порт, соответственно железка под ним (именно железка, не виртуалка), должна иметь минимум два физических адаптера.
  2. У SecurityOnion существенные требования к вычислительным мощностям. Под stadalone-ноду нужна железка от 8 vCPU и от 24 Гб ОЗУ.

Сюда