Group-IB Threat Intelligence-Logs erfassen

Unterstützt in:

In diesem Dokument wird beschrieben, wie Sie Group-IB Threat Intelligence-Logs mit Google Cloud Storage in Google Security Operations aufnehmen.

Group-IB Threat Intelligence & Attribution (TI&A) ist eine Plattform für Cyber-Threat Intelligence, die Echtzeitdaten zu Bedrohungsakteuren, Indikatoren für Kompromittierung (Indicators of Compromise, IOCs), Malware, Command-and-Control-Infrastruktur (C2), kompromittierten Anmeldedaten, Phishing-Kampagnen und Sicherheitslücken bietet. Es werden Informationen aus Quellen im öffentlich zugänglichen Internet, Deep Web und Darknet zusammengeführt, damit Sicherheitsteams Bedrohungen proaktiv erkennen und darauf reagieren können.

Hinweis

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

  • Eine Google SecOps-Instanz
  • Ein Group-IB TI&A-Konto mit aktiviertem API-Zugriff
  • Zugriff auf das Group-IB TI&A-Portal (tap.group-ib.com)
  • Ein Google Cloud-Projekt mit den folgenden aktivierten APIs:
    • Cloud Storage API
    • Cloud Functions API
    • Cloud Scheduler API
    • Cloud Build API

Group-IB-API-Schlüssel generieren

  1. Melden Sie sich im Group-IB TI&A-Portal unter https://tap.group-ib.com an.
  2. Klicken Sie oben rechts auf Ihren Namen und wählen Sie Profil aus.
  3. Klicken Sie auf Go to my settings (Zu meinen Einstellungen).
  4. Rufen Sie den Tab Sicherheit und Zugriff auf.
  5. Klicken Sie im Abschnitt Persönliches Token auf Neues Token generieren.
  6. Kopieren und speichern Sie den API-Schlüssel sicher.

Google Cloud Storage-Bucket erstellen

  1. Gehen Sie zur 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. groupib-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)
  6. Klicken Sie auf Erstellen.

Cloud Functions-Funktion zum Abrufen von Group-IB-Daten bereitstellen

Erstellen Sie eine Cloud Function, die Threat Intelligence-Daten aus der Group-IB TI&A API abruft und als NDJSON-Dateien in den GCS-Bucket schreibt, damit Google SecOps sie aufnehmen kann.

