Erhöhen Sie IDS / NMS: Mikrotik und Suricata mit einem Webinterface

Anscheinend habe ich ein solches Karma: Egal, wie ich die Implementierung eines Dienstes auf Open Source durchführe, ich werde auf jeden Fall eine Reihe von Handbüchern finden, von denen jedes für sich in meinem speziellen Fall nicht funktioniert, die vorgefertigte Lösung nicht startet oder gefällt, was sonst noch passiert -Niemals Verdaulichkeit, und am Ende muss man selbst zum Ergebnis durchbrechen.

Dieses Mal waren alle Handbücher auf ELK5 oder älter, aber ich wollte die Software der vorherigen Versionen nicht wirklich installieren. Ich wollte die Software mit den vielversprechendsten Support-Perioden nehmen: vorzugsweise die neueste aus dem Stall.

Um die perfekte Leistung wiederholen zu können, ohne in Zukunft alle Qualen zu wiederholen, müssen Sie daher Schritt-für-Schritt-Spickzettel schreiben, die ich mit Ihnen teile.

Also heute Mikrotik (RouterOS), Suricata 4.1, Elasticsearch + Filebeat + Kibana 6.5.

Anstatt mitzumachen


Bedingungen:

  • Mikrotik auf i386 in einer virtuellen Maschine auf Host A. Alle Schnittstellen auf Mikrotik sind über VLANs verteilt, der Host verfügt über eine physische Netzwerkschnittstelle.
  • Kostenlose Ressourcen für IDS / IPS / NMS auf Host B mit einer einzigen physischen Netzwerkschnittstelle.
  • 20-Megabyte-Kanal aus.
  • Der Wunsch, Analysen über den Datenverkehr zu erhalten, der über die externe Schnittstelle des Mikrotik geleitet wird.
  • Das Budget in den Meerrettich Rubel und FIG Kopeken.
  • Eine gewisse Menge an Freizeit von Ärger.

Ich werde hier nicht darüber sprechen, was IDS / IPS / NMS ist, warum es benötigt wird und was es passiert. Jeder weiß das ohne mich, und wer es nicht weiß, wird googeln.

Ich werde auch meine Wahl zwischen Snort und Suricata nicht für letztere rechtfertigen. Das ist Geschmackssache.

Aber erklären Sie oberflächlich, wie es funktioniert:

Suricata erhält irgendwie Verkehr. Es gibt drei Möglichkeiten: a) Weiterleiten im Inline-Modus, b) Empfangen einer Kopie des Datenverkehrs vom Switch-Port und c) Analysieren von Speicherauszügen mit Datenverkehr. Suricata analysiert den empfangenen Verkehr und liefert basierend auf der Analyse Daten darüber, was dort in diesem Verkehr gefunden wurde.

Suricata kann Daten in JSON ausgeben. Dementsprechend können strukturierte Daten einem System zur Verarbeitung, Systematisierung, Analyse und Visualisierung zugeführt werden.
Für die Analyse und Visualisierung von Daten ist der ELK-Stack meines Wissens perfekt, ohne auf diesem Gebiet spezialisiert zu sein. Der ELK-Stack bestand ursprünglich aus Elasticsearch, Logstash, Kibana. Jetzt wurde Beat hinzugefügt (eine Familie von Schnittstellenprogrammen, die als Vermittler zwischen der Datenquelle und Logstash oder Elasticsearch fungieren). Mit Blick auf die Zukunft werde ich sagen, dass es keinen Logstash gab, da Beat Daten perfekt direkt an Elasticsearch weiterleitet und Elasticsearch sie perfekt isst. Elasticsearch überträgt die gebissenen Daten an Kibana, das Webinterface für den gesamten ELK-Stack. Kibana verwendet die von Filebeat an ihn übergebenen Vorlagen und bietet dem Benutzer eine Datenvisualisierung, die sogenannten Dashboards. In Anbetracht der Tatsache, dass Elasticsearch, Logstash, Beat und Kibana die Früchte der Arbeit eines Herstellers sind, ist diese gesamte Farm gut miteinander verbunden und der Verknüpfungsprozess ist gut dokumentiert (natürlich nach Open-Source-Standards).

