MISP-IOC-Logs erfassen

Unterstützt in:

In diesem Leitfaden wird beschrieben, wie Sie MISP-Logs (Malware Information Sharing Platform) mit IOCs (Indicators of Compromise) mithilfe von BindPlane in Google Security Operations aufnehmen. Der Parser extrahiert IOCs aus MISP-Daten, die als JSON oder CSV formatiert sind. Es analysiert die Eingabe, ordnet Felder dem Unified Data Model (UDM) zu, verarbeitet verschiedene IOC-Typen (z. B. IP-Adressen, Domains und Dateihashes) und reichert die Daten mit Informationen zu Bedrohungen wie Vertraulichkeit und Schweregrad an. Der Parser führt auch eine spezifische Logik für verschiedene Datenformate aus und verarbeitet Fälle mit fehlenden oder nicht unterstützten Feldern.

Hinweise

Prüfen Sie, ob folgende Voraussetzungen erfüllt sind:

  • Google SecOps-Instanz
  • Linux-Host mit systemd
  • Wenn die Ausführung hinter einem Proxy erfolgt, sind die Firewallports geöffnet.
  • Privilegierter Zugriff auf Ihren MISP-Server

MISP-API-Schlüssel abrufen

  1. Melden Sie sich als Administrator in der MISP-Web-UI an.
  2. Gehen Sie zu Verwaltung > Autorisierungsschlüssel auflisten.
  3. Klicken Sie auf Authentifizierungsschlüssel hinzufügen.
  4. Geben Sie die folgende Schlüsselkonfiguration an:
    • Nutzer: Wählen Sie das Nutzerkonto aus, das mit dem Schlüssel verknüpft ist.
    • Zulässige IPs: Sie können optional zulässige IP-Adressen für den Schlüssel angeben.
    • Kopieren Sie den Schlüssel und speichern Sie ihn an einem sicheren Ort.
    • Klicken Sie auf Ich habe meinen Schlüssel notiert.

