Raccogli i log di Group-IB Threat Intelligence

Supportato in:

Questo documento spiega come importare i log di Group-IB Threat Intelligence in Google Security Operations utilizzando Google Cloud Storage.

Group-IB Threat Intelligence & Attribution (TI&A) è una piattaforma di cyber threat intelligence che fornisce dati in tempo reale su autori delle minacce, indicatori di compromissione (IOC), malware, infrastruttura command-and-control (C2), credenziali compromesse, campagne di phishing e vulnerabilità. Aggrega l'intelligence proveniente da fonti open web, deep web e dark web, consentendo ai team di sicurezza di rilevare e rispondere alle minacce in modo proattivo.

Prima di iniziare

Assicurati di soddisfare i seguenti prerequisiti:

  • Un'istanza Google SecOps
  • Un account Group-IB TI&A con accesso API abilitato
  • Accesso al portale Group-IB TI&A (tap.group-ib.com)
  • Un progetto Google Cloud con le seguenti API abilitate:
    • API Storage Cloud
    • API Cloud Functions
    • API Cloud Scheduler
    • API Cloud Build

Generare la chiave API Group-IB

  1. Accedi al portale Group-IB TI&A all'indirizzo https://tap.group-ib.com.
  2. Fai clic sul tuo nome nell'angolo in alto a destra e seleziona Profilo.
  3. Fai clic su Vai alle mie impostazioni.
  4. Vai alla scheda Sicurezza e accesso.
  5. Nella sezione Token personale, fai clic su Genera nuovo token.
  6. Copia e salva in modo sicuro la chiave API.

Crea un bucket Google Cloud Storage

  1. Vai alla console Google Cloud.
  2. Seleziona il tuo progetto o creane uno nuovo.
  3. Nel menu di navigazione, vai a Cloud Storage > Bucket.
  4. Fai clic su Crea bucket.
  5. Fornisci i seguenti dettagli di configurazione:

    Impostazione Valore
    Assegna un nome al bucket Inserisci un nome univoco globale (ad esempio groupib-ti-logs).
    Tipo di località Scegli in base alle tue esigenze (regione singola, a due regioni, multiregionale)
    Località Seleziona la posizione (ad esempio, us-central1).
    Classe di archiviazione Standard (consigliato per i log a cui si accede di frequente)
    Controllo dell'accesso Uniforme (consigliato)
  6. Fai clic su Crea.

Esegui il deployment di Cloud Functions per estrarre i dati di Group-IB

Crea una Cloud Function che estrae i dati di threat intelligence dall'API Group-IB TI&A e li scrive nel bucket GCS come file NDJSON per l'acquisizione da parte di Google SecOps.

Crea la Cloud Function

  1. Vai alla console Google Cloud.
  2. Vai a Cloud Functions.
  3. Fai clic su Crea funzione.
  4. Fornisci i seguenti dettagli di configurazione:

    Impostazione Valore
    Ambiente 2ª gen.
    Nome della funzione groupib-to-gcs
    Regione Seleziona la regione più vicina al tuo bucket GCS
    Tipo di attivatore HTTPS
    Autenticazione Richiedi autenticazione
    Memoria allocata 512 MB (aumenta se recuperi raccolte di grandi dimensioni)
    Timeout 540 secondi
  5. Fai clic su Avanti.

  6. Imposta Runtime su Python 3.11 (o versioni successive).

  7. Imposta Punto di ingresso su main.

  8. Sostituisci i contenuti di main.py con il seguente codice:

    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. Sostituisci i contenuti di requirements.txt con le seguenti dipendenze:

    functions-framework==3.*
    requests>=2.28.0
    google-cloud-storage>=2.0.0
    
  10. Fai clic su Esegui il deployment.

