MISP-IOC-Logs erfassen
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
- Melden Sie sich als Administrator in der MISP-Web-UI an.
- Gehen Sie zu Verwaltung > Autorisierungsschlüssel auflisten.
- Klicken Sie auf Authentifizierungsschlüssel hinzufügen.
- 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
- Melden Sie sich über SSH in Ihrer MISP-Instanz an.
Installieren Sie PyMISP mit dem folgenden Befehl:
pip3 install pymisp
Ä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)
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.
- Ersetzen Sie
Ö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.
- Aktualisieren Sie
Authentifizierungsdatei für die Aufnahme in Google SecOps abrufen
- Melden Sie sich in der Google SecOps-Konsole an.
- Rufen Sie SIEM-Einstellungen > Collection Agents auf.
- 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
- Melden Sie sich in der Google SecOps-Konsole an.
- Rufen Sie die SIEM-Einstellungen > „Profil“ auf.
- Kopieren und speichern Sie die Kunden-ID aus dem Bereich Organisationsdetails.
BindPlane-Agent auf dem MISP-Server installieren
Linux-Installation
- Öffnen Sie ein Terminal mit Root- oder Sudo-Berechtigungen.
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
- 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).
- Suchen Sie die Datei
Bearbeiten Sie die Datei
config.yaml
so: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