MISP-Logs exportieren

  1. Melden Sie sich über SSH in Ihrer MISP-Instanz an.
  2. Installieren Sie PyMISP mit dem folgenden Befehl:

    pip3 install pymisp 
    
  3. Ändern Sie das get_csv.py-Exportskript so:

    #!/usr/bin/env python3
    # -*- coding: utf-8 -*-
    
    import argparse
    
    from pymisp import ExpandedPyMISP
    from keys import misp_url, misp_key, misp_verifycert
    
    if __name__ == '__main__':
        parser = argparse.ArgumentParser(description='Get MISP data in a CSV format.')
        parser.add_argument("--controller", default='attributes', help="Attribute to use for the search (events, objects, attributes)")
        parser.add_argument("-e", "--event_id", help="Event ID to fetch. Without it, it will fetch the whole database.")
        parser.add_argument("-a", "--attribute", nargs='+', help="Attribute column names")
        parser.add_argument("-o", "--object_attribute", nargs='+', help="Object attribute column names")
        parser.add_argument("-t", "--misp_types", nargs='+', help="MISP types to fetch (ip-src, hostname, ...)")
        parser.add_argument("-c", "--context", action='store_true', help="Add event level context (tags...)")
        parser.add_argument("-f", "--outfile", help="Output file to write the CSV.")
        parser.add_argument("-l", "--last", required=True, help="can be defined in days, hours, minutes (for example 5d or 12h or 30m).")
    
        args = parser.parse_args()
        pymisp = ExpandedPyMISP(misp_url, misp_key, misp_verifycert, debug=True)
        attr = []
        if args.attribute:
            attr += args.attribute
        if args.object_attribute:
            attr += args.object_attribute
        if not attr:
            attr = None
        print(args.context)
        response = pymisp.search(return_format='csv', controller=args.controller, eventid=args.event_id, requested_attributes=attr, publish_timestamp=args.last,
                                type_attribute=args.misp_types, include_context=args.context)
    
        if args.outfile:
            with open(args.outfile, 'w') as f:
                f.write(response)
        else:
            print(response)
    
  4. Bearbeiten Sie die Datei keys.py, um Ihre MISP-API-Anmeldedaten und ‑URL einzufügen:

    misp_url = 'https://<MISP_URL>'
    misp_key = '<MISP_API_KEY>'
    misp_verifycert = False
    misp_client_cert = ''
    
    • Ersetzen Sie <MISP_URL> durch die IP-Adresse oder den Hostnamen Ihres MISP-Servers.
    • Ersetzen Sie <MISP_API_KEY durch den zuvor generierten API-Schlüssel.
  5. Öffnen Sie crontab mit dem Befehl crontab -e und geben Sie Folgendes ein:

    0 20 * * * python3 /opt/misp/<YOUR_EXPORT_SCRIPT_PATH> -f /opt/misp/ioc_export/url.log -t "url" -l 1d -c
    0 20 * * * python3 /opt/misp/<YOUR_EXPORT_SCRIPT_PATH> -f /opt/misp/ioc_export/ip-dst.log -t "ip-dst" -l 1d -c
    0 20 * * * python3 /opt/misp/<YOUR_EXPORT_SCRIPT_PATH> -f /opt/misp/ioc_export/ip-src.log -t "ip-src" -l 1d -c
    0 20 * * * python3 /opt/misp/<YOUR_EXPORT_SCRIPT_PATH> -f /opt/misp/ioc_export/domain.log -t "domain" -l 1d -c
    0 20 * * * python3 /opt/misp/<YOUR_EXPORT_SCRIPT_PATH> -f /opt/misp/ioc_export/sha256.log -t "sha256" -l 1d -c
    0 20 * * * python3 /opt/misp/<YOUR_EXPORT_SCRIPT_PATH> -f /opt/misp/ioc_export/file.log -t "filename" -l 1d -c
    0 20 * * * python3 /opt/misp/<YOUR_EXPORT_SCRIPT_PATH> -f /opt/misp/ioc_export/registry.log -t "registry" -l 1d -c
    0 20 * * * python3 /opt/misp/<YOUR_EXPORT_SCRIPT_PATH> -f /opt/misp/ioc_export/mutex.log -t "mutex" -l 1d -c
    0 20 * * * python3 /opt/misp/<YOUR_EXPORT_SCRIPT_PATH> -f /opt/misp/ioc_export/threat-actor.log -t "threat-actor" -l 1d -c
    
    • Aktualisieren Sie <YOUR_EXPORT_SCRIPT_PATH> entsprechend dem tatsächlichen Speicherort des Exportskripts.

Authentifizierungsdatei für die Aufnahme in Google SecOps abrufen

  1. Melden Sie sich in der Google SecOps-Konsole an.
  2. Rufen Sie SIEM-Einstellungen > Collection Agents auf.
  3. Laden Sie die Authentifizierungsdatei für die Aufnahme herunter. Speichern Sie die Datei sicher auf dem System, auf dem BindPlane installiert wird.

Google SecOps-Kundennummer abrufen

  1. Melden Sie sich in der Google SecOps-Konsole an.
  2. Rufen Sie die SIEM-Einstellungen > „Profil“ auf.
  3. Kopieren und speichern Sie die Kunden-ID aus dem Bereich Organisationsdetails.

BindPlane-Agent auf dem MISP-Server installieren

Linux-Installation

  1. Öffnen Sie ein Terminal mit Root- oder Sudo-Berechtigungen.
  2. Führen Sie dazu diesen Befehl aus:

    sudo sh -c "$(curl -fsSlL https://github.com/observiq/bindplane-agent/releases/latest/download/install_unix.sh)" install_unix.sh
    

Zusätzliche Installationsressourcen

Weitere Installationsoptionen finden Sie im Installationsleitfaden.