Cloud Functions-Funktion erstellen

  1. Gehen Sie zur Google Cloud Console.
  2. Rufen Sie Cloud Functions auf.
  3. Klicken Sie auf Funktion erstellen.
  4. Geben Sie die folgenden Konfigurationsdetails an:

    Einstellung Wert
    Umgebung 2. Generation
    Funktionsname groupib-to-gcs
    Region Wählen Sie die Region aus, die Ihrem GCS-Bucket am nächsten ist.
    Triggertyp HTTPS
    Authentifizierung Authentifizierung anfordern
    Zugewiesener Arbeitsspeicher 512 MB (erhöhen, wenn große Sammlungen abgerufen werden)
    Zeitlimit 540 Sekunden
  5. Klicken Sie auf Weiter.

  6. Legen Sie die Laufzeit auf Python 3.11 oder höher fest.

  7. Legen Sie den Einstiegspunkt auf main fest.

  8. Ersetzen Sie den Inhalt von main.py durch den folgenden Code:

    import json
    import os
    import requests
    import functions_framework
    from datetime import datetime, timedelta, timezone
    from urllib.parse import urljoin
    from requests.auth import HTTPBasicAuth
    from google.cloud import storage
    
    GIB_API_URL = os.environ.get('GIB_API_URL', 'https://tap.group-ib.com/api/v2/')
    GIB_USERNAME = os.environ.get('GIB_USERNAME')
    GIB_API_KEY = os.environ.get('GIB_API_KEY')
    GCS_BUCKET = os.environ.get('GCS_BUCKET')
    GCS_PREFIX = os.environ.get('GCS_PREFIX', 'groupib-ti')
    COLLECTIONS = os.environ.get('GIB_COLLECTIONS', 'compromised/account,malware/cnc,apt/threat,hi/threat').split(',')
    DEFAULT_DAYS_BACK = int(os.environ.get('DEFAULT_DAYS_BACK', '3'))
    
    # Max items per request: 100 for most collections, 20 for apt/threat and hi/threat
    BIG_DATA_COLLECTIONS = ['apt/threat', 'hi/threat']
    
    # File to persist seqUpdate values between runs (use GCS for durability)
    STATE_BLOB = '_state/seq_updates.json'
    
    def load_state():
        """Load seqUpdate state from GCS."""
        client = storage.Client()
        bucket = client.bucket(GCS_BUCKET)
        blob = bucket.blob(f"{GCS_PREFIX}/{STATE_BLOB}")
        if blob.exists():
            return json.loads(blob.download_as_text())
        return {}
    
    def save_state(state):
        """Save seqUpdate state to GCS."""
        client = storage.Client()
        bucket = client.bucket(GCS_BUCKET)
        blob = bucket.blob(f"{GCS_PREFIX}/{STATE_BLOB}")
        blob.upload_from_string(json.dumps(state), content_type='application/json')
    
    def gib_request(session, url, params=None):
        """Send authenticated GET request to Group-IB API."""
        resp = session.get(url, params=params)
        if resp.status_code == 301:
            raise Exception('IP not whitelisted by Group-IB. Contact Group-IB support.')
        resp.raise_for_status()
        return resp.json()
    
    def get_seq_update_by_date(session, collection, date_str):
        """Get seqUpdate value for a collection starting from a given date."""
        url = urljoin(GIB_API_URL, 'sequence_list')
        data = gib_request(session, url, {'date': date_str, 'collection': collection})
        return data.get('list', {}).get(collection)
    
    def fetch_collection(session, collection, seq_update):
        """Fetch all new items from a collection starting after the given seqUpdate."""
        limit = 20 if collection in BIG_DATA_COLLECTIONS else 100
        url = urljoin(GIB_API_URL, f"{collection}/updated")
        all_items = []
        last_seq = seq_update
    
        while True:
            data = gib_request(session, url, {'seqUpdate': str(last_seq), 'limit': limit})
            items = data.get('items', [])
            if not items:
                break
            all_items.extend(items)
            last_seq = items[-1].get('seqUpdate')
    
        return all_items, last_seq
    
    def write_to_gcs(items, collection_name):
        """Write items to GCS as NDJSON."""
        if not items:
            return 0
        client = storage.Client()
        bucket = client.bucket(GCS_BUCKET)
        timestamp = datetime.now(timezone.utc).strftime('%Y%m%d_%H%M%S')
        safe_name = collection_name.replace('/', '_')
        blob_path = f"{GCS_PREFIX}/{safe_name}_{timestamp}.ndjson"
        blob = bucket.blob(blob_path)
        ndjson = '\n'.join(json.dumps(item, ensure_ascii=False) for item in items) + '\n'
        blob.upload_from_string(ndjson, content_type='application/x-ndjson')
        return len(items)
    
    @functions_framework.http
    def main(request):
        """Cloud Function entry point."""
        session = requests.Session()
        session.auth = HTTPBasicAuth(GIB_USERNAME, GIB_API_KEY)
        session.headers.update({'Accept': '*/*'})
    
        state = load_state()
        total = 0
    
        for collection in COLLECTIONS:
            collection = collection.strip()
            seq_update = state.get(collection)
    
            if seq_update is None:
                default_date = (datetime.now(timezone.utc) - timedelta(days=DEFAULT_DAYS_BACK)).strftime('%Y-%m-%d')
                seq_update = get_seq_update_by_date(session, collection, default_date)
                if seq_update is None:
                    continue
    
            items, last_seq = fetch_collection(session, collection, seq_update)
            if items:
                write_to_gcs(items, collection)
                total += len(items)
            state[collection] = last_seq
    
        save_state(state)
        return json.dumps({'status': 'success', 'total_items': total}), 200
    
  9. Ersetzen Sie den Inhalt von requirements.txt durch die folgenden Abhängigkeiten:

    functions-framework==3.*
    requests>=2.28.0
    google-cloud-storage>=2.0.0
    
  10. Klicken Sie auf Bereitstellen.

