ESET Threat Intelligence-Protokolle erfassen

Parserversion: 1.0

Unterstützt in:

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 eine Bedrohung für Ihre Organisation oder Ihre Kunden darstellen könnten. Der Dienst liefert Threat Intelligence-Daten über TAXII 2.1-Feeds im STIX 2.1-Format, einschließlich APT-IoCs, Botnet-C&C und -Zielen, schädlichen Domains, IP-Adressen, URLs, Dateien, Phishing-URLs, Ransomware und Android-Bedrohungen.

Hinweis

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

  1. Öffnen Sie die Google Cloud Console.
  2. Wählen Sie Ihr Projekt aus oder erstellen Sie ein neues.
  3. Rufen Sie im Navigationsmenü Cloud Storage > Buckets auf.
  4. Klicken Sie auf Bucket erstellen.
  5. 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 die Option, die am besten zu Ihren Anforderungen passt (Region, Dual-Region, Multi-Region).
    Standort Wählen Sie den Standort aus (z. B. us-central1).
    Speicherklasse Standard (empfohlen für Logs, auf die häufig zugegriffen wird)
    Zugriffssteuerung Einheitlich (empfohlen)
    Schutztools Optional: Objektversionsverwaltung oder Aufbewahrungsrichtlinie aktivieren
  6. 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 im ETI-Portal generieren.

TAXII-Feeds aktivieren

  1. Melden Sie sich unter https://eti.eset.com im ESET Threat Intelligence-Portal an.
  2. Rufen Sie im Hauptmenü Datenfeeds auf.
  3. Klicken Sie neben dem Datenfeed, den Sie aktivieren möchten, auf das Dreipunkt-Menü.
  4. Wählen Sie Feed aktivieren aus.
  5. Wiederholen Sie die Schritte 3 und 4 für jeden Feed, den Sie in Google SecOps aufnehmen möchten.

TAXII-Anmeldedaten generieren

  1. Rufen Sie im ESET Threat Intelligence-Portal Admin Settings > Access Credentials auf.
  2. Klicken Sie auf Generate TAXII Credentials (TAXII-Anmeldedaten generieren).
  3. Kopieren und speichern Sie im angezeigten Dialogfeld die folgenden Werte:

    • Nutzername: Ihr TAXII-Nutzername
    • Passwort: Ihr TAXII-Passwort

TAXII-Feeddetails aufzeichnen

Notieren Sie sich nach dem Aktivieren der Aktivitätsfeeds und dem Generieren der Anmeldedaten die folgenden Informationen für jeden Feed, den Sie aufnehmen möchten:

  1. Rufen Sie im ESET Threat Intelligence-Portal Datenfeeds auf.
  2. Klicken Sie neben einem aktivierten Feed auf das Dreipunkt-Menü.
  3. Wählen Sie Datenfeed-Details anzeigen aus.
  4. Beachten Sie die folgenden Werte in der Seitenleiste:

    • TAXII-Feedname: Die Feed-ID (z. B. botnet stix 2.1)
    • TAXII 2-ID: Die Sammlungs-ID (z. B. 0abb06690b0b47e49cd7794396b76b20)
    • TAXII 2-Feed-URL: Die vollständige URL der Sammlung

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
    Kryptobetrug-Feed 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 file 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 von Dual-Use-Apps, die als PUA eingestuft wurden puadualapps stix 2.1 970a7d0039ac4668addf058cd9feb953
    Ransomware-Feed ransomware stix 2.1 8d3490d688ce4a989aee9af5c680d8bf
    Feed mit betrügerischen 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

  1. Rufen Sie in der Google Cloud Console die Seite IAM und Verwaltung > Dienstkonten auf.
  2. Klicken Sie auf Dienstkonto erstellen.
  3. Geben Sie die folgenden Konfigurationsdetails an:

    • Name des Dienstkontos: Geben Sie eset-ti-collector ein.
    • Beschreibung des Dienstkontos: Geben Sie Service account for ESET Threat Intelligence Cloud Run function to write STIX objects to GCS ein.
  4. Klicken Sie auf Erstellen und fortfahren.

  5. Fügen Sie im Abschnitt Diesem Dienstkonto Zugriff auf das Projekt erteilen die folgenden Rollen hinzu:

    1. Klicken Sie auf Rolle auswählen, suchen Sie nach Storage Object Admin und wählen Sie die Rolle aus.
    2. Klicken Sie auf Weitere Rolle hinzufügen, suchen Sie nach Cloud Run Invoker und wählen Sie die Rolle aus.
  6. Klicken Sie auf Weiter.

  7. Klicken Sie auf Fertig.

