Snort 3 Intrusion Detecting System auf Ubuntu 22.04 installieren und konfigurieren
Snort ist ein Open Source Intrusion Prevention and Detection System (IDS) zur Abwehr von DDoS-Angriffen. Es verwendet eingebaute Regeln, die dabei helfen, bösartige Netzwerkaktivitäten zu definieren, und nutzt diese Regeln, um Pakete zu finden, die mit ihnen übereinstimmen, und generiert Warnungen für die Benutzer. Snort kann die neuesten Angriffe, Malware-Infektionen, kompromittierte Systeme und Verstöße gegen Netzwerkrichtlinien erkennen.
Funktionen
- Überwachung des Datenverkehrs in Echtzeit.
- Protokollierung von Paketen. Analyse von Protokollen.
- Abgleich von Inhalten. OS-Fingerprinting.
- Es kann in jeder Netzwerkumgebung installiert werden.
- Erzeugt Protokolle.
In diesem Tutorial zeigen wir dir, wie du Snort unter Ubuntu 22.04 installierst.
Voraussetzungen
- Ein Server, auf dem Ubuntu 22.04 läuft.
- Ein Root-Passwort ist auf dem Server konfiguriert.
Erforderliche Abhängigkeiten installieren
Bevor du beginnst, musst du einige Abhängigkeiten auf deinem Server installieren. Du kannst sie alle installieren, indem du den folgenden Befehl ausführst:
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
Sobald alle Abhängigkeiten installiert sind, kannst du mit dem nächsten Schritt fortfahren.
Snort DAQ installieren
Als Nächstes musst du die Datenerfassungsbibliothek auf deinem System installieren. Standardmäßig ist sie nicht im Standard-Repository von Ubuntu verfügbar. Daher musst du sie aus dem Quellcode kompilieren.
Lade zunächst die Snort DAQ mit dem folgenden Befehl von Git herunter:
git clone https://github.com/snort3/libdaq.git
Sobald der Download abgeschlossen ist, navigierst du in das heruntergeladene Verzeichnis und konfigurierst es mit dem folgenden Befehl:
cd libdaq ./bootstrap ./configure
Du solltest die folgende Ausgabe sehen:
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
Als Nächstes installierst du es mit dem folgenden Befehl:
make make install
Gperftools installieren
Lade zunächst die neueste Version von Gperftools mit dem folgenden Befehl herunter:
cd wget https://github.com/gperftools/gperftools/releases/download/gperftools-2.9.1/gperftools-2.9.1.tar.gz
Sobald der Download abgeschlossen ist, entpacke die heruntergeladene Datei mit dem folgenden Befehl:
tar xzf gperftools-2.9.1.tar.gz
Gehe dann in das heruntergeladene Verzeichnis und kompiliere sie mit dem folgenden Befehl:
cd gperftools-2.9.1/ ./configure
Installiere sie mit dem folgenden Befehl:
make make install
Snort installieren
Als Nächstes lädst du die neueste Version von Snort mit dem folgenden Befehl herunter:
cd wget https://github.com/snort3/snort3/archive/refs/tags/3.1.43.0.tar.gz
Entpacke die heruntergeladene Datei mit folgendem Befehl:
tar -xvzf 3.1.43.0.tar.gz
Navigiere in das entpackte Verzeichnis und konfiguriere es mit dem folgenden Befehl:
cd snort3-3.1.43.0 ./configure_cmake.sh --prefix=/usr/local --enable-tcmalloc
Du erhältst die folgende Ausgabe:
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
Wechsle dann in das Build-Verzeichnis und installiere Snort mit dem folgenden Befehl:
cd build make make install ldconfig
Jetzt kannst du die Snort-Version mit folgendem Befehl überprüfen:
snort -V
Du erhältst die folgende Ausgabe:
,,_ -*> Snort++ <*- o" )~ Version 3.1.43.0 '''' By Martin Roesch & The Snort Team http://snort.org/contact#team Copyright (C) 2014-2022 Cisco and/or its affiliates. All rights reserved. Copyright (C) 1998-2013 Sourcefire, Inc., et al. Using DAQ version 3.0.9 Using LuaJIT version 2.1.0-beta3 Using OpenSSL 3.0.2 15 Mar 2022 Using libpcap version 1.10.1 (with TPACKET_V3) Using PCRE version 8.39 2016-06-14 Using ZLIB version 1.2.11 Using LZMA version 5.2.5
Snort konfigurieren
Als Erstes musst du deine Netzwerkschnittstelle auf den Promiscuous-Modus einstellen, damit sie den gesamten Netzwerkverkehr sehen kann, der an sie gesendet wird.
Dies kannst du mit dem folgenden Befehl einstellen:
ip link set dev eth0 promisc on
Du kannst ihn mit dem folgenden Befehl überprüfen:
ip add sh eth0
Als Nächstes musst du auch das Interface Offloading deaktivieren. Überprüfe zunächst mit dem folgenden Befehl, ob diese Funktion aktiviert ist oder nicht:
ethtool -k eth0 | grep receive-offload
Du erhältst die folgende Ausgabe:
generic-receive-offload: on large-receive-offload: off [fixed]
Du kannst sie nun mit dem folgenden Befehl deaktivieren:
ethtool -K eth0 gro off lro off
Erstelle eine Systemd-Dienstdatei für Snort NIC
Als Nächstes musst du eine systemd-Dienstdatei für Snort NIC erstellen.
nano /etc/systemd/system/snort3-nic.service
Füge die folgenden Zeilen hinzu:
[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
Speichere und schließe die Datei und lade dann den systemd-Daemon neu, um die Änderungen zu übernehmen:
systemctl daemon-reload
Starte und aktiviere Snort mit dem folgenden Befehl:
systemctl start snort3-nic.service systemctl enable snort3-nic.service
Du kannst den Status von Snort mit dem folgenden Befehl überprüfen:
systemctl status snort3-nic.service
Du erhältst die folgende Ausgabe:
? 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-Regeln installieren
Regeln sind sehr wichtig für Snorts Intrusion Detection Engine. Erstelle zunächst ein Verzeichnis, in dem alle Regeln gespeichert werden:
mkdir /usr/local/etc/rules
Als Nächstes lädst du die Community-Regeln mit dem folgenden Befehl herunter:
wget -qO- https://www.snort.org/downloads/community/snort3-community-rules.tar.gz | tar xz -C /usr/local/etc/rules/
Als Nächstes bearbeitest du die Hauptkonfigurationsdatei von Snort:
nano /usr/local/etc/snort/snort.lua
Definiere dein Netzwerk wie unten gezeigt:
HOME_NET = '192.168.56.124/32' EXTERNAL_NET = '!$HOME_NET'
Als Nächstes legst du den Pfad für deine Snort-Regeln fest:
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 ]] }
Speichere und schließe die Datei, wenn du fertig bist.
Installiere Snort OpenAppID
OpenAppID ist ein Plugin, mit dem Snort verschiedene Anwendungen wie Facebook, Netflix, Twitter und Reddit, die im Netzwerk verwendet werden, erkennen kann.
Du kannst es mit dem folgenden Befehl herunterladen:
wget https://www.snort.org/downloads/openappid/26425 -O OpenAppId-26425.tgz
Sobald der Download abgeschlossen ist, extrahiere die heruntergeladene Datei mit dem folgenden Befehl:
tar -xzvf OpenAppId-26425.tgz
Als Nächstes kopierst du die OpenAppID-Binärdatei in das Systemverzeichnis:
cp -R odp /usr/local/lib/
Als Nächstes bearbeitest du die Snort-Konfigurationsdatei und definierst deinen OpenAppID-Speicherort:
nano /usr/local/etc/snort/snort.lua
Ändere die folgenden Zeilen:
appid = { app_detector_dir = '/usr/local/lib', log_stats = true, }
Speichere und schließe die Datei und erstelle dann ein Snort-Protokollverzeichnis:
mkdir /var/log/snort
Überprüfe abschließend die Snort-Konfigurationsdatei mit dem folgenden Befehl:
snort -c /usr/local/etc/snort/snort.lua
Wenn alles in Ordnung ist, erhältst du die folgende Ausgabe:
-------------------------------------------------- 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
Benutzerdefinierte Snort-Regeln erstellen
Du kannst auch deine eigenen Regeln nach deinen Bedürfnissen erstellen. Lass uns eine benutzerdefinierte Regel für eingehende ICMP-Anfragen erstellen:
nano /usr/local/etc/rules/local.rules
Füge die folgende Zeile ein:
alert icmp any any -> $HOME_NET any (msg:"ICMP connection test"; sid:1000001; rev:1;)
Als Nächstes überprüfst du die Regeln mit dem folgenden Befehl:
snort -c /usr/local/etc/snort/snort.lua -R /usr/local/etc/rules/local.rules
Du erhältst die folgende Ausgabe:
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
Als Nächstes führst du den folgenden Befehl aus, um Snort auf deiner Netzwerkschnittstelle mit deinen benutzerdefinierten Regeln zu starten:
snort -c /usr/local/etc/snort/snort.lua -R /usr/local/etc/rules/local.rules -i eth0 -A alert_fast -s 65535 -k none
Öffne als Nächstes eine andere Terminalschnittstelle und pinge deinen Server an. Du solltest den ICMP-Fehler auf dem ersten Terminal sehen:
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
Erstelle eine Systemd-Dienstdatei für Snort
Als Nächstes erstellst du eine systemd-Dienstdatei, um den Snort über systemd zu verwalten.
nano /etc/systemd/system/snort3.service
Füge die folgenden Konfigurationen hinzu:
[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
Speichere und schließe die Datei und lade dann den systemd-Daemon mit dem folgenden Befehl neu:
systemctl daemon-reload
Starte und aktiviere den Snort-Dienst mit dem folgenden Befehl:
systemctl enable --now snort3
Jetzt kannst du den Status von Snort mit folgendem Befehl überprüfen:
systemctl status snort3
Du erhältst die folgende Ausgabe:
? 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
Schlussfolgerung
Glückwunsch! Du hast Snort 3 unter Ubuntu 22.04 erfolgreich installiert und konfiguriert. Jetzt kannst du Snort in deinem Unternehmen einsetzen und es vor DDoS-Angriffen schützen. Wenn du noch Fragen hast, kannst du dich gerne an mich wenden.