Umgebungsvariablen konfigurieren

  1. Rufen Sie nach der Bereitstellung die Detailseite Ihrer Funktion auf.
  2. Klicken Sie auf Bearbeiten.
  3. Maximieren Sie den Abschnitt Laufzeit, Build, Verbindungen und Sicherheitseinstellungen.
  4. Fügen Sie unter Umgebungsvariablen der Laufzeit die folgenden Variablen hinzu:

    Variable Wert
    GIB_API_URL https://tap.group-ib.com/api/v2/ (oder https://bt.group-ib.com/api/v2/, je nach Region)
    GIB_USERNAME E-Mail-Adresse Ihres Group-IB-Kontos
    GIB_API_KEY Ihr Group-IB-API-Schlüssel (persönliches Token)
    GCS_BUCKET Name Ihres GCS-Buckets (z. B. groupib-ti-logs)
    GCS_PREFIX Präfix für Logdateien (z. B. groupib-ti)
    GIB_COLLECTIONS Durch Kommas getrennte Liste der abzurufenden Sammlungen (siehe unten)
    DEFAULT_DAYS_BACK Anzahl der Tage, die beim ersten Lauf berücksichtigt werden sollen (Standard: 3)
  5. Klicken Sie auf Bereitstellen.

Verfügbare Group-IB-Sammlungen

Konfigurieren Sie die Variable GIB_COLLECTIONS mit den für Ihren Anwendungsfall relevanten Sammlungen:

Sammlung Beschreibung Limit
compromised/account Gehackte Kontozugangsdaten (Anmeldung, Passwort, Domain) 100
compromised/card Gehackte Bankkarten 100
compromised/mule Konten von Finanzagenten („Money Mules“) 100
compromised/imei IMEIs von manipulierten Mobilgeräten 100
compromised/file Kompromittierte Dateien mit Malware-Attribution 100
attacks/ddos DDoS-Angriffsdaten (Ziel-IPs, Domains) 100
attacks/deface Vorfälle von Website-Manipulation 100
attacks/phishing Phishing-URLs und ‑Domains 100
attacks/phishing_kit Hashes von Phishing-Kits und Zielmarken 100
bp/phishing Markenschutz – Phishing-Vorfälle 100
bp/phishing_kit Markenschutz – Phishing-Kits 100
hi/threat Berichte zu Cyberkriminellen (HI) mit IOCs und MITRE ATT&CK-Zuordnung 20
hi/threat_actor Profile von Cyberkriminellen 100
apt/threat APT-Berichte (staatliche Akteure) mit IOCs und MITRE ATT&CK-Zuordnung 20
apt/threat_actor APT-Angreiferprofile 100
malware/cnc Indikatoren für Command-and-Control-Server (IPs, Domains) 100
malware/malware Malware-Beschreibungen und Gefahrenstufen 100
malware/targeted_malware Gezielte Malware-Beispiele (Hashes, Dateinamen) 100
osi/git_leak Datenlecks in Git-Repositorys 100
osi/public_leak Öffentliche Datenlecks (Pastes, Dumps) 100
osi/vulnerability Sicherheitslückendaten mit CVSS-Werten 100
suspicious_ip/tor_node IP-Adressen von Tor-Exit-Knoten 100
suspicious_ip/open_proxy IP-Adressen von offenen Proxys 100
suspicious_ip/socks_proxy SOCKS-Proxy-IP-Adressen 100
  • Beispiel: So erfassen Sie kompromittierte Anmeldedaten, C2-Infrastruktur und APT-Daten:

    compromised/account,malware/cnc,apt/threat,hi/threat
    

Cloud Functions-Funktion planen