IAM-Berechtigungen für den Google Cloud Storage-Bucket gewähren

  1. Rufen Sie Cloud Storage > Buckets auf.
  2. Klicken Sie auf den Namen Ihres Buckets (z. B. eset-ti-logs).
  3. Wechseln Sie zum Tab Berechtigungen.
  4. Klicken Sie auf Zugriff erlauben.
  5. 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.
  6. 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.

  1. Rufen Sie in der Google Cloud Console Pub/Sub > Themen auf.
  2. Klicken Sie auf Thema erstellen.
  3. Geben Sie die folgenden Konfigurationsdetails an:
    • Themen-ID: Geben Sie eset-ti-trigger ein.
    • Standardabo hinzufügen: Lassen Sie diese Option ausgewählt.
  4. Klicken Sie auf Erstellen.

Cloud Run-Funktion erstellen

  1. Rufen Sie in der Google Cloud Console die Seite Cloud Run-Funktionen auf.
  2. Klicken Sie auf Funktion erstellen.
  3. Geben Sie die folgenden Konfigurationsdetails an:

    Einstellung Wert
    Umgebung 2. Generation
    Name der Funktion eset-ti-collector
    Region Wählen Sie dieselbe Region wie für Ihren GCS-Bucket aus.
    Triggertyp Cloud Pub/Sub
    Pub/Sub-Thema eset-ti-trigger
    Zugewiesener Arbeitsspeicher 512 MiB
    Zeitlimit 540 Sekunden
    Laufzeitdienstkonto eset-ti-collector
  4. Klicken Sie auf Weiter.

  5. Legen Sie als Laufzeit Python 3.12 fest.

  6. Legen Sie für Einstiegspunkt den Wert main fest.

  7. Fügen Sie in der Datei requirements.txt die folgenden Abhängigkeiten hinzu:

    functions-framework==3.*
    google-cloud-storage==2.*
    urllib3==2.*
    
  8. Fügen Sie in der Datei main.py den 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}")
            raise
    
  9. Klicken Sie auf Bereitstellen.

  10. Warten Sie, bis die Funktion bereitgestellt wurde. Wenn die Bereitstellung abgeschlossen ist, wird ein grünes Häkchen angezeigt.

Umgebungsvariablen konfigurieren

  1. Nachdem die Funktion bereitgestellt wurde, rufen Sie Cloud Run-Funktionen > eset-ti-collector auf.
  2. Klicken Sie auf Neue Überarbeitung bearbeiten und bereitstellen.
  3. Klicken Sie auf den Tab Variablen und Secrets (oder maximieren Sie Laufzeit, Build, Verbindungen und Sicherheitseinstellungen für die 1. Generation).
  4. Fügen Sie die folgenden Umgebungsvariablen hinzu:

    Schlüssel Beispielwert
    GCS_BUCKET eset-ti-logs
    GCS_PREFIX eset-ti
    STATE_KEY eset-ti/state.json
    TAXII_USERNAME Ihr TAXII-Nutzername aus dem ETI-Portal
    TAXII_PASSWORD Ihr TAXII-Passwort aus dem ETI-Portal
    COLLECTION_ID 0abb06690b0b47e49cd7794396b76b20
    MAX_RECORDS 10000
    LOOKBACK_HOURS 48
  5. Klicken Sie auf Bereitstellen.