Configura le variabili di ambiente

  1. Dopo il deployment, vai alla pagina dei dettagli della funzione.
  2. Fai clic su Modifica.
  3. Espandi la sezione Impostazioni di runtime, build, connessioni e sicurezza.
  4. In Variabili di ambiente runtime, aggiungi le seguenti variabili:

    Variabile Valore
    GIB_API_URL https://tap.group-ib.com/api/v2/ (o https://bt.group-ib.com/api/v2/ a seconda della regione)
    GIB_USERNAME Il tuo indirizzo email dell'account Group-IB
    GIB_API_KEY La tua chiave API Group-IB (token personale)
    GCS_BUCKET Il nome del bucket GCS (ad esempio, groupib-ti-logs)
    GCS_PREFIX Prefisso per i file di log (ad esempio groupib-ti)
    GIB_COLLECTIONS Elenco separato da virgole delle raccolte da recuperare (vedi sotto)
    DEFAULT_DAYS_BACK Numero di giorni da considerare nella prima esecuzione (valore predefinito: 3)
  5. Fai clic su Esegui il deployment.

Raccolte Group-IB disponibili

Configura la variabile GIB_COLLECTIONS con le raccolte pertinenti al tuo caso d'uso:

Raccolta Descrizione Limite massimo
compromised/account Credenziali dell'account compromesse (login, password, dominio) 100
compromised/card Carte bancarie compromesse 100
compromised/mule Account money mule 100
compromised/imei IMEI di dispositivi mobili compromessi 100
compromised/file File compromessi con attribuzione del malware 100
attacks/ddos Dati degli attacchi DDoS (IP di destinazione, domini) 100
attacks/deface Incidenti di alterazione del sito web 100
attacks/phishing URL e domini di phishing 100
attacks/phishing_kit Hash del kit di phishing e brand target 100
bp/phishing Protezione del brand: incidenti di phishing 100
bp/phishing_kit Protezione del brand: kit di phishing 100
hi/threat Report sulle minacce di criminali informatici (HI) con indicatori di compromissione e mappatura MITRE ATT&CK 20
hi/threat_actor Profili degli autori delle minacce informatiche 100
apt/threat Report sulle minacce APT (statali) con IOC e mappatura MITRE ATT&CK 20
apt/threat_actor Profili degli attori delle minacce APT 100
malware/cnc Indicatori del server di comando e controllo (IP, domini) 100
malware/malware Descrizioni dei malware e livelli di minaccia 100
malware/targeted_malware Campioni di malware mirati (hash, nomi file) 100
osi/git_leak Fughe di dati del repository Git 100
osi/public_leak Fughe di dati pubblici (paste, dump) 100
osi/vulnerability Dati sulle vulnerabilità con punteggi CVSS 100
suspicious_ip/tor_node Indirizzi IP dei nodi di uscita Tor 100
suspicious_ip/open_proxy Indirizzi IP proxy aperti 100
suspicious_ip/socks_proxy Indirizzi IP del proxy SOCKS 100
  • Esempio: per raccogliere credenziali compromesse, infrastruttura C2 e dati APT:

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

Pianifica la Cloud Function

Utilizza Cloud Scheduler per attivare la funzione a intervalli regolari.

  1. Vai a Cloud Scheduler nella Google Cloud Console.
  2. Fai clic su Crea job.
  3. Fornisci i seguenti dettagli di configurazione:

    Impostazione Valore
    Nome groupib-to-gcs-schedule
    Regione Stessa regione della Cloud Function
    Frequenza 0 */1 * * * (ogni ora) o 0 0 * * * (ogni giorno)
    Fuso orario Seleziona il tuo fuso orario
  4. In Configura l'esecuzione:

    • Tipo di destinazione: seleziona HTTP.
    • URL: inserisci l'URL trigger della Cloud Function.
    • Metodo HTTP: seleziona POST.
    • Intestazione di autenticazione: seleziona Aggiungi token OIDC.
    • Service account: seleziona un account di servizio con l'autorizzazione roles/cloudfunctions.invoker.
  5. Fai clic su Crea.