Auf der Grundlage des Vorstehenden kann die Aufgabe daher wie folgt beschrieben werden: Eine Kopie des Datenverkehrs vom Router-Port abrufen, an Suricata übertragen, Daten im JSON-Format von Suricata empfangen, an Filebeat übertragen, so dass sie wiederum an Elasticsearch und übertragen werden half Kibana bei der Erstellung ihrer visuellen Darstellung.

Mikrotik RouterOS


Wenn ich eine Mikrotik-Router-Hardware hätte, wäre das Problem der Portspiegelung (Portspiegelung) überhaupt nicht. Alles würde entschieden, indem die Spiegelung des Datenverkehrs über die externe Schnittstelle zu einem beliebigen freien Port von Mikrotik selbst ermöglicht wird. Wenn auf Mikrotik kein freier Port vorhanden ist, können Sie die Portspiegelung auf dem Switch aktivieren. In meinem Fall hatte Mikrotik jedoch überhaupt keine physischen Ports, und der Port auf dem Switch empfing Datenverkehr vom gesamten Host, auf dem sich neben Mikrotik mehrere weitere virtuelle Maschinen befanden.

Und dann sagte ich noch einmal mental: „Danke, Mikrotik!“. Vielen Dank für den in RouterOS integrierten Sniffer. Traditionell verzichten wir auf Screenshots, nur auf Konsolenbefehle.

Öffnen Sie das Terminal in WinBox und schalten Sie den Sniffer ein:

/tool sniffer set filter-interface=if-out filter-stream=yes streaming-enabled=yes streaming-server=192.168.1.253
/tool sniffer start


Geben Sie anstelle von if-out den Namen der Schnittstelle an, von der aus Sie den Datenverkehr abfangen möchten , und anstelle von 192.168.1.253 die IP-Adresse des Computers, an den abgefangener Datenverkehr über das TZSP- Protokoll gesendet wird .

Mit Mikrotik'om allen.

Suricata


Im Allgemeinen bin ich nicht sehr Linux-orientiert, daher mag ich vor allem Pop-Distributionen. Na ja, vielleicht mag ich den asketischeren Debian. Also habe ich damit angefangen. Nun, und natürlich wollte ich aufgrund von Nicht-Linux-Headness auch Binärdateien aus dem Repository installieren. Die Montage ist für mich immer faul. Also, wenn es möglich sein wird, Debian zu wählen, - wählen Sie nicht . Ich kann mich jetzt nicht erinnern, an welchem ​​Ort ich die ganze Farm unter Debian installiert habe, aber er war es. Und die ganze nachfolgende Geschichte über die Installation von allem unter Ubunta.

Eine virtuelle 4-Kern-Maschine mit 4 GB RAM wurde erstellt, Ubuntu Server 18.04.1 LTS (x64) wurde heruntergeladen und darauf installiert

Vereinbarung : Alle weiteren Aktionen werden im Auftrag des Superusers ausgeführt. Melden Sie sich also entweder als root an oder fügen Sie jedem Befehl sudo hinzu .

Da ich in jeder Phase Schnappschüsse gemacht und dann wiederholt darauf zurückgegriffen habe, habe ich am Ende viele Störungen mit einer nicht synchronen Zeit in einer virtuellen Maschine in Echtzeit festgestellt.
Daher stellen wir sofort die richtige Zeitzone und NTP-Synchronisation ein:

systemctl start systemd-timesyncd
systemctl status systemd-timesyncd
dpkg-reconfigure tzdata


Fügen Sie die Universums- Repositorys zu /etc/apt/sources.list hinzu, um sicherzustellen, dass bei der Installation von Suricata keine Abhängigkeitsprobleme auftreten :

nano /etc/apt/sources.list
...
deb archive.ubuntu.com/ubuntu bionisches Hauptuniversum
deb archive.ubuntu.com/ubuntu bionic-security Hauptuniversum
deb archive.ubuntu.com/ubuntu bionic-updates Hauptuniversum

Wir fügen auch das Repository hinzu, in dem wir Suricata erhalten:
add-apt-repository ppa:oisf/suricata-stable

