ESET Threat Intelligence-Logs erfassen
In diesem Dokument wird beschrieben, wie Sie ESET Threat Intelligence-Logs mit Google Cloud Storage V2, einer Cloud Run-Funktion und Cloud Scheduler in Google Security Operations aufnehmen.
ESET Threat Intelligence (ETI) bietet evidenzbasierte Informationen und umsetzbare Ratschläge zu bestehenden oder neuen Bedrohungen. ETI-Dienste warnen Sie vor schädlicher Software oder Aktivitäten, die Ihr Unternehmen oder seine Kunden gefährden könnten. Der Dienst liefert Threat Intelligence-Daten über TAXII 2.1-Feeds im STIX 2.1-Format, einschließlich APT-IoC, Botnet-C&C und -Zielen, schädlichen Domains, IPs, URLs, Dateien, Phishing-URLs, Ransomware und Android-Bedrohungen.
Hinweise
Prüfen Sie, ob folgende Voraussetzungen erfüllt sind:
- Eine Google SecOps-Instanz
- Ein Google Cloud-Projekt mit den folgenden aktivierten APIs:
- Cloud Storage API
- Cloud Run Functions API
- Cloud Scheduler API
- Cloud Pub/Sub API
- Berechtigungen zum Erstellen und Verwalten von Google Cloud Storage-Buckets, Cloud Run-Funktionen, Pub/Sub-Themen und Cloud Scheduler-Jobs
- Berechtigungen zum Verwalten von IAM-Richtlinien für Google Cloud Storage-Buckets
- Ein aktives ESET Threat Intelligence-Abo
- Zugriff auf das ESET Threat Intelligence-Portal unter https://eti.eset.com
Google Cloud Storage-Bucket erstellen
- Öffnen Sie die Google Cloud Console.
- Wählen Sie Ihr Projekt aus oder erstellen Sie ein neues.
- Rufen Sie im Navigationsmenü Cloud Storage > Buckets auf.
- Klicken Sie auf Bucket erstellen.
Geben Sie die folgenden Konfigurationsdetails an:
Einstellung Wert Bucket benennen Geben Sie einen global eindeutigen Namen ein, z. B. eset-ti-logs.Standorttyp Wählen Sie je nach Bedarf aus (Region, Dual-Region, Multi-Region). Standort Wählen Sie den Ort aus, z. B. us-central1.Speicherklasse Standard (empfohlen für Logs, auf die häufig zugegriffen wird) Zugriffskontrolle Einheitlich (empfohlen) Schutzmaßnahmen Optional: Objektversionsverwaltung oder Aufbewahrungsrichtlinie aktivieren Klicken Sie auf Erstellen.
ESET Threat Intelligence-TAXII-Anmeldedaten erfassen
Damit die Cloud Run-Funktion Threat Intelligence-Daten abrufen kann, müssen Sie TAXII-Feeds aktivieren und TAXII-Anmeldedaten über das ETI-Portal generieren.
TAXII-Feeds aktivieren
- Melden Sie sich unter https://eti.eset.com im ESET Threat Intelligence-Portal an.
- Rufen Sie im Hauptmenü Data Feeds auf.
- Klicken Sie neben dem Datenfeed, den Sie aktivieren möchten, auf das Dreipunkt-Menü.
- Wählen Sie Feed aktivieren aus.
Wiederholen Sie die Schritte 3 bis 4 für jeden Feed, den Sie in Google SecOps aufnehmen möchten.
TAXII-Anmeldedaten generieren
- Rufen Sie im ESET Threat Intelligence-Portal Admin Settings > Access Credentials auf.
- Klicken Sie auf Generate TAXII Credentials (TAXII-Anmeldedaten generieren).
Kopieren und speichern Sie im angezeigten Dialogfeld die folgenden Werte:
- Nutzername: Ihr TAXII-Nutzername
- Passwort: Ihr TAXII-Passwort
TAXII-Feeddetails aufzeichnen
Nachdem Sie Feeds aktiviert und Anmeldedaten generiert haben, notieren Sie sich die folgenden Informationen für jeden Feed, den Sie aufnehmen möchten:
- Rufen Sie im ESET Threat Intelligence-Portal Data Feeds auf.
- Klicken Sie neben einem aktivierten Feed auf das Dreipunkt-Menü .
- Wählen Sie Show Data Feed detail (Details zum Datenfeed anzeigen) aus.
Notieren Sie sich die folgenden Werte in der Seitenleiste:
- TAXII-Feedname: Die Feed-Kennung (z. B.
botnet stix 2.1) - TAXII 2-ID: Die Sammlungs-ID (z. B.
0abb06690b0b47e49cd7794396b76b20) - TAXII 2-Feed-URL: Die vollständige Sammlungs-URL
- TAXII-Feedname: Die Feed-Kennung (z. B.
Verfügbare TAXII-Feeds
ESET Threat Intelligence bietet die folgenden TAXII 2.1-Feeds:
Feedname TAXII-Feedname Sammlungs-ID Android-Infostealer-Feed androidinfostealer stix 2.1 9ee501cde0c44d6db4ae995fead1a7c8 Android-Bedrohungsfeed androidthreats stix 2.1 daf3de8fab144552a1cb5af054ed07ee APT-IoC apt stix 2.1 97e3eb74ae5f46dd9e22f677a6938ee7 Botnet-Feed Botnet STIX 2.1 0abb06690b0b47e49cd7794396b76b20 Botnet – C&C botnet.cc stix 2.1 d1923a526e8f400dbb301259240ee3d5 Botnet – Ziel botnet.target stix 2.1 61b6e4f9153e411ca7a9982a2c6ae788 Feed mit Kryptobetrug cryptoscam stix 2.1 2c183ce9551a43338c6cc2ed7c2a704d Domain-Feed domain stix 2.1 a34aa0a4f9de419582a883863503f9c4 eCrime-IoC-Feed ecrime stix 2.1 08059376eac84ec4a076cfd682493f91 IP-Feed ip stix 2.1 baaed2a92335418aa753fe944e13c23a Schädliche E‑Mail-Anhänge emailattachments stix 2.1 c0d56cf7f81d482eb97fd46beaa4bae0 Feed mit schädlichen Dateien Datei stix 2.1 ee6a153ed77e4ec3ab21e76cc2074b9f Phishing-URL-Feed phishingurl stix 2.1 d0a6c0f962dd4dd2b3eeb96b18612584 Feed mit PUA-Adware-Dateien puaadware stix 2.1 d1bfc81202fc4c6599326771ec2da41d Feed mit Dateien für PUA-Apps mit doppelter Verwendung puadualapps stix 2.1 970a7d0039ac4668addf058cd9feb953 Ransomware-Feed Ransomware STIX 2.1 8d3490d688ce4a989aee9af5c680d8bf Feed mit Betrugs-URLs scamurl stix 2.1 2130adc3c67c43f9a3664b187931375e Smishing-Feed smishing stix 2.1 330ad7d0c736476babe5e49077b96c95 SMS-Betrugsfeed smsscam stix 2.1 6e20217a2e1246b8ab11be29f759f716 URL-Feed url stix 2.1 1d3208c143be49da8130f5a66fd3a0fa
Dienstkonto für die Cloud Run-Funktion erstellen
- Wechseln Sie in der Google Cloud Console zu IAM & Verwaltung > Dienstkonten.
- Klicken Sie auf Dienstkonto erstellen.
Geben Sie die folgenden Konfigurationsdetails an:
- Name des Dienstkontos: Geben Sie
eset-ti-collectorein. - Beschreibung des Dienstkontos: Geben Sie
Service account for ESET Threat Intelligence Cloud Run function to write STIX objects to GCSein.
- Name des Dienstkontos: Geben Sie
Klicken Sie auf Erstellen und fortfahren.
Fügen Sie im Abschnitt Diesem Dienstkonto Zugriff auf das Projekt erteilen die folgenden Rollen hinzu:
- Klicken Sie auf Rolle auswählen, suchen Sie nach Storage-Objekt-Administrator und wählen Sie die Rolle aus.
- Klicken Sie auf Weitere Rolle hinzufügen, suchen Sie nach Cloud Run Invoker und wählen Sie die Rolle aus.
Klicken Sie auf Weiter.
Klicken Sie auf Fertig.
IAM-Berechtigungen für den Google Cloud Storage-Bucket gewähren
- Rufen Sie Cloud Storage > Buckets auf.
- Klicken Sie auf den Namen Ihres Buckets, z. B.
eset-ti-logs. - Wechseln Sie zum Tab Berechtigungen.
- Klicken Sie auf Zugriff erlauben.
Geben Sie die folgenden Konfigurationsdetails an:
- Hauptkonten hinzufügen: Geben Sie die E-Mail-Adresse des Dienstkontos ein (z. B.
eset-ti-collector@PROJECT_ID.iam.gserviceaccount.com). - Rollen zuweisen: Wählen Sie Storage-Objekt-Administrator aus.
- Hauptkonten hinzufügen: Geben Sie die E-Mail-Adresse des Dienstkontos ein (z. B.
Klicken Sie auf Speichern.
Pub/Sub-Thema erstellen
Das Pub/Sub-Thema löst die Cloud Run-Funktion aus, wenn eine Nachricht von Cloud Scheduler veröffentlicht wird.
- Rufen Sie in der Google Cloud Console Pub/Sub > Themen auf.
- Klicken Sie auf Thema erstellen.
- Geben Sie die folgenden Konfigurationsdetails an:
- Themen-ID: Geben Sie
eset-ti-triggerein. - Standardabo hinzufügen: Ausgewählt lassen
- Themen-ID: Geben Sie
- Klicken Sie auf Erstellen.
Cloud Run-Funktion erstellen
- Wechseln Sie in der Google Cloud Console zu Cloud Run-Funktionen.
- Klicken Sie auf Funktion erstellen.
Geben Sie die folgenden Konfigurationsdetails an:
Einstellung Wert Umgebung 2. Generation Funktionsname eset-ti-collectorRegion Wählen Sie dieselbe Region wie für Ihren GCS-Bucket aus. Triggertyp Cloud Pub/Sub Pub/Sub-Thema eset-ti-triggerZugewiesener Arbeitsspeicher 512 MiB Zeitlimit 540 Sekunden Laufzeitdienstkonto eset-ti-collectorKlicken Sie auf Weiter.
Legen Sie als Laufzeit Python 3.12 fest.
Legen Sie
mainals Einstiegspunkt fest.Fügen Sie in der Datei
requirements.txtdie folgenden Abhängigkeiten hinzu:functions-framework==3.* google-cloud-storage==2.* urllib3==2.*Fügen Sie in die Datei
main.pyden folgenden Code ein:import functions_framework import json import os import logging import time import urllib3 from datetime import datetime, timedelta, timezone from google.cloud import storage logger = logging.getLogger(__name__) logger.setLevel(logging.INFO) HTTP = urllib3.PoolManager(retries=False) storage_client = storage.Client() API_ROOT = "https://taxii.eset.com/taxii2/643f4eb5-f8b7-46a3-a606-6d61d5ce223a" TAXII_CONTENT_TYPE = "application/taxii+json;version=2.1" def _load_state(bucket_name: str, state_key: str, lookback_hours: int) -> str: """Return ISO8601 checkpoint (UTC).""" try: bucket = storage_client.bucket(bucket_name) blob = bucket.blob(state_key) if blob.exists(): state_data = blob.download_as_text() state = json.loads(state_data) ts = state.get("last_poll_time") if ts: logger.info(f"Loaded state: {ts}") return ts except Exception as e: logger.warning(f"State read error: {e}") default_ts = ( datetime.now(timezone.utc) - timedelta(hours=lookback_hours) ).strftime("%Y-%m-%dT%H:%M:%S.000Z") logger.info(f"No previous state found, using lookback: {default_ts}") return default_ts def _save_state(bucket_name: str, state_key: str, ts: str) -> None: """Persist the checkpoint to GCS.""" bucket = storage_client.bucket(bucket_name) blob = bucket.blob(state_key) blob.upload_from_string( json.dumps({"last_poll_time": ts}), content_type="application/json", ) logger.info(f"Saved state: {ts}") def _fetch_objects( username: str, password: str, collection_id: str, added_after: str, max_records: int, ) -> list: """Query TAXII 2.1 collection objects with pagination.""" url = f"{API_ROOT}/collections/{collection_id}/objects/" headers = urllib3.make_headers(basic_auth=f"{username}:{password}") headers["Accept"] = TAXII_CONTENT_TYPE headers["User-Agent"] = "Chronicle-ESET-TI-GCS/1.0" all_objects = [] params = {"added_after": added_after} while True: qs = "&".join(f"{k}={v}" for k, v in params.items()) request_url = f"{url}?{qs}" if qs else url for attempt in range(3): try: resp = HTTP.request("GET", request_url, headers=headers) break except Exception as e: wait = 2 ** (attempt + 1) logger.warning(f"Request error: {e}, retrying in {wait}s") time.sleep(wait) else: raise RuntimeError("Exceeded retry budget for TAXII API") if resp.status == 401: raise RuntimeError("Authentication failed: check TAXII credentials") if resp.status == 404: raise RuntimeError( f"Collection not found: {collection_id}" ) if resp.status not in (200, 206): raise RuntimeError( f"TAXII API error {resp.status}: {resp.data[:500]}" ) body = json.loads(resp.data.decode("utf-8")) objects = body.get("objects", []) all_objects.extend(objects) logger.info( f"Fetched {len(objects)} objects (total: {len(all_objects)})" ) if len(all_objects) >= max_records: logger.info(f"Reached max_records limit: {max_records}") all_objects = all_objects[:max_records] break more = body.get("more", False) next_param = body.get("next") if more and next_param: params = {"added_after": added_after, "next": next_param} else: break return all_objects @functions_framework.cloud_event def main(cloud_event): """Cloud Run function entry point triggered by Pub/Sub.""" bucket_name = os.environ["GCS_BUCKET"] prefix = os.environ.get("GCS_PREFIX", "eset-ti") state_key = os.environ.get("STATE_KEY", "eset-ti/state.json") username = os.environ["TAXII_USERNAME"] password = os.environ["TAXII_PASSWORD"] collection_id = os.environ["COLLECTION_ID"] max_records = int(os.environ.get("MAX_RECORDS", "10000")) lookback_hours = int(os.environ.get("LOOKBACK_HOURS", "48")) try: last_poll = _load_state(bucket_name, state_key, lookback_hours) objects = _fetch_objects( username, password, collection_id, last_poll, max_records ) if not objects: logger.info("No new STIX objects found") return "No new objects", 200 now_str = datetime.now(timezone.utc).strftime("%Y%m%d_%H%M%S") blob_path = ( f"{prefix}/eset_ti_{collection_id}_{now_str}.json" ) ndjson_body = "\n".join( json.dumps(obj, separators=(",", ":")) for obj in objects ) bucket = storage_client.bucket(bucket_name) blob = bucket.blob(blob_path) blob.upload_from_string( ndjson_body, content_type="application/x-ndjson" ) new_poll_time = datetime.now(timezone.utc).strftime( "%Y-%m-%dT%H:%M:%S.000Z" ) _save_state(bucket_name, state_key, new_poll_time) msg = ( f"Wrote {len(objects)} STIX objects to " f"gs://{bucket_name}/{blob_path}" ) logger.info(msg) return msg, 200 except Exception as e: logger.error(f"Error collecting ESET TI: {e}") raiseKlicken Sie auf Bereitstellen.
Warten Sie, bis die Funktion bereitgestellt wurde. Wenn die Bereitstellung abgeschlossen ist, ändert sich der Status zu einem grünen Häkchen.
Umgebungsvariablen konfigurieren
- Rufen Sie nach der Bereitstellung der Funktion Cloud Run Functions > eset-ti-collector auf.
- Klicken Sie auf Neue Überarbeitung bearbeiten und bereitstellen.
- Klicken Sie auf den Tab Variablen und Secrets (oder maximieren Sie Laufzeit, Build, Verbindungen und Sicherheitseinstellungen für die 1. Generation).
Fügen Sie die folgenden Umgebungsvariablen hinzu:
Schlüssel Beispielwert GCS_BUCKETeset-ti-logsGCS_PREFIXeset-tiSTATE_KEYeset-ti/state.jsonTAXII_USERNAMEIhr TAXII-Nutzername aus dem ETI-Portal TAXII_PASSWORDIhr TAXII-Passwort aus dem ETI-Portal COLLECTION_ID0abb06690b0b47e49cd7794396b76b20MAX_RECORDS10000LOOKBACK_HOURS48Klicken Sie auf Bereitstellen.
Cloud Scheduler-Job erstellen
Cloud Scheduler veröffentlicht in regelmäßigen Abständen eine Nachricht im Pub/Sub-Thema, wodurch die Cloud Run-Funktion ausgelöst wird, um ESET Threat Intelligence nach neuen STIX-Objekten zu fragen.
- Rufen Sie in der Google Cloud Console Cloud Scheduler auf.
- Klicken Sie auf Job erstellen.
Geben Sie die folgenden Konfigurationsdetails an:
Einstellung Wert Name eset-ti-pollRegion Wählen Sie dieselbe Region wie für Ihre Funktion aus. Frequenz 0 */1 * * *(jede Stunde)Zeitzone Wählen Sie Ihre Zeitzone aus, z. B. UTC.Klicken Sie auf Weiter.
Im Abschnitt Ausführung konfigurieren:
- Zieltyp: Wählen Sie Pub/Sub aus.
- Thema: Wählen Sie
eset-ti-triggeraus. - Nachrichtentext: Geben Sie
{"poll": true}ein.
Klicken Sie auf Erstellen.
Cloud Run-Funktion prüfen
- Suchen Sie in Cloud Scheduler nach dem Job
eset-ti-poll. - Klicken Sie auf Ausführung erzwingen, um eine sofortige Ausführung auszulösen.
- Rufen Sie Cloud Run-Funktionen> „eset-ti-collector“ > „Logs“ auf.
Prüfen Sie, ob die Funktion erfolgreich ausgeführt wurde. Suchen Sie dazu nach Logeinträgen wie:
Fetched 250 objects (total: 250) Wrote 250 STIX objects to gs://eset-ti-logs/eset-ti/eset_ti_0abb06690b0b47e49cd7794396b76b20_20250115_103000.jsonRufen Sie Cloud Storage > Buckets > eset-ti-logs auf.
Rufen Sie das Präfix
eset-ti/auf.Prüfen Sie, ob NDJSON-Dateien mit STIX-Objekten erstellt werden.
Google SecOps-Dienstkonto abrufen und Feed konfigurieren
Google SecOps verwendet ein eindeutiges Dienstkonto, um Daten aus Ihrem GCS-Bucket zu lesen. Sie müssen diesem Dienstkonto Zugriff auf Ihren Bucket gewähren.
E-Mail-Adresse des Dienstkontos abrufen
- Rufen Sie die SIEM-Einstellungen > Feeds auf.
- Klicken Sie auf Neuen Feed hinzufügen.
- Klicken Sie auf Einzelnen Feed konfigurieren.
- Geben Sie im Feld Feedname einen Namen für den Feed ein, z. B.
ESET Threat Intelligence - Botnet. - Wählen Sie Google Cloud Storage V2 als Quelltyp aus.
- Wählen Sie ESET Threat Intelligence als Log type (Protokolltyp) aus.
Klicken Sie auf Dienstkonto abrufen. Es wird eine eindeutige E-Mail-Adresse für das Dienstkonto angezeigt, z. B.:
chronicle-12345678@chronicle-gcp-prod.iam.gserviceaccount.comKopieren Sie diese E‑Mail-Adresse für den nächsten Schritt.
Klicken Sie auf Weiter.
Geben Sie Werte für die folgenden Eingabeparameter an:
Storage-Bucket-URL: Geben Sie den GCS-Bucket-URI mit dem Präfixpfad ein:
gs://eset-ti-logs/eset-ti/Option zum Löschen der Quelle: Wählen Sie die gewünschte Löschoption aus:
- Nie: Es werden niemals Dateien nach Übertragungen gelöscht (empfohlen für Tests).
- Übertragene Dateien löschen: Dateien werden nach der erfolgreichen Übertragung gelöscht.
Übertragene Dateien und leere Verzeichnisse löschen: Löscht Dateien und leere Verzeichnisse nach der erfolgreichen Übertragung.
Maximales Dateialter: Dateien einschließen, die in den letzten Tagen geändert wurden (Standard ist 180 Tage)
Asset-Namespace: Der Asset-Namespace
Labels für Datenaufnahme: Das Label, das auf die Ereignisse aus diesem Feed angewendet werden soll (z. B.
ESET_IOC)
Klicken Sie auf Weiter.
Prüfen Sie die neue Feedkonfiguration auf dem Bildschirm Abschließen und klicken Sie dann auf Senden.
Dem Google SecOps-Dienstkonto IAM-Berechtigungen gewähren
Das Google SecOps-Dienstkonto benötigt die Rolle Storage Object Viewer für Ihren Google Cloud Storage-Bucket.
- Rufen Sie Cloud Storage > Buckets auf.
- Klicken Sie auf den Namen Ihres Buckets, z. B.
eset-ti-logs. - Wechseln Sie zum Tab Berechtigungen.
- Klicken Sie auf Zugriff erlauben.
- Geben Sie die folgenden Konfigurationsdetails an:
- Hauptkonten hinzufügen: Fügen Sie die E‑Mail-Adresse des Google SecOps-Dienstkontos ein.
- Rollen zuweisen: Wählen Sie Storage-Objekt-Betrachter aus.
Klicken Sie auf Speichern.
UDM-Zuordnungstabelle
| Logfeld | UDM-Zuordnung | Logik |
|---|---|---|
| Wann? | metadata.event_timestamp | Zeitstempel des Ereignisses |
| metadata.event_type | Ereignistyp (z. B. USER_LOGIN, NETWORK_CONNECTION) | |
| messageid | metadata.id | Eindeutige Kennung für das Ereignis |
| Protokoll | network.ip_protocol | IP-Protokoll (z. B. TCP, UDP) |
| deviceName | principal.hostname | Quellhostname |
| srcAddr | principal.ip | Quell-IP-Adresse der Verbindung |
| srcPort | principal.port | Quellportnummer |
| Aktion | security_result.action | Vom Sicherheitsprodukt ergriffene Maßnahme (z. B. ALLOW, BLOCK) |
| dstAddr | target.ip | IP-Adresse des Ziels |
| dstPort | target.port | Zielportnummer |
| metadata.product_name | Produktname | |
| metadata.vendor_name | Name des Anbieters/Unternehmens |
Benötigen Sie weitere Hilfe? Antworten von Community-Mitgliedern und Google SecOps-Experten erhalten