751
0
0
Скопировать ссылку
Telegram
WhatsApp
Vkontakte
Одноклассники
Назад

Обзор Snort для обнаружения вторжений

Время чтения 9 минут
Нет времени читать?
Скопировать ссылку
Telegram
WhatsApp
Vkontakte
Одноклассники
751
0
0
Нет времени читать?
Скопировать ссылку
Telegram
WhatsApp
Vkontakte
Одноклассники

Привет. Это Александр Бархатов — DevSecOps-инженер и специалист по информационной безопасности. В работе я использую множество инструментов, об одном из которых расскажу в этой статье.

Snort — это свободная (бесплатная) система предотвращения вторжений (IPS) с открытым исходным кодом. Ее разработал в далеком 1998 году Мартин Рош — технический директор компании Sourcefire. Сейчас разработкой инструмента занимается компания Cisco, которая в 2013 году поглотила Sourcefire.

Хотя Snort обычно называют облегченной IPS, подразумевая, что программа разработана в первую очередь для маленьких сетей, она обладает богатым функционалом. В этой статье я покажу, как настроить Snort для поиска и анализа подозрительного трафика в вашей сети.

Обзор Snort для обнаружения вторжений

Принцип работы Snort

Для начала рассмотрим архитектуру и алгоритм работы Snort.

Архитектура Snort

Алгоритм работы Snort следующий:

  1. Встроенная в Snort библиотека libpcap перехватывает сетевой пакет, поступающий на устройство.
  2. Декодер преобразовывает полученный пакет в данные.
  3. Препроцессор получает данные от декодера и готовит их к дальнейшей отправке детектору.
  4. Детектор принимает данные от препроцессора и анализирует их, сопоставляя с правилами, в которых описаны необходимые действия для работы с пакетами, и сигнатурами из базы данных.

Также отмечу, что Snort поддерживает работу в трех различных режимах: обнаружение вторжений (IDS), сниффер (перехватывает сетевые пакеты) и регистрация пакетов (перехватывает и записывает пакеты, которые соответствуют заранее заданным критериям).

Среди достоинств Snort можно выделить:

  • Обширную поддержку протоколов и сервисов. Snort выявляет атаки на протоколы TCP, UDP, ICMP, ARP, IGRP, GRE, OSPF, RIP, IPX, SMTP, IMAP, POP3, Telnet, DNS, FTP, работает с сервисами Apache, Nginx, IIS, серверами баз данных — Microsoft SQL Server, Oracle Database и другими.
  • Поддержку более 200 плагинов для расширения работы Snort.
  • Функционал для работы с правилами. Можно использовать готовые правила и писать свои.
  • Кросс-платформенность. Установить и использовать Snort можно на любой ОС — Windows, macOS, Linux/Unix.
  • Открытый исходный код.

Установка Snort

В этой статье мы установим Snort на операционную систему Ubuntu 22.04.03 LTS. Отмечу важный момент: существует два варианта программы — Snort 2 и Snort 3 (ознакомиться с их отличиями можно по ссылке). На момент написания статьи разрабатывается и развивается именно 3-я версия. Однако практически во всех дистрибутивах Linux/Unix в репозиториях находится старая версия, поэтому мы соберем Snort из исходного кода. Все шаги по установке и запуску Snort выполняются от имени root-пользователя.

1. Обновляем индексы репозиториев и устанавливаем пакеты, которые нам пригодятся при сборке из исходного кода:

apt update && apt -y install build-essential libpcap-dev libpcre3-dev libnet1-dev zlib1g-dev luajit hwloc libdnet-dev libdumbnet-dev bison flex liblzma-dev openssl libssl-dev pkg-config libhwloc-dev cmake cpputest libsqlite3-dev uuid-dev libcmocka-dev libnetfilter-queue-dev libmnl-dev autotools-dev libluajit-5.1-dev libunwind-dev libfl-dev

2. Клонируем репозиторий с библиотекой libdaq. Она предназначена для взаимодействия с источниками данных, например с сетевым интерфейсом, и необходима для установки и работы Snort:

git clone https://github.com/snort3/libdaq.git

Переходим в скачанную директорию libdaq и генерируем скрипт с настройками перед выполнением процедуры сборки:

cd libdaq
./bootstrap

3. После генерации приступаем к процессу сборки библиотеки libdaq. Запускаем конфигурацию и подготавливаем исходный код к компиляции:

./configure

Далее запускаем процесс компиляции:

make

И устанавливаем:

make install

4. Переходим непосредственно к сборке Snort из исходного кода.

Клонируем официальный репозиторий snort с исходным кодом программы:

git clone https://github.com/snort3/snort3.git

5. Переходим в скачанную директорию snort3. Экспортируем переменную с именем my_path, в которой указываем полный путь до клонированной директории snort. В данном случае директория snort находится в /root/snort3:

cd snort3/
export my_path=/root/snort3

6. Подготавливаем конфигурацию и указываем префикс с именем ранее созданной переменной (my_path):

./configure_cmake.sh --prefix=$my_path

После завершения работы команды переходим в директорию build и устанавливаем Snort:

cd build
make -j $(nproc) install

Ключ -j, содержащий переменную nproc, означает, что при сборке будет задействовано столько ядер процессора, сколько отображает команда nproc.

Установка занимает в среднем пять минут.

8. После того как установка будет завершена, необходимо обновить общие (разделяемые) библиотеки, чтобы избежать ошибок при запуске Snort. Для этого выполняем команду:

ldconfig

Проверка корректности установки Snort

После установки необходимо убедиться, что Snort корректно запускается.

1. Запустим Snort с опцией help, чтобы вывести справку. Можно воспользоваться ранее созданной переменной, в которой указан путь до директории установки Snort. Также добавим путь до директории bin/snort, в которой находятся исполняемые файлы. Команда будет следующей:

$my_path/bin/snort --help

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

Можно указать полный путь до директории, куда был установлен Snort. Например:

/root/snort3/bin/snort --help

2. Также выведем версию Snort и версии используемых библиотек при помощи команды:

/root/snort3/bin/snort -V

3. Чтобы каждый раз при запуске Snort не прописывать полный путь, добавим псевдоним для исполняемого файла snort. Для этого в домашней директории пользователя открываем на редактирование файл .bashrc при помощи любого текстового редактора. Так как мы установили Snort в домашней директории root-пользователя, файл .bashrc находится в /root/:

nano ~/.bashrc

Добавляем в самый конец файла следующую строку:

alias snort3="/root/snort3/bin/snort"

alias snort3 — это псевдоним, который будет использоваться вместо команды. Вместо snort3 можно задать любое удобное имя.

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

source ~/.bashrc

5. Теперь проверяем запуск Snort без указания полного пути к исполняемому файлу:

snort3 -V

6. Также проверяем работоспособность Snort при помощи стандартной конфигурации. По умолчанию конфигурационный файл находится в директории /etc/snort/snort.lua:

snort3 -c ./etc/snort/snort.lua

Как можно увидеть, конфигурация успешно прошла валидацию, о чем говорит фраза Snort successfully validated the configuration (with 0 warnings).

Далее мы рассмотрим настройку Snort в режиме IDS, а также напишем правило для обнаружения ICMP-трафика.

Настройка Snort в режиме IDS

В рамках этой статьи мы рассмотрим настройку Snort в одном из трех возможных режимов работы, а именно в режиме обнаружения вторжений (IDS).

1. Для начала необходимо перевести сетевой интерфейс в режим promiscuous mode (promisc mode). В нем сетевая карта принимает все сетевые пакеты вне зависимости от того, кому они адресованы. Выводим список всех интерфейсов в системе при помощи команды: 

ip address show

2. В примере имя сетевого интерфейса — ens33. Для него мы и включим режим promisc. Для этого выполняем команду:

ip link set dev ens33 promisc on

3. Проверяем, что режим promisc успешно был включен для интерфейса ens33:

ip address show ens33

В выводе должен появиться параметр PROMISC.