Verwenden Sie Cloud Scheduler, um die Funktion in regelmäßigen Abständen auszulösen.

  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 groupib-to-gcs-schedule
    Region Dieselbe Region wie Ihre Cloud Functions-Funktion
    Frequenz 0 */1 * * * (stündlich) oder 0 0 * * * (täglich)
    Zeitzone Zeitzone auswählen
  4. Unter Ausführung konfigurieren:

    • Zieltyp: Wählen Sie HTTP aus.
    • URL: Geben Sie Cloud Function-Trigger-URL ein.
    • HTTP-Methode: Wählen Sie POST aus.
    • Auth-Header: Wählen Sie OIDC-Token hinzufügen aus.
    • Dienstkonto: Wählen Sie ein Dienstkonto mit der Berechtigung roles/cloudfunctions.invoker aus.
  5. Klicken Sie auf Erstellen.

Datenexport testen

  1. Klicken Sie in der Cloud Scheduler-Konsole neben Ihrem Job auf Ausführung erzwingen, um die Funktion manuell auszulösen.
  2. Prüfen Sie Cloud Function-Logs in Cloud Logging, um zu bestätigen, dass Daten von Group-IB abgerufen wurden.
  3. Rufen Sie in der Google Cloud Console Cloud Storage > Buckets auf.
  4. Klicken Sie auf den Namen Ihres Buckets, z. B. groupib-ti-logs.
  5. Rufen Sie den Präfixordner auf (z. B. groupib-ti/).
  6. Prüfen Sie, ob neue .ndjson-Dateien im Bucket angezeigt werden.

Google SecOps-Dienstkonto abrufen

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 SIEM-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. Group-IB Threat Intelligence.
  5. Wählen Sie Google Cloud Storage V2 als Quelltyp aus.
  6. Wählen Sie Group-IB Threat Intelligence als Logtyp aus.
  7. 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.com
    
  8. Kopieren Sie diese E-Mail-Adresse für den nächsten Schritt.

Dem Google SecOps-Dienstkonto IAM-Berechtigungen gewähren

Das Google SecOps-Dienstkonto benötigt die Rolle Storage-Objekt-Betrachter für Ihren GCS-Bucket.

  1. Rufen Sie Cloud Storage > Buckets auf.
  2. Klicken Sie auf den Namen Ihres Buckets, z. B. groupib-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-Objekt-Betrachter aus.
  6. Klicken Sie auf Speichern.

Feed in Google SecOps konfigurieren, um Group-IB Threat Intelligence-Logs aufzunehmen

  1. Rufen Sie die SIEM-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. Group-IB Threat Intelligence.
  5. Wählen Sie Google Cloud Storage V2 als Quelltyp aus.
  6. Wählen Sie Group-IB Threat Intelligence als Logtyp aus.
  7. Klicken Sie auf Weiter.
  8. Geben Sie Werte für die folgenden Eingabeparameter an:

    • Storage-Bucket-URL: Geben Sie den GCS-Bucket-URI mit dem Präfixpfad ein:

      gs://groupib-ti-logs/groupib-ti/
      

      Ersetzen Sie:

      • groupib-ti-logs: Der Name Ihres GCS-Buckets.
      • groupib-ti: Das Präfix bzw. der Ordnerpfad, in dem Logs gespeichert werden.
    • Option zum Löschen der Quelle: Wählen Sie die gewünschte Option zum Löschen aus:

      • Nie: Es werden niemals Dateien nach Übertragungen gelöscht (empfohlen für Tests).
      • Übertragene Dateien löschen: Löscht Dateien nach der erfolgreichen Übertragung.
      • Übertragene Dateien und leere Verzeichnisse löschen: Dateien und leere Verzeichnisse werden nach der erfolgreichen Übertragung gelöscht.
    • Maximales Dateialter: Dateien einschließen, die in den letzten Tagen geändert wurden. Der Standardwert ist 180 Tage.

    • Asset-Namespace: Der Asset-Namespace.

    • Aufnahmelabels: Das Label, das auf die Ereignisse aus diesem Feed angewendet werden soll.

  9. Klicken Sie auf Weiter.

  10. Prüfen Sie die neue Feedkonfiguration auf dem Bildschirm Abschließen und klicken Sie dann auf Senden.

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