Cloud Scheduler-Job erstellen

Cloud Scheduler veröffentlicht nach einem Zeitplan eine Nachricht im Pub/Sub-Thema, wodurch die Cloud Run-Funktion ausgelöst wird, um ESET Threat Intelligence nach neuen STIX-Objekten abzufragen.

  1. Rufen Sie in der Google Cloud Console Cloud Scheduler auf.
  2. Klicken Sie auf Job erstellen.
  3. Geben Sie die folgenden Konfigurationsdetails an:

    Einstellung Wert
    Name eset-ti-poll
    Region 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).
  4. Klicken Sie auf Weiter.

  5. Im Abschnitt Ausführung konfigurieren:

    • Zieltyp: Wählen Sie Pub/Sub aus.
    • Thema: Wählen Sie eset-ti-trigger aus.
    • Inhalt der Nachricht: Geben Sie {"poll": true} ein.
  6. Klicken Sie auf Erstellen.

Cloud Run-Funktion prüfen

  1. Suchen Sie in Cloud Scheduler nach dem Job eset-ti-poll.
  2. Klicken Sie auf Ausführung erzwingen, um eine sofortige Ausführung auszulösen.
  3. Rufen Sie Cloud Run-Funktionen > eset-ti-collector > Logs auf.
  4. 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.json
    
  5. Rufen Sie Cloud Storage > Buckets > eset-ti-logs auf.

  6. Rufen Sie das Präfix eset-ti/ auf.

  7. 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

  1. Rufen Sie die Einstellungen > Datenverwaltung > Feeds auf. Wenn Sie eine reine SIEM-Plattform verwenden, rufen Sie die Einstellungen > Feeds auf.
  2. Klicken Sie auf Neuen Feed hinzufügen.
  3. Klicken Sie auf Einzelnen Feed konfigurieren.
  4. Geben Sie im Feld Feedname einen Namen für den Feed ein, z. B. ESET Threat Intelligence - Botnet.
  5. Wählen Sie Google Cloud Storage V2 als Quelltyp aus.
  6. Wählen Sie ESET Threat Intelligence als Protokolltyp aus.
  7. Klicken Sie auf Dienstkonto abrufen. Eine eindeutige E-Mail-Adresse für das Dienstkonto wird angezeigt, z. B.:

    chronicle-12345678@chronicle-gcp-prod.iam.gserviceaccount.com
    
  8. Kopieren Sie diese E-Mail-Adresse, um sie im nächsten Schritt zu verwenden.

  9. Klicken Sie auf Weiter.

  10. 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: Nach Übertragungen werden keine Dateien gelöscht (empfohlen für Tests).
      • Übertragene Dateien löschen: Dateien werden nach erfolgreicher Übertragung gelöscht.
      • Übertragene Dateien und leere Verzeichnisse löschen: Dateien und leere Verzeichnisse werden nach erfolgreicher Übertragung gelöscht.

    • Maximales Dateialter: Dateien einschließen, die in den letzten Tagen geändert wurden (Standardwert: 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)

  11. Klicken Sie auf Weiter.

  12. 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-Objekt-Betrachter für Ihren Google Cloud Storage-Bucket.

  1. Rufen Sie Cloud Storage > Buckets auf.
  2. Klicken Sie auf den Namen Ihres Buckets (z. B. eset-ti-logs).
  3. Wechseln Sie zum Tab Berechtigungen.
  4. Klicken Sie auf Zugriff erlauben.
  5. 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 Object Viewer aus.
  6. 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 Hostname der Quelle
srcAddr principal.ip Quell-IP-Adresse der Verbindung
srcPort principal.port Quellportnummer
Aktion security_result.action Vom Sicherheitsprodukt ausgeführte Aktion (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
metadata.product_name ESET_IOC Aus Änderungsprotokoll zugeordnet
confidence event.ioc.raw_severity Aus Änderungsprotokoll zugeordnet

Änderungsprotokoll

Änderungsprotokoll für diesen Parser ansehen

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