Skip to content

Знакомство с системами IDPS на примере Suricata

Теоретические сведения

Это IDPS-система (обнаружения и предотвращения атак), способная выполнять глубокий анализ сетевых пакетов.

  • 📑 Документация на английском языке. Рекомендована к ознакомлению.

  • 🧑‍🔬 Все описанное проверено на Debain 11.7 (Proxmox 8 LXC), Suricata 6.0.1 RELEASE.

Установка

apt update
apt install suricata

Посмотреть версию

suricata -V

Обновление базы правил

Обновление правил. Загружается база данных (несколько файлов) уже кем-то созданных правил

suricata-update

Внимательно ознакомившись с выводом, можно найти путь к файлу suricata.rules (далее может понадобиться, чтобы избавиться от ошибки).

Данных правил может быть достаточно для нетребовательной системы, но при этом могут генерироваться множество событий в лог-файлах.

Проверка конфигурации перед запуском

Проверка файла конфигурации и файлов с правилами на наличие ошибок

suricata -T -c /etc/suricata/suricata.yaml
<Warning> - [ERRCODE: SC_ERR_NO_RULES(42)] - No rule files match the pattern /etc/suricata/rules/suricata.rules

⚠️ Предупреждение. Файл с правилами не найден. Не смотря на то, что это только предупрежение, а не ошибка, от него лучше избавиться.

После внесения изменений в конфигурацию лучше проверять на наличие ошибок.

Запуск

С помощью systemctl можно управлять сервисом suricata.service, например,перезапустить сервис - systemctl restart suricata.service.

Также можно с помощью команды suricata ... запускать с определенными параметрами

  • -D - режим демона
  • -c - путь к файлу .conf
  • q <число> - запуск в режиме IPS (требуется firewall, например, iptables)

Параметры запуска можно изменить в файле /etc/systemd/system/multiuser.target/suricata.service. Предварительно лучше сделать его копию. После изменения требуется systemctl daemon-reload.

Настройка

Расположение файлов

Каталог с конфигурационными файлами - /etc/suricata.

Каталог с правилами - /etc/suricata/rules и /var/lib/suricata/rules.

Основной файл конфигурации - suricata.yaml.

Каталог с логами - /var/log/suricata.

После изменения конфигурации требуется перезапуск сервиса.

Интерфейс для анализа трафика

В /etc/suricata/suricata.yaml необходимо указать название интерфейса, на котором будет анализироваться трафик (посмотреть название интерфейса - ip a)

af-packet:
    - interface: <имя интерфейса>

Адрес внутренней (домашней) сети

Значение переменной HOME_NET в /etc/suricata/suricata.yaml отвечает за адреса в локальной (домашней) сети. Данная переменная отвечает за номера вашей внутренней сети. Сетей может быть несколько. По умолчанию уже есть сети из приватных диапазонов.

address-groups:
    HOME_NET: "[192.168.0.0/16,10.0.0.0/8,172.16.0.0/12]"

Данную переменную можно использовать в правилах.

Файл с правилами

В suricata.yaml перечисляются все пути к файлам с правилами.

Собественные правила рекомендуется создавать в отдельном файле, например, local.rules (или логически разделять на несколько файлов, например, local-web.rules). В конфигурации необходимо указать путь к ним.

default-rule-path: <путь к каталогу с файлами с правилами>

rule-files:
  - <файл с правилами 1>
  - <файл с правилами 2>
  - ...

Правила

Структура и параметры

<действие> <протокол> <src IP> <src port> [->|<>] <dest IP> <dest port> (<ключевое слово>: <значение>; ...)

К некоторым параметрам можно применять:

  • инверсию с помощью символа !
  • группировку с помощью конструкции [<значение 1>, <значение 2>, ...]

что может быть иногда удобно.

Основные действия

  • alert - оповестить
  • pass - закончить анализ трафика (пропустить)
  • drop - отбросить без оповещения и сгенерировать alert
  • reject - отбросить с оповещением
  • есть еще несколько вариантов