Aktualisieren der Paketdatenbank:
apt-get update

Suricata installieren:
apt-get install -y suricata

Der nächste Schritt besteht darin, die Regeln für Suricata und deren Aktualisierung festzulegen:
apt-get install -y python-pip
pip install pyyaml
pip install https://github.com/OISF/suricata-update/archive/master.zip


Wir starten das Update von suricata-update selbst :
pip install --pre --upgrade suricata-update

Wenn wir ohne zusätzliche Konfiguration ausgeführt werden, erhalten wir den Regelsatz "Emerging Threats Open":
suricata-update

Gehen Sie wie folgt vor, um die Liste der Quellen anzuzeigen:
suricata-update list-sources

Aktualisieren von Regelquellen:
suricata-update update-sources

Mal sehen, was dort in den Quellen aktualisiert wurde, wieder ausführen:
suricata-update list-sources

Wir enthalten alle kostenlosen Quellen:
suricata-update enable-source ptresearch/attackdetection
suricata-update enable-source oisf/trafficid
suricata-update enable-source sslbl/ssl-fp-blacklist


Und wieder aktualisieren wir die Regeln:
suricata-update

Suricata ist installiert.

Jetzt müssen Sie Verkehr bekommen.

Trafr


Trafr ist eine von Mikrotik geschriebene Anwendung zur Konvertierung von TZSP-Verkehr in pcap. Die Anwendung ist 32-Bit. Um sie zu starten, müssen Sie die Unterstützung für 32-Bit-Anwendungen in 64-Bit-Ubunta aktivieren:

dpkg --add-architecture i386
apt-get update && apt-get install -y libc6:i386


Trafr herunterladen und entpacken:

wget http://www.mikrotik.com/download/trafr.tgz
tar xzf trafr.tgz


Überprüfen Sie, ob der Verkehr abgefangen wird:

./trafr -s

Nach einem solchen Start brach die symbolische Ausgabe im Grafikmodus in der Konsole der virtuellen Maschine, ich musste neu starten. Es gab keine Probleme bei der Remoteverbindung über ssh mit PuTTY.

Wenn Sie ein unregelmäßiges Flackern auf dem Bildschirm sehen, kommt der Verkehr an und trafr fängt ihn auf. Wenn ja, übertragen Sie trafr in einen ständigen Wohnsitz und leiten Sie ihn mit der Übertragung des gefangenen Verkehrs durch die Pipeline sofort nach Suricata:

mv trafr /usr/local/bin/
/usr/local/bin/trafr -s | suricata -c /etc/suricata/suricata.yaml -r /dev/stdin


Jetzt überprüfen wir, ob der Verkehr in Suricata ankommt. Dazu machen wir im benachbarten Terminal Folgendes:

tail -f /var/log/suricata/fast.log

Sie sollten eine intelligente Schriftrolle eines aussagekräftigen Textes sehen - ein Protokoll über den Empfang von Erdmännchenverkehr.

Es wird auch nicht schaden, sicherzustellen, dass der Suricata-Verkehr nicht nur empfängt, sondern auch analysiert:

tail -f /var/log/suricata/eve.json

Dies ist genau die Ausgabe von Ereignissen aus Suricata im JSON-Format, die wir an Filebeat weiterleiten.

Elasticsearch + Filebeat + Kibana 6.5


Wir installieren den PGP-Schlüssel, der zur Verwendung des Elastic-Repositorys erforderlich ist, und installieren die erforderlichen Abhängigkeiten:

wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
echo "deb https://artifacts.elastic.co/packages/6.x/apt stable main" | sudo tee -a /etc/apt/sources.list.d/elastic-6.x.list
apt-get update && apt-get install -y openjdk-8-jre apt-transport-https wget nginx


Bitte beachten Sie, dass Java Version 8 ist. Alles über 8 wird nicht unterstützt. Wenn Sie es früher geschafft haben, ein neueres Java zu installieren, brechen Sie es ab und setzen Sie 8.

Wir stellen sicher, dass Java so installiert ist, wie es sollte:

java -version

Wir erhalten ungefähr die folgende Schlussfolgerung:
Java-Version "1.8.0_191"
Java (TM) SE-Laufzeitumgebung (Build 1.8.0_191-b12)
Java HotSpot (TM) 64-Bit-Server-VM (Build 25.191-b12, gemischter Modus)

Erstellen Sie einen Benutzer und ein Passwort, um auf Kibana zuzugreifen. Wählen Sie anstelle von admin etwas, das Sie bevorzugen:

echo "admin:`openssl passwd -apr1`" | sudo tee -a /etc/nginx/htpasswd.users

Da sich der ELK auf localhost dreht, konfigurieren Sie den Reverse-Proxy in nginx:

nano /etc/nginx/sites-available/kibana
Server {
höre 80;

Servername suricata.server;

auth_basic "Eingeschränkter Zugriff";
auth_basic_user_file /etc/nginx/htpasswd.users;

Ort / {
proxy_pass localhost : 5601;
proxy_http_version 1.1;
proxy_set_header Upgrade $ http_upgrade;
proxy_set_header Verbindung 'Upgrade';
proxy_set_header Host $ host;
proxy_cache_bypass $ http_upgrade;
}}
}}

rm /etc/nginx/sites-enabled/default
ln -s /etc/nginx/sites-available/kibana /etc/nginx/sites-enabled/kibana


Starten Sie nginx neu:

systemctl restart nginx

Wir setzen Elasticsearch:

apt-get install -y elasticsearch

Aktivieren Sie beim Laden des Betriebssystems die automatische Ausführung:

systemctl daemon-reload
systemctl enable elasticsearch.service


Wir starten:

systemctl start elasticsearch.service

Überprüfen Sie, ob es gestiegen ist:

curl -X GET "localhost:9200/"

Abhängig von der Leistung Ihrer Hardware kann das Starten von ES einige Zeit dauern. Wenn die Verbindung abgelehnt wird , wiederholen Sie einfach die Anfrage und warten Sie, bis wir Folgendes erhalten:
{
"Name": "lcZuxxm",
"Clustername": "elasticsearch",
"Cluster_uuid": "kmJHqJnlQe2Rk7F-CRi4EA",
"Version": {
"Nummer": "6.5.1",
"Build_flavor": "default",
"Build_type": "deb",
"Build_hash": "8c58350",
"Build_date": "2018-11-16T02: 22: 42.182257Z",
"Build_snapshot": false,
"Lucene_version": "7.5.0",
"Minimum_wire_compatibility_version": "5.6.0",
"Minimum_index_compatibility_version": "5.0.0"
},
Slogan: Sie wissen, für die Suche
}}

Wir setzen Kibana:

apt-get install -y kibana

Aktivieren Sie beim Laden des Betriebssystems die automatische Ausführung:

systemctl daemon-reload
systemctl enable kibana.service


Wir starten:

systemctl start kibana.service

Jetzt können Sie zu 192.168.1.253 gehen (natürlich ist die IP-Adresse diejenige, die Ihrem Computer mit einem Erdmännchen zugewiesen wurde). Das Kibana-Deckblatt sollte geöffnet werden.

Wir setzen Filebeat:

apt-get install -y filebeat

Aktivieren Sie beim Laden des Betriebssystems die automatische Ausführung:

systemctl daemon-reload
systemctl enable filebeat


Wir aktivieren das Suricata-Modul, das Teil des Filebeat-Modulsatzes ist:

filebeat modules enable suricata

Installieren Sie Plugins für Suricata in Elasticsearch:

/usr/share/elasticsearch/bin/elasticsearch-plugin install ingest-geoip
/usr/share/elasticsearch/bin/elasticsearch-plugin install ingest-user-agent

Siehe UPD 22. Mai 2019.

Elasticsearch neu starten:

systemctl restart elasticsearch.service

Wir führen die Erstkonfiguration von Filebeat durch und laden gleichzeitig Vorlagen in Kibana:

filebeat setup -e

Wir überprüfen, ob Filebeat /var/log/suricata/eve.json gefunden hat und verarbeitet. Führen Sie dazu Filebeat im Datenausgabemodus mit der Veröffentlichungsmarkierung aus :

