Настроим Suricata в связке с ROS. Схема работы будет заключаться в следующем. На "ROS" будет настроен "Port-Mirroring" с использованием встроенного в роутер "Switch Chip" или "TZSP sniffing". Suricata будет переведена в режим работы "IDS" (режим обнаружеия) и будет слушать на указанном интерфейсе весь проходящий трафик. С помощью встроенных сигнатур будет производиться обработка трафика и детектирование угроз. Детектированные угрозы будут добавляться в специальный файлик и обрабатываться скриптом "Mikrocata". В свою очередь, скрипт будет подключаться к "ROS" по "API" и добавлять обнаруженные угрозы в "Adress-List". Далее в таблице "RAW" будет производиться блокировка по указанному адресс-листу.
Будут использоваться:
- Аппаратная часть:
- Роутер: MikroTik RB750Gr3;
- Сервер: Hardware virtualization;
- Сетевая карта: Intel I350-T4;
- Программная часть:
- Гипервизор: Proxmox v7.2-7;
- OS: Debian Bullseye;
- IDS/IPS: Suricata v6.0.6;
- Скрипт: Mikrocata или Bash_Cata;
Ссылки на документацию:
Источники:
Отдельное спасибо автору скрипта Mikrocata [zzbe] за помощь и консультацию по настройкам!
Способ с помощью Port-Mirroring:
Приемущество этого способа в меньшей нагрузке на устройство MikroTik и простоте настройки.
Установка:
В VM прокидываем с помощью "PCI Passthrough" необходимый порт сетевого адаптера Intel I350-T4 и подключаем к ether5. На него будет зеркалироваться трафик с порта ether1.
ROS:
Настройка зеркалирования портов. Порты ether1=ISP, ether5=suricata vm.
- Включение Port-Mirroring:
/interface/ethernet/switch/
set 0 mirror-source=ether1 mirror-target=ether5
- Блокировка Address-List:
/ip/firewall/raw/
add action=drop chain=prerouting comment="Drop IDPS" in-interface=FTTx src-address-list=idps_alert
В скрипте "Mikrocata", необходимо задать новое значение переменной BLOCK_LIST_NAME = "idps_alert".
Устанавливаем необходимые зависимости. Версия librouteros должна быть от 3 или выше.
# apt install python3-pip
# pip3 install librouteros ujson pyinotify
- Подготовка:
# mkdir /var/lib/mikrocata && touch /var/lib/mikrocata/savelists.json
# mkdir /etc/mikrocata && touch /etc/mikrocata/ignore.conf
# touch /var/log/suricata/alerts.json
- Скачиваем скрипт:
# wget https://github.com/zzbe/mikrocata/archive/master.zip
# unzip master.zip
- Настройка скрипта:
# cp mikrocata-master/mikrocata.py /usr/local/bin/
# cp mikrocata-master/mikrocata.service /etc/systemd/system/
# systemctl daemon-reload
# systemctl enable mikrocata.service
- Настраиваем значения переменных:
# nano /usr/local/bin/mikrocata.py
Suricata:
Устанавливаем необходимые зависимости.
# apt install libpcre3 libpcre3-dbg libpcre3-dev build-essential autoconf automake libtool libpcap-dev libnet1-dev libyaml-0-2 libyaml-dev zlib1g zlib1g-dev libmagic-dev libcap-ng-dev libcap-ng0 libjansson-dev pkg-config rustc cargo libnss3-dev
# apt install libgeoip-dev liblua5.1-0-dev libhiredis-dev libevent-dev python3-yaml
Установка Suricata-Update:
Менеджер управления rulsets.
# apt install python3-pip
# pip3 install suricata-update
Компиляция и установка пакета:
Со стандартным набором компонентов.
# wget -P /tmp https://www.openinfosecfoundation.org/download/suricata-6.0.10.tar.gz
# tar -xf /tmp/suricata-*.tar.gz -C ./
# cd suricata-*
# ./configure --prefix=/usr/ --sysconfdir=/etc/ --localstatedir=/var/
# make
# make install-full | make install-conf | install-rules
- Проверяем версию и параметры:
# suricata -V
# suricata --build-info
You can now start suricata by running as root something like:
/usr/bin/suricata -c /etc/suricata/suricata.yaml -i eth0
/usr/share/suricata/rules/
/var/lib/suricata/rules
Suricata-Update:
- Для обновления:
# pip3 install --upgrade suricata-update
- Обновляем индекс источника:
# suricata-update update-sources
- Просмотреть доступный список источников:
# suricata-update list-sources
- Обновить правила:
# suricata-update
- Отключить источник:
# suricata-update disable-source et/pro
- Удалить источник:
# suricata-update remove-source et/pro
Доступные бесплатные источники:
# suricata-update enable-source et/open
# suricata-update enable-source oisf/trafficid
# suricata-update enable-source sslbl/ssl-fp-blacklist
# suricata-update enable-source sslbl/ja3-fingerprints
# suricata-update enable-source etnetera/aggressive
# suricata-update enable-source tgreen/hunting
# suricata-update enable-source malsilo/win-malware
Обновление:
Suricata можно обновить, просто установив новую версию в те же места, что и уже установленная версия.
Настройка прав:
# groupadd suricata
# chgrp -R suricata /etc/suricata
# chgrp -R suricata /var/lib/suricata/rules
# chgrp -R suricata /var/lib/suricata/update
# chmod -R g+r /etc/suricata/
# chmod -R g+rw /var/lib/suricata/rules
# chmod -R g+rw /var/lib/suricata/update
Настройка автозапуска:
Взято из установленного бинарного пакета Debian Bullseye (v6.0.1). Если используется "systemd", то в "/etc/default/suricata" задать "RUN=no". И не будет вывода в "suricata-start.log".
- /etc/default/: [link]
# nano /etc/default/suricata
- /etc/init.d/: [link]
# nano /etc/init.d/suricata
# chmod +x /etc/init.d/suricata
- Добавляем в автозагрузку:
# update-rc.d suricata defaults
- Удалить из автозагрузки:
# update-rc.d suricata remove
- Запускаем:
# /etc/init.d/suricata { start | stop | restart }
- sustemd: [link]
- Управление демоном:
# systemctl daemon-reload
# systemctl start|stop|status suricata.service
# systemctl enable|disable suricata.service
Настройка suricata.yaml:
Настройка базовой конфигурации.
- Создаем бэкап:
# cp /etc/suricata/suricata.yaml{,.bkp}
- Редактируем настройки:
# nano /etc/suricata/suricata.yaml
##
## Step 1: Inform Suricata about your network
##
HOME_NET: "[172.16.5.0/24]" # Указываем на адресацию в домашней сети;
##
## Step 2: Select outputs to enable
##
stats:
enabled: no
outputs:
- fast:
enabled: no # Отключаем стандартный вывод логов в файл fast.log;
- eve-log: # Подключаем вывод логов для Mikrocata в файл alerts.json с типом "alert";
enabled: yes
filetype: regular
filename: alerts.json
types:
- alert
- eve-log:
enabled: no # Отключаем стандартный вывод логов в файл eve.json;
# Stats.log contains data from various counters of the Suricata engine.
- stats:
enabled: no # Отключаем вывод статистики в stats.log;
##
## Step 3: Configure common capture settings
##
af-packet:
- interface: tzsp0 # Указываем интерфейс для прослушивания;
##
## Step 4: App Layer Protocol configuration
##
app-layer:
protocols:
mqtt:
enabled: no
rdp:
enabled: yes
http2:
enabled: yes
sip:
enabled: no
##
## Advanced settings below
##
host-mode: sniffer-only # Изменяем режим работы на IDS;
##
## Performance tuning and profiling
##
detect:
profile: high # Насколько агрессивно выполняется разделение отдельных сигнатур на группы;
##
## Configure Suricata to load Suricata-Update managed rules.
##
default-rule-path: /var/lib/suricata/rules # Путь для подключаемых файлов правил с сигнатурами;
rule-files:
- suricata.rules # Автоматически генерируемый утилитой suricata-update файл с правилами;
Проверяем настройки:
# suricata -T
- Проверка включенных протоколов уровня приложения:
# suricata --list-app-layer-protos
Отключить необходимые правила:
Можно отключить по сигнатуре, файлу и источнику.
# nano /etc/suricata/disable.conf
# STREAM
1:2210044 #SURICATA STREAM Packet with invalid timestamp :: Generic Protocol Command Decode ::
# suricata-update
---
# service mikrocata stop && service suricata stop
/var/log/suricata/alerts.json
/var/log/suricata/eve.json
/var/log/suricata/fast.log
/var/log/suricata/stats.log
/var/log/suricata/suricata.log
/var/log/suricata/suricata-start.log
/var/lib/mikrocata/savelists.json
/var/lib/mikrocata/uptime.bookmark
/home/shells/bash_cata/mark.ip
# suricata-update
# service mikrocata start && service suricata start
# rm -r /var/log/suricata/*.log.*
# rm -r /var/log/suricata/*.json.*
Ротация логов:
Если используется, то должна быть опция: "copytruncate". Она позволит обрезать исходный файл журнала взамен перемещения старого файла журнала и создания нового.
# nano /etc/logrotate.d/suricata
# Sample /etc/logrotate.d/suricata configuration file.
/var/log/suricata/*.log /var/log/suricata/*.json {
weekly
missingok
rotate 3
compress
delaycompress
copytruncate
sharedscripts
postrotate
/bin/kill -HUP `cat /run/suricata.pid 2> /dev/null` 2> /dev/null || true
endscript
}
Проверка работоспособности:
- Лог детектированных угроз (alerts), по этому логу можно блокирывать IP-адреса атакующих;
# tail -f /var/log/suricata/fast.log
- Лог детектированных угроз (alerts) в формате json, необходим для mikrocata, аналог fast.log;
# tail -f /var/log/suricata/alerts.json
- Лог всего трафика, проходящего через suricata;
# tail -f /var/log/suricata/eve.json
Способ через TZSP sniffing:
Для этого нам понадобится "tzsp2pcap", с его помощью мы будем преобразовывать протокол tzsp -> pcap и "tcpreplay", он поможет перенаправить трафик на указанный "dummy" интерфейс. Приемущество этого способа в том, что на ROS, мы можем конкретно указать, какой трафик следует направлять в Suricata. Также заблокированный IP-адрес больше не попадет в IDS, т.к. он отфильтруется в таблице "RAW" и не достигнет таблицу "Mangle".
tzsp2pcap: [link]
# wget -P /tmp https://github.com/thefloweringash/tzsp2pcap/archive/master.zip
# unzip /tmp/master.zip
# cd tzsp2pcap-master/
# make
# make install
tcpreplay: [link]
# wget -P /tmp https://github.com/appneta/tcpreplay/releases/download/v4.4.1/tcpreplay-4.4.1.tar.gz
# tar -xf /tmp/tcpreplay-4.4.1.tar.gz -C /root
# cd tcpreplay-4.4.1/
# ./configure
# make
# make install
Создание dummy интерфейса: [link]
- Создаем интерфейс:
# nano /etc/systemd/network/tzsp.netdev
[NetDev]
Name=tzsp0
Kind=dummy
- Прописываем настройки сети:
# nano /etc/systemd/network/tzsp.network
[Match]
Name=tzsp*
[Link]
MTUBytes=2000
[Network]
Address=172.16.255.249/29
DHCP=no
- Включаем интерфейс:
# systemctl enable systemd-networkd
# systemctl restart systemd-networkd
Объединяем tzsp2pcap и tcpreplay в TZSPreplay@.service:
# nano /etc/systemd/system/TZSPreplay@.service
[Unit]
Description=TZSP Replay on dev %i
After=network.target network-online.target
Requires=network-online.target
[Service]
Type=simple
ExecStart=/bin/sh -c "/usr/local/bin/tzsp2pcap -f | /usr/local/bin/tcpreplay-edit --topspeed --mtu=$(cat /sys/class/net/%I/mtu) --mtu-trunc -i %I -"
Restart=always
RestartSec=3
ProtectSystem=full
ProtectHome=true
[Install]
WantedBy=multi-user.target
- Включаем и запускаем сервис через интерфейс tzsp0:
# systemctl enable --now TZSPreplay@tzsp0.service
Настройка suricata.yaml:
Изменяем интерфейс для прослушивания.
# nano /etc/suricata/suricata.yaml
af-packet:
- interface: tzsp0
ROS:
В цепочке "prerouting" направляем трафик на ip-адресс Suricata. Мы можем указать любой интерфейс и цепочку, а также создать нужное количество правил с action sniff TZSP.
/ip/firewall/mangle/
add action=sniff-tzsp chain=prerouting comment="TZSP sniffing -> IDPS" sniff-target=172.16.5.90 sniff-target-port=37008
Или в цепочке "forward" для входящего/исходящего трафика с использованием "Address List"
- Создаем Address List:
/ip/firewall/address-list/
add list=idps_fwd address=ip-to-monitoring
- Добавляем правила TSZP Sniff:
/ip/firewall/mangle/
add chain=forward in-interface-list=ISP dst-address-list=idps_fwd action=sniff-tzsp sniff-target=ip-address-suricata sniff-target-port=37008 comment="TZSP sniffing -> IDPS"
add chain=forward out-interface-list=ISP src-address-list=idps_fwd action=sniff-tzsp sniff-target=ip-address-suricata sniff-target-port=37008
- Или с использованием маркировки соединений/пакетов:
add chain=prerouting in-interface-list=ISP protocol=tcp dst-port=443,25,143,587,5222,5281 connection-state=new action=mark-connection new-connection-mark=idps_conn comment="TZSP sniffing -> IDPS"
add chain=prerouting in-interface-list=ISP protocol=udp dst-port=3478 connection-state=new action=mark-connection new-connection-mark=idps_conn
add chain=forward connection-mark=idps_conn action=mark-packet new-packet-mark=idps_pack
add chain=forward packet-mark=idps_pack action=sniff-tzsp sniff-target=ip-address-suricata sniff-target-port=37008
- Блокируем ip-адреса из таблицы idps_alert:
/ip/firewall/raw/
add chain=prerouting src-address-list=idps_alert action=drop comment="Drop IDPS"
На этом все.