Snort — это система обнаружения и предотвращения вторжений (IDS) с открытым исходным кодом, предназначенная для защиты от DDoS-атак. Она использует встроенные правила, которые помогают определять вредоносную сетевую активность, и использует эти правила для поиска пакетов, которые им соответствуют, и генерации предупреждений для пользователей. Snort может идентифицировать новейшие атаки, заражения вредоносным ПО, скомпрометированные системы и нарушения сетевой политики.
Особенности
- Мониторинг трафика в реальном времени.
- Регистрация пакетов. Анализ протокола.
- Сопоставление контента. Отпечатки ОС.
- Может быть установлен в любой сетевой среде.
- Создает журналы.
В этом руководстве мы покажем вам, как установить Snort на Ubuntu 22.04.
Необходимые условия
- Сервер под управлением Ubuntu 22.04.
- На сервере настроен пароль root.
Установите необходимые зависимости
Перед началом вам необходимо установить некоторые зависимости на вашем сервере. Вы можете установить их все, выполнив следующую команду:
apt 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 -y
После установки всех зависимостей можно переходить к следующему шагу.
Установка Snort DAQ
Затем необходимо установить библиотеку Data Acquisition в вашей системе. По умолчанию она недоступна в стандартном репозитории Ubuntu. Поэтому вам нужно будет скомпилировать ее из исходного кода.
Сначала загрузите Snort DAQ из Git с помощью следующей команды:
git clone https://github.com/snort3/libdaq.git
После завершения загрузки перейдите в папку с загруженными файлами и настройте ее с помощью следующей команды:
cd libdaq ./bootstrap ./configure
Вы должны увидеть следующий результат:
cc: gcc
cppflags:
am_cppflags: -fvisibility=hidden -Wall -Wmissing-declarations -Wpointer-arith -Wcast-align -Wcast-qual -Wformat -Wformat-nonliteral -Wformat-security -Wundef -Wwrite-strings -Wextra -Wsign-compare -Wno-unused-parameter -fno-strict-aliasing -fdiagnostics-show-option
cflags: -g -O2
am_cflags: -Wstrict-prototypes -Wmissing-prototypes -Wold-style-definition -Wnested-externs
ldflags:
am_ldflags:
libs:
code_coverage_enabled: no
code_coverage_cppflags:
code_coverage_cflags:
code_coverage_ldflags:
Build AFPacket DAQ module.. : yes
Build BPF DAQ module....... : yes
Build Divert DAQ module.... : no
Build Dump DAQ module...... : yes
Build FST DAQ module....... : yes
Build netmap DAQ module.... : no
Build NFQ DAQ module....... : yes
Build PCAP DAQ module...... : yes
Build Savefile DAQ module.. : yes
Build Trace DAQ module..... : yes
Build GWLB DAQ module...... : yes
Затем установите его с помощью следующей команды:
make make install
Сначала загрузите последнюю версию Gperftools с помощью следующей команды:
cd wget https://github.com/gperftools/gperftools/releases/download/gperftools-2.9.1/gperftools-2.9.1.tar.gz
После завершения загрузки извлеките загруженный файл с помощью следующей команды:
tar xzf gperftools-2.9.1.tar.gz
Затем перейдите в папку с загруженным файлом и скомпилируйте его с помощью следующей команды:
cd gperftools-2.9.1/ ./configure
Затем установите его с помощью следующей команды:
make make install
Установите Snort
Затем загрузите последнюю версию Snort с помощью следующей команды:
cd wget https://github.com/snort3/snort3/archive/refs/tags/3.1.43.0.tar.gz
Затем извлеките загруженный файл с помощью следующей команды:
tar -xvzf 3.1.43.0.tar.gz
Затем перейдите в извлеченный каталог и настройте его с помощью следующей команды:
cd snort3-3.1.43.0 ./configure_cmake.sh --prefix=/usr/local --enable-tcmalloc
Вы получите следующий результат:
snort version 3.1.43.0
Install options:
prefix: /usr/local
includes: /usr/local/include/snort
plugins: /usr/local/lib/snort
Compiler options:
CC: /usr/bin/cc
CXX: /usr/bin/c++
CFLAGS: -fvisibility=hidden -DNDEBUG -g -ggdb -fno-builtin-malloc -fno-builtin-calloc -fno-builtin-realloc -fno-builtin-free -O2 -g -DNDEBUG
CXXFLAGS: -fvisibility=hidden -DNDEBUG -g -ggdb -fno-builtin-malloc -fno-builtin-calloc -fno-builtin-realloc -fno-builtin-free -O2 -g -DNDEBUG
EXE_LDFLAGS:
MODULE_LDFLAGS:
Feature options:
DAQ Modules: Static (afpacket;bpf;dump;fst;gwlb;nfq;pcap;savefile;trace)
libatomic: System-provided
Hyperscan: OFF
ICONV: ON
Libunwind: ON
LZMA: ON
RPC DB: Built-in
SafeC: OFF
TCMalloc: ON
JEMalloc: OFF
UUID: ON
-------------------------------------------------------
-- Configuring done
-- Generating done
-- Build files have been written to: /root/snort3-3.1.43.0/build
Затем перейдите в каталог сборки и установите Snort с помощью следующей команды:
cd build make make install ldconfig
Теперь вы можете проверить версию Snort с помощью следующей команды:
snort -V
Вы получите следующий результат:
,,_ -*> Snort++
Configure Snort
First, you will need to set your network interface on promiscuous mode so that it can be able to see all of the network traffic sent to it.
You can set it using the following command:
ip link set dev eth0 promisc on
Теперь вы можете проверить это с помощью следующей команды:
ip add sh eth0
Далее вам также необходимо отключить разгрузку интерфейса. Сначала проверьте, включена ли эта функция, с помощью следующей команды:
ethtool -k eth0 | grep receive-offload
Вы получите следующий результат:
generic-receive-offload: on large-receive-offload: off [fixed]
Теперь вы можете отключить ее с помощью следующей команды:
ethtool -K eth0 gro off lro off
Создайте файл службы Systemd для Snort NIC
Затем вам нужно будет создать файл службы systemd для Snort NIC.
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 eth0 promisc on ExecStart=/usr/sbin/ethtool -K eth0 gro off lro off TimeoutStartSec=0 RemainAfterExit=yes [Install] WantedBy=default.target
Сохраните и закройте файл, затем перезагрузите демон systemd, чтобы применить изменения:
systemctl daemon-reload
Затем запустите и включите Snort с помощью следующей команды:
systemctl start snort3-nic.service systemctl enable snort3-nic.service
Вы можете проверить состояние Snort с помощью следующей команды:
systemctl status snort3-nic.service
Вы получите следующий вывод:
? snort3-nic.service - Set Snort 3 NIC in promiscuous mode and Disable GRO, LRO on boot
Loaded: loaded (/etc/systemd/system/snort3-nic.service; disabled; vendor preset: enabled)
Active: active (exited) since Tue 2022-10-11 16:24:15 UTC; 6s ago
Process: 95745 ExecStart=/usr/sbin/ip link set dev eth0 promisc on (code=exited, status=0/SUCCESS)
Process: 95746 ExecStart=/usr/sbin/ethtool -K eth0 gro off lro off (code=exited, status=0/SUCCESS)
Main PID: 95746 (code=exited, status=0/SUCCESS)
CPU: 11ms
Oct 11 16:24:15 ubuntu2204 systemd[1]: Starting Set Snort 3 NIC in promiscuous mode and Disable GRO, LRO on boot...
Oct 11 16:24:15 ubuntu2204 systemd[1]: Finished Set Snort 3 NIC in promiscuous mode and Disable GRO, LRO on boot.
Установите правила Snort
Правила очень важны для механизма обнаружения вторжений Snort. Сначала создайте каталог для хранения всех правил:
mkdir /usr/local/etc/rules
Затем загрузите правила сообщества с помощью следующей команды:
wget -qO- https://www.snort.org/downloads/community/snort3-community-rules.tar.gz | tar xz -C /usr/local/etc/rules/
Затем отредактируйте главный файл конфигурации Snort:
nano /usr/local/etc/snort/snort.lua
Определите свою сеть, как показано ниже:
HOME_NET = '192.168.56.124/32' EXTERNAL_NET = '!$HOME_NET'
Затем определите путь к правилам Snort:
ips =
{
-- use this to enable decoder and inspector alerts
--enable_builtin_rules = true,
-- use include for rules files; be sure to set your path
-- note that rules files can include other rules files
-- (see also related path vars at the top of snort_defaults.lua)
variables = default_variables,
rules = [[
include /usr/local/etc/rules/snort3-community-rules/snort3-community.rules
]]
}
Сохраните и закройте файл, когда закончите.
Установите Snort OpenAppID
OpenAppID — это плагин, который позволяет Snort обнаруживать различные приложения, используемые в сети, такие как Facebook, Netflix, Twitter и Reddit.
Вы можете загрузить его с помощью следующей команды:
wget https://www.snort.org/downloads/openappid/26425 -O OpenAppId-26425.tgz
После завершения загрузки извлеките загруженный файл с помощью следующей команды:
tar -xzvf OpenAppId-26425.tgz
Затем скопируйте двоичный файл OpenAppID в системный каталог:
cp -R odp /usr/local/lib/
Затем отредактируйте файл конфигурации Snort и определите расположение OpenAppID:
nano /usr/local/etc/snort/snort.lua
Измените следующие строки:
appid =
{
app_detector_dir = '/usr/local/lib',
log_stats = true,
}
Сохраните и закройте файл, затем создайте каталог журналов Snort:
mkdir /var/log/snort
Наконец, проверьте файл конфигурации Snort с помощью следующей команды:
snort -c /usr/local/etc/snort/snort.lua
Если все в порядке, вы получите следующий результат:
--------------------------------------------------
fast pattern groups
src: 59
dst: 158
any: 4
to_server: 56
to_client: 39
--------------------------------------------------
search engine
instances: 316
patterns: 10282
pattern chars: 166369
num states: 112212
num match states: 9885
memory scale: MB
total memory: 3.42574
pattern memory: 0.550588
match list memory: 1.25256
transition memory: 1.58402
fast pattern only: 6822
--------------------------------------------------
pcap DAQ configured to passive.
Snort successfully validated the configuration (with 0 warnings).
o")~ Snort exiting
Создайте пользовательские правила Snort
Вы также можете создать свои собственные пользовательские правила в соответствии с вашими требованиями. Давайте создадим пользовательские правила для входящих запросов ICMP:
nano /usr/local/etc/rules/local.rules
Добавьте следующую строку:
alert icmp any any -> $HOME_NET any (msg:"ICMP connection test"; sid:1000001; rev:1;)
Затем проверьте правила с помощью следующей команды:
snort -c /usr/local/etc/snort/snort.lua -R /usr/local/etc/rules/local.rules
Вы получите следующий результат:
search engine
instances: 316
patterns: 10282
pattern chars: 166369
num states: 112212
num match states: 9885
memory scale: MB
total memory: 3.42574
pattern memory: 0.550588
match list memory: 1.25256
transition memory: 1.58402
fast pattern only: 6822
--------------------------------------------------
pcap DAQ configured to passive.
Snort successfully validated the configuration (with 0 warnings).
o")~ Snort exiting
Затем выполните следующую команду, чтобы запустить Snort на вашем сетевом интерфейсе с использованием ваших пользовательских правил:
snort -c /usr/local/etc/snort/snort.lua -R /usr/local/etc/rules/local.rules -i eth0 -A alert_fast -s 65535 -k none
Затем откройте другой терминальный интерфейс и выполните ping вашего сервера. Вы должны увидеть ошибку ICMP на первом терминале:
10/11-16:45:23.848071 [**] [1:1000001:1] "ICMP connection test" [**] [Priority: 0] [AppID: ICMP] {ICMP} 157.32.34.228 -> 209.23.11.18
10/11-16:45:23.848071 [**] [1:384:8] "PROTOCOL-ICMP PING" [**] [Classification: Misc activity] [Priority: 3] [AppID: ICMP] {ICMP} 157.32.34.228 -> 209.23.11.18
10/11-16:45:24.323038 [**] [1:366:11] "PROTOCOL-ICMP PING Unix" [**] [Classification: Misc activity] [Priority: 3] [AppID: ICMP] {ICMP} 157.32.34.228 -> 209.23.11.18
10/11-16:45:24.323038 [**] [1:1000001:1] "ICMP connection test" [**] [Priority: 0] [AppID: ICMP] {ICMP} 157.32.34.228 -> 209.23.11.18
10/11-16:45:24.323038 [**] [1:384:8] "PROTOCOL-ICMP PING" [**] [Classification: Misc activity] [Priority: 3] [AppID: ICMP] {ICMP} 157.32.34.228 -> 209.23.11.18
^C** caught int signal
== stopping
10/11-16:45:25.353007 [**] [1:366:11] "PROTOCOL-ICMP PING Unix" [**] [Classification: Misc activity] [Priority: 3] [AppID: ICMP] {ICMP} 157.32.34.228 -> 209.23.11.18
10/11-16:45:25.353007 [**] [1:1000001:1] "ICMP connection test" [**] [Priority: 0] [AppID: ICMP] {ICMP} 157.32.34.228 -> 209.23.11.18
10/11-16:45:25.353007 [**] [1:384:8] "PROTOCOL-ICMP PING" [**] [Classification: Misc activity] [Priority: 3] [AppID: ICMP] {ICMP} 157.32.34.228 -> 209.23.11.18
Создайте файл службы Systemd для Snort
Затем создайте файл службы systemd для управления Snort через systemd.
nano /etc/systemd/system/snort3.service
Добавьте следующие конфигурации:
[Unit] Description=Snort Daemon After=syslog.target network.target [Service] Type=simple ExecStart=/usr/local/bin/snort -c /usr/local/etc/snort/snort.lua -s 65535 -k none -l /var/log/snort -D -i eth0 -m 0x1b -u root -g root ExecStop=/bin/kill -9 $MAINPID [Install] WantedBy=multi-user.target
Сохраните и закройте файл, затем перезагрузите демон systemd с помощью следующей команды:
systemctl daemon-reload
Затем запустите и включите службу Snort с помощью следующей команды:
systemctl enable --now snort3
Теперь вы можете проверить статус Snort с помощью следующей команды:
systemctl status snort3
Вы получите следующий результат:
? snort3.service - Snort Daemon
Loaded: loaded (/etc/systemd/system/snort3.service; enabled; vendor preset: enabled)
Active: active (running) since Tue 2022-10-11 16:48:28 UTC; 17s ago
Main PID: 95898 (snort)
Tasks: 2 (limit: 4579)
Memory: 233.6M
CPU: 2.007s
CGroup: /system.slice/snort3.service
??95898 /usr/local/bin/snort -c /usr/local/etc/snort/snort.lua -s 65535 -k none -l /var/log/snort -D -i eth0 -m 0x1b -u root -g >
Oct 11 16:48:29 ubuntu2204 snort[95898]: num match states: 9885
Oct 11 16:48:29 ubuntu2204 snort[95898]: memory scale: MB
Oct 11 16:48:29 ubuntu2204 snort[95898]: total memory: 3.42574
Oct 11 16:48:29 ubuntu2204 snort[95898]: pattern memory: 0.550588
Oct 11 16:48:29 ubuntu2204 snort[95898]: match list memory: 1.25256
Oct 11 16:48:29 ubuntu2204 snort[95898]: transition memory: 1.58402
Oct 11 16:48:29 ubuntu2204 snort[95898]: fast pattern only: 6822
Oct 11 16:48:29 ubuntu2204 snort[95898]: --------------------------------------------------
Oct 11 16:48:29 ubuntu2204 snort[95898]: pcap DAQ configured to passive.
Oct 11 16:48:29 ubuntu2204 snort[95898]: Commencing packet processing
Заключение
Поздравляем! Вы успешно установили и настроили Snort 3 в Ubuntu 22.04.