Testare l'esportazione dei dati

  1. Nella console Cloud Scheduler, fai clic su Forza esecuzione accanto al job per attivare manualmente la funzione.
  2. Controlla i log di Cloud Function in Cloud Logging per verificare che i dati siano stati recuperati da Group-IB.
  3. Vai a Cloud Storage > Bucket nella Google Cloud Console.
  4. Fai clic sul nome del bucket (ad esempio groupib-ti-logs).
  5. Vai alla cartella del prefisso (ad esempio, groupib-ti/).
  6. Verifica che nel bucket vengano visualizzati nuovi file .ndjson.

Recuperare il account di servizio Google SecOps

Google SecOps utilizza un account di servizio univoco per leggere i dati dal tuo bucket GCS. Devi concedere a questo account di servizio l'accesso al tuo bucket.

Recupera l'email del account di servizio

  1. Vai a Impostazioni SIEM > Feed.
  2. Fai clic su Aggiungi nuovo feed di notizie.
  3. Fai clic su Configura un singolo feed.
  4. Nel campo Nome feed, inserisci un nome per il feed (ad esempio, Group-IB Threat Intelligence).
  5. Seleziona Google Cloud Storage V2 come Tipo di origine.
  6. Seleziona Group-IB Threat Intelligence come Tipo di log.
  7. Fai clic su Ottieni service account. Viene visualizzata un'email del account di servizio univoca, ad esempio:

    chronicle-12345678@chronicle-gcp-prod.iam.gserviceaccount.com
    
  8. Copia questo indirizzo email per utilizzarlo nel passaggio successivo.

Concedi le autorizzazioni IAM al account di servizio Google SecOps

Il account di servizio Google SecOps deve avere il ruolo Visualizzatore oggetti Storage nel tuo bucket GCS.

  1. Vai a Cloud Storage > Bucket.
  2. Fai clic sul nome del bucket (ad esempio groupib-ti-logs).
  3. Vai alla scheda Autorizzazioni.
  4. Fai clic su Concedi l'accesso.
  5. Fornisci i seguenti dettagli di configurazione:
    • Aggiungi entità: incolla l'email del account di servizio Google SecOps.
    • Assegna ruoli: seleziona Visualizzatore oggetti Storage.
  6. Fai clic su Salva.

Configura un feed in Google SecOps per importare i log di Group-IB Threat Intelligence

  1. Vai a Impostazioni SIEM > Feed.
  2. Fai clic su Aggiungi nuovo feed.
  3. Fai clic su Configura un singolo feed.
  4. Nel campo Nome feed, inserisci un nome per il feed (ad esempio, Group-IB Threat Intelligence).
  5. Seleziona Google Cloud Storage V2 come Tipo di origine.
  6. Seleziona Group-IB Threat Intelligence come Tipo di log.
  7. Fai clic su Avanti.
  8. Specifica i valori per i seguenti parametri di input:

    • URL del bucket di archiviazione: inserisci l'URI del bucket GCS con il percorso del prefisso:

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

      Sostituisci:

      • groupib-ti-logs: il nome del bucket GCS.
      • groupib-ti: il percorso del prefisso/della cartella in cui sono archiviati i log.
    • Opzione di eliminazione dell'origine: seleziona l'opzione di eliminazione in base alle tue preferenze:

      • Mai: non elimina mai i file dopo i trasferimenti (opzione consigliata per i test).
      • Elimina file trasferiti: elimina i file dopo il trasferimento riuscito.
      • Elimina file trasferiti e directory vuote: elimina i file e le directory vuote dopo il trasferimento riuscito.
    • Età massima file: includi i file modificati nell'ultimo numero di giorni. Il valore predefinito è 180 giorni.

    • Spazio dei nomi dell'asset: lo spazio dei nomi dell'asset.

    • Etichette di importazione: l'etichetta da applicare agli eventi di questo feed.

  9. Fai clic su Avanti.

  10. Controlla la nuova configurazione del feed di notizie nella schermata Finalizza, quindi fai clic su Invia.

Hai bisogno di ulteriore assistenza? Ricevi risposte dai membri della community e dai professionisti di Google SecOps.