4. Проверяем статус режима Large receive offload. Он снижает нагрузку на центральный процессор и за счет этого увеличивает входящую пропускную способность сетевого интерфейса.

ethtool -k ens33 | grep receive-offload

Режим Large receive включен. Его необходимо отключить, чтобы Snort смог обрабатывать пакеты размером более 1518 байт. Для этого выполняем команду:

ethtool -K ens33 gro off lro off

5. Изменения в конфигурации сетевого интерфейса временные, после перезапуска сервера они сбросятся. Чтобы сделать изменения перманентными, нужно создать файл с именем snort3-nic.service в директории /etc/systemd/system/:

nano /etc/systemd/system/snort3-nic.service

В файле прописываем:

[Unit]
Description=Set Snort 3 NIC in promiscuous mode and Disable GRO, LRO on boot
After=network.target
[Service]
Type=oneshot
ExecStart=/usr/sbin/ip link set dev ens33 promisc on
ExecStart=/usr/sbin/ethtool -K ens33 gro off lro off
TimeoutStartSec=0
RemainAfterExit=yes
[Install]
WantedBy=default.target

Сохраняем изменения и выходим из файла.

6. Перезапускаем конфигурацию systemd, а также добавляем ранее созданный юнит в автозагрузку. Затем проверяем статус созданного сервиса при помощи команды:

systemctl daemon-reload && systemctl enable --now snort3-nic.service
service snort3-nic status

Если в статусе отображается active (exited), сервис успешно запущен.

Далее приступаем непосредственно к настройке Snort. Настроим Snort в режиме IDS, который будет отслеживать весь поступающий на сервер трафик по протоколу ICMP.

1. Создаем директорию, в которой будут храниться файлы с правилами:

mkdir /usr/local/etc/rules

2. Далее создаем файл с именем local.rules в ранее созданной директории rules:

touch /usr/local/etc/rules/local.rules

3. Открываем файл local.rules при помощи любого текстового редактора:

nano /usr/local/etc/rules/local.rules

Прописываем следующее правило:

alert icmp any any -> any any ( msg:"ICMP Traffic Detected"; sid:10000001; metadata:policy security-ips alert; )

В данном правиле мы сообщаем Snort, что надо перехватывать весь трафик, который генерируется при помощи протокола ICMP. Если такой трафик будет найден, его необходимо вывести на экран (stdout), а также добавить сообщение ICMP Traffic Detected.

Сохраняем изменения и выходим из файла.

4. Проверяем созданное правило на правильность синтаксиса и наличие ошибок. Для этого запускаем Snort с двумя опциями: в -c — путь до файла snort.lua, а в опции -R — путь до файла с правилом:

snort3 -c /root/snort3/lua/snort.lua -R /usr/local/etc/rules/local.rules

Как можно увидеть, правило успешно прошло проверку, о чем говорит сообщение Snort successfully validated the configuration (with 0 warnings).

5. Теперь можно запускать Snort в режиме IDS. При этом можно использовать опции, описанные выше ( -c, -R), а также некоторые другие:

  • -i задает сетевой интерфейс, который принимает трафик;
  • -A alert_fast выводит предупреждение о том, что найден тип трафика, указанный в правиле;
  • -s 65535 позволяет Snort принимать и обрабатывать пакеты большого размера (Oversize packet);
  • -k none указывает на игнорирование неправильных контрольных сумм. Без этой опции Snort отбросит пакет с неправильной контрольной суммой. 

Итоговая команда выглядит следующим образом:

snort3 -c /root/snort3/lua/snort.lua -R /usr/local/etc/rules/local.rules -i ens33 -A alert_fast -s 65535 -k none

Как можно увидеть на скриншоте ниже, Snort обнаружил входящий трафик по протоколу ICMP:

Чтобы остановить работу программы, необходимо нажать на сочетание клавиш Ctrl + C. После этого Snort выведет итоговый отчет о проделанной работе: 

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

Комментарии0
Тоже интересно
Комментировать
Поделиться
Скопировать ссылку
Telegram
WhatsApp
Vkontakte
Одноклассники