Установка и настройка системы обнаружения вторжений Snort 3 в Ubuntu 22.04

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.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *