Anleitung

Erfassung und Analyse von Zeek-Daten mit Elastic Security

In diesem Blogpost erläutere ich Ihnen den Prozess zur Konfiguration von Filebeat und Zeek (ehemals Bro), mit dem Sie Analytik auf Zeek-Daten unter Verwendung von Elastic Security durchführen können. Die Standardkonfiguration für Filebeat und seine Module funktioniert in vielen Umgebungen; es kann jedoch vorkommen, dass Sie Einstellungen speziell für Ihre Umgebung anpassen müssen. Die in diesem Blogpost beschriebenen Schritte sollen es Ihnen erleichtern, die notwendigen Maßnahmen zur Anpassung Ihrer Konfiguration zu verstehen, mit dem Ziel, Zeek-Daten innerhalb von Elastic Security sehen zu können.

Beats sind leichtgewichtige Shipper, die sich hervorragend zum Sammeln und Versenden von Daten vom oder in der Nähe des Rands Ihres Netzwerks an einen Elasticsearch-Cluster eignen. Beats versenden Daten, die dem Elastic Common Schema (ECS) entsprechen. Filebeat, ein Mitglied der Beat-Familie, verfügt über interne Module, die das Sammeln, Parsen und die Visualisierung gängiger Log-Formate vereinfachen. Die Module erreichen dies durch die Kombination automatischer Standardpfade basierend auf Ihrem Betriebssystem. Wir werden Filebeat verwenden, um Zeek-Daten zu parsen.

Ich werde auch Details zum GeoIP-Anreicherungsprozess für die Anzeige der Ereignisse beim Elastic Security-Zuordnen behandeln. Darüber hinaus werde ich erläutern, wie Zeek so konfiguriert wird, dass Daten im JSON-Format als Ausgang vorliegen, was für Filebeat erforderlich ist. Dieser Blog behandelt nur die Konfiguration. Ich gehe davon aus, dass Sie bereits ein Elasticsearch-Cluster konfiguriert haben, auf dem sowohl Filebeat als auch Zeek installiert sind.

Umgebungsdetails

Mein Elastic-Cluster wurde mit dem Elasticsearch Service erstellt, der in der Elastic Cloud gehostet wird. Sie können ganz einfach einen Cluster mit einer 14-tägigen kostenlosen Testversion starten, ohne dass eine Kreditkarte erforderlich ist. Probieren Sie es aus, denn so gelingt der Einstieg in den Elastic Stack schnell und einfach.

Ich verwende Zeek 3.0.0. Sie finden Zeek zum Herunterladen auf der Zeek-Website.

Filebeat-Überblick

Filebeat wird mit Dutzenden von vorkonfigurierten Integrationen geliefert, mit denen Sie in wenigen Minuten von den Daten zum Dashboard gelangen. Sie finden ganz einfach, was Sie benötigen, in unserer vollständigen Liste der Integrationen. Die Module verstehen nicht nur, wie die Quelldaten zu parsen sind, sondern richten auch eine Ingest-Pipeline ein, um die Daten in das ECS-Format zu transformieren. 

Elastic arbeitet daran, die Erfahrung bei der Daten-Onboarding und Dateningestion mit Elastic Agent und Ingest Manager zu verbessern. Da es sich jedoch derzeit um ein experimentelles Release handelt, konzentrieren wir uns auf die Verwendung der produktionsreifen Filebeat-Module. Darüber hinaus bieten viele der Module standardmäßig ein oder mehrere Kibana-Dashboards.

Abbildung 1: Filebeat Zeek-Dashboard

Filebeat-Zeek-Modul aktivieren

Zuerst müssen wir das Zeek-Modul in Filebeat aktivieren. Alle von Filebeat bereitgestellten Module sind standardmäßig deaktiviert.

Schritt 1: Zeek-Modul in Filebeat aktivieren

Das Aktivieren des Zeek-Moduls in Filebeat ist so einfach wie die Ausführung des folgenden Befehls:

sudo filebeat modules enable zeek

Dieser Befehl aktiviert Zeek über die Konfigurationsdatei zeek.yml im Verzeichnis modules.d von Filebeat. Filebeat sollte über Ihren Pfad zugänglich sein. Falls nicht, ist der Standardpfad für Filebeat /usr/bin/filebeat, sofern Sie Filebeat über das Elastic GitHub-Repository installiert haben.

Schritt 2: Zeek-Logpfad zu zeek.yml hinzufügen

Die Zeek-Logpfade werden im Zeek Filebeat-Modul konfiguriert, nicht in Filebeat selbst. Sie müssen die Konfigurationsdatei des Zeek Filebeat-Moduls, zeek.yml, bearbeiten. Bei meiner Filebeat-Installation befindet sie sich unter /etc/filebeat/modules.d/zeek.yml. Sie sollten Einträge für jedes der für Sie relevanten Zeek-Logs hinzufügen. Das Basisverzeichnis, in das meine Zeek-Installation Logs schreibt, ist /usr/local/zeek/logs/current

Hier ist die vollständige Liste der Zeek-Logpfade. Sie müssen diese Pfade an Ihre Umgebung anpassen.

# Modul: zeek
# Dokumentation: /guide/en/beats/filebeat/7.6/filebeat-module-zeek.html

- module: zeek
    capture_loss:
        enabled: true
        var.paths: ["/usr/local/zeek/logs/current/capture_loss.log"]
    Verbindung:
        enabled: true
        var.paths: ["/usr/local/zeek/logs/current/conn.log"]
    dce_rpc:
        enabled: true
        var.paths: ["/usr/local/zeek/logs/current/dce_rpc.log"]
    dhcp:
        enabled: true
        var.paths: ["/usr/local/zeek/logs/current/dhcp.log"]
    dnp3:
        enabled: true
        var.paths: ["/usr/local/zeek/logs/current/dnp3.log"]
    DNS:
        enabled: true
        var.paths: ["/usr/local/zeek/logs/current/dns.log"]
    dpd:
        enabled: true
        var.paths: ["/usr/local/zeek/logs/current/dpd.log"]
    Dateien:
        enabled: true
        var.paths: ["/usr/local/Zeek/log/current/files.log"]
    ftp:
        enabled: true
        var.paths: ["/usr/local/zeek/logs/current/ftp.log"]
    http:
        enabled: true
        var.paths: ["/usr/local/zeek/logs/current/http.log"]
    Threat Intelligence:
        enabled: true
        var.paths: ["/usr/local/zeek/logs/current/intel.log"]
    irc:
        enabled: true
        var.paths: ["/usr/local/zeek/logs/current/irc.log"]
    kerberos:
        enabled: true
        var.paths: ["/usr/local/zeek/logs/current/kerberos.log"]
    Modbus:
        enabled: true
        var.paths: ["/usr/local/zeek/logs/current/modbus.log"]
    MySQL:
        enabled: true
        var.paths: ["/usr/local/zeek/logs/current/mysql.log"]
    Hinweis:
        enabled: true
        var.paths: ["/usr/local/Zeek/log/current/notice.log"]
    ntlm:
        enabled: true
        var.paths: ["/usr/local/zeek/logs/current/ntlm.log"]
    ocsp:
        enabled: true
        var.paths: ["/usr/local/zeek/logs/current/ocsp.log"]
    pe:
        enabled: true
        var.paths: ["/usr/local/zeek/logs/current/pe.log"]
    Radius:
        enabled: true
        var.paths: ["/usr/local/zeek/logs/current/radius.log"]
    rdp:
        enabled: true
        var.paths: ["/usr/local/zeek/logs/current/rdp.log"]
    rfb:
        enabled: true
        var.paths: ["/usr/local/zeek/logs/current/rfb.log"]
    #  Signaturen:
    #    enabled: true
    #    var.paths: ["/usr/local/zeek/logs/current/signatures.log"]
    Sip:
        enabled: true
        var.paths: ["/usr/local/Zeek/log/current/sip.log"]
    smb_cmd:
        enabled: true
        var.paths: ["/usr/local/zeek/logs/current/smb_cmd.log"]
    smb_files:
        enabled: true
        var.paths: ["/usr/local/zeek/logs/current/smb_files.log"]
    smb_mapping:
        enabled: true
        var.paths: ["/usr/local/zeek/logs/current/smb_mapping.log"]
    SMTP:
        enabled: true
        var.paths: ["/usr/local/zeek/logs/current/smtp.log"]
    snmp:
        enabled: true
        var.paths: ["/usr/local/zeek/logs/current/snmp.log"]
    Socks:
        enabled: true
        var.paths: ["/usr/local/zeek/logs/current/socks.log"]
    ssh:
        enabled: true
        var.paths: ["/usr/local/zeek/logs/current/ssh.log"]
    ssl:
        enabled: true
        var.paths: ["/usr/local/zeek/logs/current/ssl.log"]
    Statistiken:
        enabled: true
        var.paths: ["/usr/local/zeek/logs/current/stats.log"]
    syslog:
        enabled: true
        var.paths: ["/usr/local/zeek/logs/current/syslog.log"]
    traceroute:
        enabled: true
        var.paths: ["/usr/local/zeek/logs/current/traceroute.log"]
    Tunnel:
        enabled: true
        var.paths: ["/usr/local/zeek/logs/current/tunnel.log"]
    seltsam:
        enabled: true
        var.paths: ["/usr/local/zeek/logs/current/weird.log"]
    x509:
        enabled: true
        var.paths: ["/usr/local/zeek/logs/current/x509.log"]