Примеры протоколов

  • ip
  • icmp
  • tcp
  • udp
  • dns
  • ssh
  • http
  • есть еще много других вариантов

Направление анализа трафика

Показывает, в каком направлении работает правило

  • -> - однонаправленное (стрелка указывает направление, это важно)
  • <> - двунаправленное

Далее приведены описание некоторых мета-параметров, которые перечисляются в (...) правила. Не все из них являются обязательными.

⚠️ Предупреждение. Для разных протоколов существуют еще дополнительные мета-параметры. См. документацию.

msg

Текстовая информация о сигнатуре и возможном предупреждении.

sid

Уникальный идентификатор сигнатуры. Информация о назначении id здесь.

rev

Номер версии правила. Обычно используется вместе с sid. При его редактировании необходимо увеличивать число.

classtype

Информация о классе правила. Файл, где хранятся классы - classification.config.

Синтаксис

config classification: <короткое название>,<полное название>,<приоритет по умолчанию>

Например,

config classification: web-application-attack,Web Application Attack,1

reference

Указывает на место, где можно найти информацию о сигнатуре и проблеме. Может быть указано несколько раз.

Например,

reference: url, www.example.com
reference: cve, CVE-2024-0001

priority

Приориет, который влияет на порядок применения правил. Обработка начинается с наибольшего значения.

Диапазон значений от 1 до 255. Чаще всего используются от 1 до 4.

metadata

Прочая полезная информация в формате

metadata: <ключ> <значение>, <ключ> <значение>;

Не является служебной для Suricata.

threshold

threshold: type { threshold | limit }, track { by_src | by_dst | by_both }, count <value>, seconds <value>;

См. полный синтаксис в документации.

Примеры

Пример 1

В примере генерируется оповещение о любом "пинге", который приходит к Suricata или отправляется от нее.

alert icmp any any -> any any (msg:"My rule 1"; sid:1000001; rev:1;)

Чтобы проверить срабатывание правила нужно выполнить "пинг" в сторону Suricata или от нее.

При этом в файле /var/log/suricata/fast.log появятся логи с вашим сообщением

tail /var/log/suricata/fast.log

Пример 2

В примере генерируется оповещение при наличии на web-странице строки, указанной в поле content

alert http any any -> any any (msg:"My rule 2"; content:"malicious"; sid:1000002; rev:1;)

Чтобы проверить срабатывание правила нужно выполнить HTTP-запрос с Suricata на любой сайт, который поддерживает HTTP и содержит на странице указанную строку

Например,

curl http://testmynids.org [ > /dev/null ]

Пример 3

В примере генерируется оповещение при обращении к веб-северу по URI, не совпадающему с /uid/index.html

alert http any any -> any any (msg:"My rule 3"; http.uri; content:!"/uid/index.html"; sid:1000001; rev:1;)

Данный вызов не приведет к появлению оповещения

curl http://testmynids.org/uid/index.html

Данные вызовы приведут к появлению оповещения

curl http://testmynids.org/
curl http://testmynids.org/uid/index.html

Пример 4

В примере генерируются оповещения при ICMP-сообщениях раз в минуту, если было зафиксировано минимум 3 инцидента в течение этого времени.

alert icmp any any -> any any (msg:"My rule 1"; threshold: type threshold, track by_src, count 3, seconds 60; sid:1000001; rev:1;)

Дополнительно см. документацию.

Режим IPS

Требуется firewall, например, iptables

apt install iptables

Создать входящее, исходящее или транзитное правило

iptables -I [ INPUT | OUTPUT | FORWARD ] [ -p <protocol> ] [ ... ] -j NFQUEUE [ --queue-num 0 ] [ --queue-bypass ]

💡 Информация. NFQUEUE - это специальный target в iptables, что означает, что решение по сетевым пакетам выполняется с помощью программного обеспечения из пользовательского пространства (в данном случае - Suricata).