filebeat -e -d "publish"

Die json-formatierte Ausgabe von Filebeat selbst wird zuerst ausgeführt, dann eine einfache Textausgabe der Protokolle und erst nach einer Weile die Ausgabe von Suricata. Warten Sie also und stellen Sie sicher, dass alles funktioniert. Brechen Sie danach Filebeat ab und kehren Sie zu bash zurück.

Aktivieren Sie beim Laden des Betriebssystems die automatische Ausführung:

systemctl daemon-reload
systemctl enable filebeat.service


Führen Sie Filebeat aus:

systemctl start filebeat.service

Gehen Sie zu Kibana, wählen Sie Dashboard aus dem Menü links und wählen Sie filebeat- * index. Wählen Sie erneut Dashboard aus, wählen Sie [Suricata] Alert Overview aus der Liste aus und erhalten Sie Folgendes:

Bild

Optional


Vergessen Sie nicht, sich zu drehen, und egal wie groß die Festplatte ist, Suricata wird sie sehr schnell bewerten:

nano /etc/logrotate.d/suricata
/var/log/suricata/*.log /var/log/suricata/*.json
{
wöchentlich
drehen 3
Missingok
Nocompress
erstellen
Sharedscripts
postrotate
/ bin / kill -HUP `cat /var/run/suricata.pid 2> / dev / null` 2> / dev / null || wahr
Endschrift
}}

Darüber hinaus gab es Gerüchte, dass jemand, der regelmäßig in Mikrotik schnüffelt und den Status " Laufen" hat , den Verkehr einstellt. Dann schreiben wir ein Skript, um den Sniffer neu zu starten und gemäß dem Zeitplan auszuführen:

/tool sniffer stop
:delay 30s
/tool sniffer start


Fazit


Ehrlich gesagt bin ich mit der Stabilität des obigen Bündels nicht ganz zufrieden. Nämlich: Es lohnt sich neu zu starten und Wunder beginnen. Einmal hörte alles außer ein paar auf, meine Regeln zu verarbeiten. Ich musste alles neu installieren. Beim zweiten Mal hat Elasticsearch im Allgemeinen den Empfang von Daten von Filebeat eingestellt und musste vor dem Neustart auf den Status-Snapshot zurückgesetzt werden.

Ich habe diese Probleme noch nicht gelöst.

Darüber hinaus ist geplant, IPS basierend auf den IP-Adressen der von Suricata identifizierten Bösewichte zu implementieren, die an Mikrotik übertragen wurden.

UPD : Instabilitätsvorwürfe werden fallen gelassen. Meine Schlussfolgerung zur Beendigung der Regelverarbeitung war falsch. Tatsächlich ist der Grund für die Leere im Dashboard nach dem Neustart die Tatsache, dass Filebeat und Elasticsearch eine sehr bemerkenswerte Zeit benötigen, um die Multi-Gigabyte-JSON-Datei aus dem Erdmännchen zu analysieren. Wenn Sie das Dashboard mit Ereignissen für einen Zeitraum öffnen, der das Erstellungsdatum der Datei eve.json enthält, können Sie sehen, wie die Spalten des Diagramms während der Verarbeitung der Datei wachsen. Zusammen mit den verarbeiteten Ereignissen werden Warnungen im entsprechenden Dashboard angezeigt. Außerdem hat der Sniffer in RouterOS auf x86 nie gehangen.

UPD 22. Mai 2019 : Ab Version Elasticsearch 6.7 wurden die Plugins ingest-geoip und ingest-user-agent in Module konvertiert. Dementsprechend wird der Artikel mit ihrer Installation übersprungen.

Außerdem wird beim Upgrade ein Elasticsearch-Startfehler angezeigt. In den Protokollen wird ein Fehler angezeigt:

erwartete Datenbank [GeoLite2-ASN.mmdb] existiert nicht in [/ etc / elasticsearch / ingest-geoip]

Um die Leistung wiederherzustellen, führen wir Folgendes aus:

/usr/share/elasticsearch/bin/elasticsearch-plugin remove --purge ingest-geoip

Source: https://habr.com/ru/post/de431600/


All Articles