BindPlane-Agent so konfigurieren, dass MISP-Logdateien aufgenommen und an Google SecOps gesendet werden

  1. Rufen Sie die Konfigurationsdatei auf:
    • Suchen Sie die Datei config.yaml. Normalerweise befindet sie sich unter Linux im Verzeichnis /etc/bindplane-agent/.
    • Öffnen Sie die Datei mit einem Texteditor (z. B. nano, vi oder Notepad).
  2. Bearbeiten Sie die Datei config.yamlso:

    receivers:
        filelog:
            file_path: /opt/misp/ioc_export/*.log
            log_type: 'file'
    
    exporters:
        chronicle/chronicle_w_labels:
            compression: gzip
            # Adjust the path to the credentials file you downloaded in Step 1
            creds_file_path: '/path/to/ingestion-authentication-file.json'
            # Replace with your actual customer ID from Step 2
            customer_id: <customer_id>
            endpoint: malachiteingestion-pa.googleapis.com
            # Add optional ingestion labels for better organization
            ingestion_labels:
                log_type: 'MISP_IOC'
                raw_log_field: body
    
    service:
        pipelines:
            logs/source0__chronicle_w_labels-0:
                receivers:
                  - filelog
                exporters:
                    - chronicle/chronicle_w_labels
    
    • Ersetzen Sie den Port und die IP-Adresse nach Bedarf in Ihrer Infrastruktur.
    • Ersetzen Sie <customer_id> durch die tatsächliche Kundennummer.
    • Aktualisieren Sie /path/to/ingestion-authentication-file.json auf den Pfad, in dem die Authentifizierungsdatei im Abschnitt Google SecOps-Aufnahmeauthentifizierungsdatei abrufen gespeichert wurde.

Bindplane-Agent neu starten, um die Änderungen zu übernehmen

Führen Sie den folgenden Befehl aus, um den Bindplane-Agent unter Linux neu zu starten:

  sudo systemctl restart bindplane-agent

UDM-Zuordnungstabelle

Logfeld UDM-Zuordnung Logik
Attribute.category event.idm.entity.metadata.threat.category_details Direkt aus Attribute.category im verschachtelten JSON-Objekt im Feld „data“ zugeordnet. Wird im JSON-Parsing-Pfad verwendet.
Attribute.comment event.idm.entity.metadata.threat.summary Direkt aus Attribute.comment im verschachtelten JSON-Objekt im Feld „data“ zugeordnet. Wird im JSON-Parsing-Pfad verwendet.
Attribute.deleted event.idm.entity.metadata.threat.detection_fields.value Direkt aus Attribute.deleted zugeordnet und als Erkennungsfeld mit dem Schlüssel „Attribute deleted“ (Attribut gelöscht) hinzugefügt. Wird im JSON-Parsing-Pfad verwendet.
Attribute.event_id event.idm.entity.metadata.threat.detection_fields.value Direkt aus Attribute.event_id zugeordnet und als Erkennungsfeld mit dem Schlüssel „Attribute event_id“ hinzugefügt. Wird im JSON-Parsing-Pfad verwendet.
Attribute.first_seen event.idm.entity.metadata.threat.detection_fields.value Direkt aus Attribute.first_seen zugeordnet und als Erkennungsfeld mit dem Schlüssel „Attribute first_seen“ hinzugefügt. Wird im JSON-Parsing-Pfad verwendet.
Attribute.id event.idm.entity.metadata.threat.detection_fields.value Direkt aus Attribute.id zugeordnet und als Erkennungsfeld mit dem Schlüssel „Attribute id“ (Attribut-ID) oder „Attribute id $$“ (Attribut-ID $$) hinzugefügt, je nach Parsing-Pfad. Wird sowohl beim CSV- als auch beim JSON-Parsing verwendet.
Attribute.timestamp event.idm.entity.metadata.threat.detection_fields.value Direkt aus Attribute.timestamp zugeordnet und als Erkennungsfeld mit dem Schlüssel „Attribut-Zeitstempel“ hinzugefügt. Wird im JSON-Parsing-Pfad verwendet.
Attribute.to_ids event.idm.entity.metadata.threat.detection_fields.value Direkt aus Attribute.to_ids zugeordnet und als Erkennungsfeld mit dem Schlüssel „Attribute to_ids“ hinzugefügt. Wird im JSON-Parsing-Pfad verwendet.
Attribute.type log_type Direkt aus Attribute.type im verschachtelten JSON-Objekt im Feld „data“ zugeordnet. Wird als Zwischenfeld verwendet und später zum Ausfüllen anderer UDM-Felder. Wird im JSON-Parsing-Pfad verwendet.
Attribute.uuid event.idm.entity.metadata.product_entity_id Direkt aus Attribute.uuid im verschachtelten JSON-Objekt im Feld „data“ zugeordnet. Wird im JSON-Parsing-Pfad verwendet.
Attribute.value Mehrere Der Wert dieses Felds wird verwendet, um mehrere UDM-Felder in Abhängigkeit von Attribute.type (oder log_type, wenn es von Attribute.type abgeleitet wird) zu füllen:
 – event.idm.entity.entity.hostname, wenn type „domain“ ist.
 – event.idm.entity.entity.file.md5, wenn type „md5“ ist.
 – event.idm.entity.entity.file.sha1, wenn type „sha1“ ist.
 – event.idm.entity.entity.file.sha256, wenn type „sha256“ ist.
 – event.idm.entity.entity.resource.name, wenn type „mutex“ ist.
 – event.idm.entity.entity.registry.registry_key, wenn type „regkey“ ist.
 – event.idm.entity.entity.user.email_addresses, wenn type „threat-actor“ ist.
 – event.idm.entity.entity.url, wenn type uri oder url ist.
 – event.idm.entity.entity.file.full_path, wenn type „filename“ ist.
: Wird nach IP-Adresse und Port geparst, wenn type „ip-dst|port“, „ip-dst“ oder „ip-src“ ist. Wird im JSON-Parsing-Pfad verwendet.
column1 event.idm.entity.metadata.product_entity_id Direkt aus column1 im CSV-Parsing-Pfad zugeordnet.
column14 Teil von event.idm.entity.metadata.threat.description Wird mit description verkettet, um die endgültige Beschreibung in den Bedrohungsmetadaten zu bilden. Wird im CSV-Parsing-Pfad verwendet.
column16 event.idm.entity.metadata.threat.threat_feed_name, event.ioc.feed_name Direkt aus column16 übernommen. Wird im CSV-Parsing-Pfad verwendet.
column18 event.idm.entity.metadata.threat.severity_details, event.ioc.raw_severity Direkt aus column18 übernommen. Wird im CSV-Parsing-Pfad verwendet.
column21 Teil von event.idm.entity.metadata.threat.description, event.ioc.description Wird als Grundlage für die Beschreibung verwendet und später mit event_info verkettet. Wird im CSV-Parsing-Pfad verwendet.
column3 Teil von event.ioc.categorization Direkt aus column3 abgeleitet und mit „IOCs“ verkettet, um die endgültige Kategorisierung zu bilden. Wird im CSV-Parsing-Pfad verwendet.
column4 event.idm.entity.metadata.description Direkt aus column4 übernommen. Wird im CSV-Parsing-Pfad verwendet.
column5 Mehrere Der Wert dieses Felds wird verwendet, um mehrere UDM-Felder in Abhängigkeit vom Feld column4 (das type entspricht) auszufüllen:
 – event.idm.entity.entity.hostname, wenn type „domain“ ist.
: Wird nach IP-Adresse und Port geparst, wenn type „ip-dst|port“, „ip-dst“ oder „ip-src“ ist.
 – event.idm.entity.entity.file.md5, wenn type „md5“ ist.
 – event.idm.entity.entity.file.sha1, wenn type „sha1“ ist.
 – event.idm.entity.entity.file.sha256, wenn type „sha256“ ist.
 – event.idm.entity.entity.resource.name, wenn type „mutex“ ist.
 – event.idm.entity.entity.registry.registry_key, wenn type „regkey“ ist.
 – event.idm.entity.entity.user.email_addresses, wenn type „threat-actor“ ist.
 – event.idm.entity.entity.url, wenn type uri oder url ist.
 – event.idm.entity.entity.file.full_path, wenn type „filename“ ist. Wird im CSV-Parsing-Pfad verwendet.
column6 event.idm.entity.metadata.threat.summary Direkt aus column6 übernommen. Wird im CSV-Parsing-Pfad verwendet.
column8 event.ioc.active_timerange.start, event.idm.entity.metadata.interval.start_time Wird als UNIX-Zeitstempel geparst. Wird im CSV-Parsing-Pfad verwendet.
date description event.idm.entity.metadata.threat.description Direkt aus description im verschachtelten JSON-Objekt im Feld „data“ zugeordnet. Wird im JSON-Parsing-Pfad verwendet.
event_creator_email event.idm.entity.entity.labels.value Direkt aus event_creator_email übernommen und als Label mit dem Schlüssel „event_creator_email“ hinzugefügt. Wird im JSON-Parsing-Pfad verwendet.
event_id Feed.publish event.idm.entity.metadata.threat.detection_fields.value Direkt aus Feed.publish übernommen und als Erkennungsfeld mit dem Schlüssel „Feed publish“ hinzugefügt. Wird im JSON-Parsing-Pfad verwendet.
first_seen event.ioc.active_timerange.start, event.idm.entity.metadata.interval.start_time Wird als Zeitstempel im Format „JJJJ-MM-TTTHH:mm:ssZZ“ geparst. Wird im JSON-Parsing-Pfad verwendet.
id info event.idm.entity.metadata.description Direkt aus info im verschachtelten JSON-Objekt im Feld „data“ zugeordnet. Wird im JSON-Parsing-Pfad verwendet.
last_seen event.ioc.active_timerange.end Wird als Zeitstempel im Format „JJJJ-MM-TTTHH:mm:ssZZ“ geparst. Wird im JSON-Parsing-Pfad verwendet.
Org.name event.idm.entity.metadata.threat.detection_fields.value Direkt aus Org.name zugeordnet und als Erkennungsfeld mit dem Schlüssel „Org name“ (Organisationsname) hinzugefügt. Wird im JSON-Parsing-Pfad verwendet.
published event.idm.entity.metadata.threat.detection_fields.value Direkt aus published zugeordnet und als Erkennungsfeld mit dem Schlüssel „published“ hinzugefügt. Wird im JSON-Parsing-Pfad verwendet.
Tag.colour event.idm.entity.metadata.threat.detection_fields.value Direkt aus Tag.colour zugeordnet und als Erkennungsfeld mit dem Schlüssel „tag colour“ (Tag-Farbe) hinzugefügt. Wird im JSON-Parsing-Pfad verwendet.
Tag.exportable event.idm.entity.metadata.threat.detection_fields.value Direkt aus Tag.exportable übernommen und als Erkennungsfeld mit dem Schlüssel „tag exportable“ hinzugefügt. Wird im JSON-Parsing-Pfad verwendet.
Tag.hide_tag event.idm.entity.metadata.threat.detection_fields.value Direkt aus Tag.hide_tag übernommen und als Erkennungsfeld mit dem Schlüssel „tag hide_tag“ hinzugefügt. Wird im JSON-Parsing-Pfad verwendet.
Tag.id event.idm.entity.metadata.threat.detection_fields.value Direkt aus Tag.id zugeordnet und als Erkennungsfeld mit dem Schlüssel „tag id“ hinzugefügt. Wird im JSON-Parsing-Pfad verwendet.
Tag.is_custom_galaxy event.idm.entity.metadata.threat.detection_fields.value Direkt aus Tag.is_custom_galaxy zugeordnet und als Erkennungsfeld mit dem Schlüssel „tag is_custom_galaxy“ hinzugefügt. Wird im JSON-Parsing-Pfad verwendet.
Tag.is_galaxy event.idm.entity.metadata.threat.detection_fields.value Direkt aus Tag.is_galaxy zugeordnet und als Erkennungsfeld mit dem Schlüssel „tag is_galaxy“ hinzugefügt. Wird im JSON-Parsing-Pfad verwendet.
Tag.isinherited event.idm.entity.metadata.threat.detection_fields.value Direkt aus Tag.isinherited zugeordnet und als Erkennungsfeld mit dem Schlüssel „tag isinherited“ hinzugefügt. Wird im JSON-Parsing-Pfad verwendet.
Tag.name event.idm.entity.metadata.threat.detection_fields.value Direkt aus Tag.name zugeordnet und als Erkennungsfeld mit dem Schlüssel „tag name“ hinzugefügt. Wird im JSON-Parsing-Pfad verwendet.
Tag.numerical_value event.idm.entity.metadata.threat.detection_fields.value Direkt aus Tag.numerical_value übernommen und als Erkennungsfeld mit dem Schlüssel „tag numerical_value“ hinzugefügt. Wird im JSON-Parsing-Pfad verwendet.
Tag.user_id event.idm.entity.metadata.threat.detection_fields.value Direkt aus Tag.user_id zugeordnet und als Erkennungsfeld mit dem Schlüssel „tag user_id“ hinzugefügt. Wird im JSON-Parsing-Pfad verwendet.
threat_level_id event.idm.entity.entity.labels.value Direkt aus threat_level_id zugeordnet und als Label mit dem Schlüssel „threat_level_id“ hinzugefügt. Wird im JSON-Parsing-Pfad verwendet.
timestamp event.idm.entity.metadata.collected_timestamp, event.idm.entity.metadata.interval.start_time Wird als UNIX-Zeitstempel geparst. Wird im CSV-Parsing-Pfad verwendet.
uuid event.idm.entity.metadata.vendor_name Wird vom Parser auf „MISP“ gesetzt. Wird vom Parser auf „MISP“ gesetzt. Auf einen Standardwert in ferner Zukunft festgelegt (253402300799 Sekunden seit der Epoche). Wird vom Parser anhand des Felds type oder log_type bestimmt. Kann „FILE“, „DOMAIN_NAME“, „IP_ADDRESS“, „MUTEX“, „RESOURCE“ oder „USER“ sein. Kann je nach Attribute.type aus Attribute.comment oder Attribute.value abgeleitet werden. Wird aus Attribute.value oder column5 geparst, wenn der Typ IP-bezogen ist. Wird aus Attribute.value oder column5 geparst, wenn der Typ „ip-dst|port“ ist. Abgeleitet von column3 beim CSV-Parsing oder Attribute.category beim JSON-Parsing. Abgeleitet von column21 und column14 beim CSV-Parsing. Abgeleitet von column8 oder first_seen. Abgeleitet von last_seen. Abgeleitet von description mithilfe eines Grok-Musters. Abgeleitet von column16 oder auf „MISP“ festgelegt. Abgeleitet von column18. Wird aus Attribute.value oder column5 geparst, wenn der Typ IP-bezogen ist. Wird aus Attribute.value oder column5 geparst, wenn der Typ „ip-dst|port“ ist. Abgeleitet von Attribute.value oder column5, wenn der Typ „domain“ ist. Abgeleitet aus dem Feld confidence, das aus dem Feld description extrahiert wird. Mögliche Werte sind „HIGH_CONFIDENCE“, „MEDIUM_CONFIDENCE“, „LOW_CONFIDENCE“ oder „UNKNOWN_CONFIDENCE“. Direkt aus dem Feld confidence zugeordnet, das aus dem Feld description extrahiert wird. Direkt aus dem Feld threat_level zugeordnet, das im CSV-Parsing-Pfad aus column18 abgeleitet wird. Direkt aus dem Feld feed_name zugeordnet, das im CSV-Parsing-Pfad aus column16 abgeleitet wird. Abgeleitet von column21 und column14 beim CSV-Parsing. Abgeleitet von column6 beim CSV-Parsing oder Attribute.comment beim JSON-Parsing. Mehrere Felder werden als Erkennungsfelder mit den entsprechenden Schlüsseln hinzugefügt. Mehrere Felder werden als Labels mit den entsprechenden Schlüsseln hinzugefügt. Wird aus dem Feld timestamp der obersten Ebene im Rohlog kopiert.

Benötigen Sie weitere Hilfe? Antworten von Community-Mitgliedern und Google SecOps-Experten erhalten