-q 0 - опция запуска Suricata в режиме IPS.

--queue-bypass - решение о дальнейшей судьбе пакета принимает iptables, если в Suricata нет подходящего правила.

В режиме IPS имеет смысл использовать правила с действиями drop/reject.

🧰 Лабораторная работа

Ознакомиться перед выполнением любой лабораторной работы (список раскрывается)
  • Вместо ❔ или x нужно подставить свой номер по журналу
  • Выполнять задание без "отмашки" не стоит ⛔, т.к. задание здесь может существовать более актуальная версия
  • У каждой работы есть срок сдачи 📅, который озвучивается на занятии, после которого работа не может быть защищена на максимальный балл 📉
  • Дополнительные задания 📚 не являются обязательными, но по результатам сдачи лабораторной работы может быть выдано одно или несколько из них. Также дополнительное задание может быть сформулировано устно
  • Для каждой лабораторной работы должен быть отчет 📝 с описанием выполнения ваших действий, оформление должно соответствовать требованиям (см. на сайте учебного заведения)
  • Нужно уметь ответить на вопросы ❓ по теме, контрольные вопросы и другие связанные вопросы
  • Примеры могут быть выполнены по желанию, а также выданы в качестве дополнительного задания с изменениями или без в случае неуспешной 😢 защиты основной работы
  • Иногда в работах встречаются задания по IPv4 и IPv6 одновременно 🔗. Это считается как одна работа. Допускается сдача работы только с IPv4 или только с IPv6, но максимальный балл в таком случае получить невозможно

🎯 Цель работы: изучить простую настройку IPDS-системы на примере протоколов ICMP, HTTP, DNS.

✔️ Условия

  1. Одна VM с веб-сервером (apache или nginx) и IDPS (suricata).
  2. Свой веб-сервер со своими страницами index.html, books.html, authors.html. Наполнить страницы простым уникальным контентом.
  3. Клиент и VM (веб-сервер + IDPS) должны находиться в разных сетях.
  4. Правила

    1. IDS должна оповещать о любых ICMP-запросах в сторону вашей VM.
    2. Для оценки выше 3. IDS должна оповещать о любых ICMP-запросах в сторону VM, если их количество 10 или более за 30 секунд.
    3. IDS должна оповещать о HTTP-запросах по URI, которых не существует на вашем сервере.
    4. Для оценки выше 3. IDS должна оповещать о любых HTTP-запросах на ваш веб-сервер, если их количество не менее 5 в минуту.

      💡 Подсказка. Сначала нужно изучить в Wireshark обмен сообщениями, т.к. просто применить правило для HTTP может быть недостаточно.

    5. IDS должна оповещать о любых DNS-запросах c VM, если запрашиваемый домен не заканчивается на .ru или .com.

      💡 Подсказка. Можно использовать регулярное выражение.

    6. Ни о чем другом IDS оповещать не должна.

    7. Каждый тип оповещения должен иметь свой classtype.
    8. Правила должны храниться в файле <your_name>.rules.
    9. Проверить срабатывание правил оповещений.
    10. ✨ Дополнительный балл. С помощью linux-утилиты (найти самостоятельно) протестировать свой web-сервер и IPS-систему на DoS-атаку. Подобрать такой режим и правила IPS, чтобы DoS-атака была пресечена.
    11. ✨ Дополнительный балл. Настроить Suricata в режиме IPS и проверить отбрасывание пакетов.

🤔 Контрольные вопросы

  1. Сколько правил в файле suricata.rules?
  2. Из какого диапазона должны выбираться значения sid для локальных правил?
  3. В чем отличие IPS и IDS режима?
  4. Какие мета-параметры в правиле являются обязательными?
  5. Что будет, если запустить tail -f <лог-файл>?
  6. Какими пакетами обмениваются клиент и сервер при открытии веб-страницы с помощью протокола HTTP?