Hinweis: Das Signatur-Log ist auskommentiert, da der Filebeat-Parser zum Zeitpunkt der Veröffentlichung dieses Blogs noch keinen Support für das Signatur-Log enthält.

Schritt 3: Filebeat neu starten

Sobald Sie die Bearbeitung und Speicherung Ihrer zeek.yml -Konfigurationsdatei abgeschlossen haben, sollten Sie Filebeat neu starten. Auch wenn Ihre Linux-Version möglicherweise eine leichte Abweichung erfordert, erfolgt dies normalerweise über:

sudo systemctl restart filebeat

An diesem Punkt würden Sie normalerweise erwarten, Zeek-Daten in Elastic Security und in den Filebeat-Indizes zu sehen. Seien Sie nicht überrascht, wenn Sie Ihre Zeek-Daten nicht in Discover oder auf Dashboards sehen. Es sind noch einige weitere Schritte erforderlich.

Konfigurieren von Zeek für den JSON-Ausgang

Standardmäßig gibt Zeek keine Logs im JSON-Format als Ausgang aus. Dies ist der Grund, warum die Zeek-Daten in den Filebeat-Indizes fehlen. Das Filebeat-Zeek-Modul geht davon aus, dass die Zeek-Logs im JSON-Format vorliegen. Sie werden wahrscheinlich Fehler beim Parsen der Logs sehen, wenn Sie versuchen, die Standard-Zeek-Logs zu parsen.

  1. Sie müssen die Konfigurationsdatei local.zeek bearbeiten, um die JSON-logging-Ausgang zu konfigurieren. Der Speicherort dieser Konfigurationsdatei hängt von Ihrer Zeek-Installation ab. Meine Zeek-Installation befindet sich unter /usr/local/zeek. Meine Konfigurationsdatei befindet sich unter /usr/local/zeek/share/zeek/site/local.zeek.
  2. Fügen Sie das folgende Liniendiagramm am Ende der Konfigurationsdatei hinzu:
    @load policy/tuning/JSON-log.zeek
  3. Nachdem Sie die Konfigurationsdatei local.zeek bearbeitet haben, müssen Sie Zeek mit folgendem Befehl neu starten:
    sudo zeekctl bereitstellen
    Dadurch wird Zeek unter Verwendung der aktualisierten Einstellungen der Konfigurationsdatei neu gestartet.
  4. Sobald Sie diese Änderung vorgenommen haben, sollten Sie Filebeat neu starten. An diesem Punkt sollten die Zeek-Daten in Ihren Filebeat-Indizes sichtbar sein.

Dies ist eine Ansicht von Discover, die die mit Daten gefüllten Werte der Geo-Felder zeigt:


Abbildung 2: Kibana Discover

GeoIP-Anreicherung

Nachdem die Zeek-Daten in den Filebeat-Indices gelandet waren, war ich überrascht, dass ich keine der „Pew-Pew“-Liniendiagramme auf dem Tab „Network“ in Elastic Security sah. Ich habe die geoip-info -Ingest-Pipeline erstellt, wie in der SIEM Config zuordnen Benutzeroberfläche-Dokumentation beschrieben. Außerdem habe ich überprüft, ob ich diese Pipeline im Ausgangsbereich der Filebeat-Konfiguration wie dokumentiert referenziert habe.

Das folgende Beispiel zeigt das Definieren der Pipeline in der Konfigurationsdatei filebeat.yml:

Ausgang.Elasticsearch:
  # Array der Hosts, zu denen eine Verbindung hergestellt werden soll.
  hosts: ["localhost:9200"]
  Pipeline: geoip-info

Die Nodes, auf denen ich Zeek ausführe, verwenden nicht routbare IP-Adressen, daher musste ich den Filebeat-Prozessor add_field verwenden, um die Geoinformationen basierend auf der IP-Adresse zuzuordnen. Obwohl diese Informationen im obigen Link dokumentiert sind, gab es ein Problem mit den Feldnamen.

Die GeoIP-Pipeline geht davon aus, dass sich die IP-Informationen in source.ip und destination.ip befinden. Dies trifft auf die meisten Quellen zu. Bei Zeek sind diese Informationen jedoch in source.address und destination.address enthalten. Warum ist das so? Es liegt letztlich am Datenfluss und daran, wann die Ingest-Pipeline aktiv wird.

Das Zeek-Modul für Filebeat erstellt eine Ingest-Pipeline, um Daten in ECS zu konvertieren. Diese Pipeline kopiert die Werte von source.address nach source.ip und von destination.address nach destination.ip. Der add_fields -Prozessor, der in Filebeat Felder hinzufügt, wird jedoch ausgeführt, bevor die Ingest-Pipeline die Daten verarbeitet. Daher sind die Werte für source.ip und destination.ip noch nicht befüllt, wenn der add_field-Prozessor aktiv ist.

Ich habe meine Filebeat-Konfiguration so angepasst, dass der add_field -Prozessor verwendet wird und address anstelle von ip zum Einsatz kommt. Das sieht dann so aus:

Prozessoren:
    - add_host_metadata:
    - add_cloud_metadata:
    - add_fields:
        when.network.source.address: 10.128.0.0/24
        Feld:
            source.geo.location:
            Breitengrad: 41,619549
            lon: -93.598022
            source.geo.continent_name: Nordamerika
            source.geo.country_iso_code: USA
            source.geo.region_iso_code: US-IA
            source.geo.region_name: Iowa
        Ziel: ''
    - add_fields:
        when.network.destination.address: 10.128.0.0/24
        Feld:
            destination.geo.location:
            Breitengrad: 41,619549
            lon: -93.598022
            destination.geo.continent_name: Nordamerika
            destination.geo.country_iso_code: USA

Beachten Sie, dass ich in der Zeile when.network.source.address das Feld address verwende und nicht when.network.source.ip, wie in der Dokumentation angegeben. Dies gilt auch für die Zeile destination. Damit wird das zuvor erwähnte Timing des Datenflusses adressiert. In dieser Phase des Datenflusses befinden sich die benötigten Informationen im Feld source.address.

Zeek-Daten in Elastic Security überprüfen

Sobald Sie alle Änderungen an Ihrer Konfigurationsdatei filebeat.yml vorgenommen haben, müssen Sie Filebeat neu starten. Verwenden Sie dazu:

sudo systemctl restart filebeat

Öffnen Sie nun Elastic Security und navigieren Sie zum Tab „Network“. Die Karte sollte die „Pew-Pew“-Linien korrekt anzeigen, die wir sehen wollten.

Abbildung 3: Beispiel einer Netzwerkkarte in Elastic Security

Zusätzlich zur Netzwerkkarte sollten Sie auch Zeek-Daten auf dem Tab „Elastic Security“-Überblick sehen. In diesem Beispiel sehen Sie, dass Filebeat in den letzten 24 Stunden über 500.000 Zeek-Events erfasst hat.

Abbildung 4: Überblickseite mit Zeek-Zusammenfassungsdetails

Sie können sich Zeek-Events auch als externe Alerts innerhalb von Elastic Security anzeigen lassen.

Abbildung 5: Externe Alerts von Zeek

Die Anzahl der für diese Konfiguration erforderlichen Schritte war relativ gering. Die Konfiguration sollte im Allgemeinen nur wenige Minuten in Anspruch nehmen, was unterstreicht, wie einfach es ist, in wenigen Minuten von den Daten zum Dashboard zu gelangen!

Wie geht es weiter?

Was sind also die nächsten Schritte? Denken Sie an weitere Daten-Feeds, die Sie einbinden möchten, wie z. B. Suricata- und Host-Datenströme. Ich empfehle Ihnen, unseren Blogbeitrag Getting started with adding a new Sicherheitsdatenquelle in Elastic SIEM zu lesen, der Sie Schritt für Schritt durch das Hinzufügen neuer Sicherheitsdatenquellen für die Verwendung in Elastic Security führt.

Bereit für ganzheitlichen Daten-Schutz mit Elastic Security? Testen Sie es noch heute kostenlos im Elasticsearch-Dienst auf Elastic Cloud.