Raccogliere i log di ESET Threat Intelligence

Supportato in:

Questo documento spiega come importare i log di ESET Threat Intelligence in Google Security Operations utilizzando Google Cloud Storage V2, una funzione Cloud Run e Cloud Scheduler.

ESET Threat Intelligence (ETI) fornisce informazioni basate su prove e consigli pratici su minacce esistenti o emergenti. I servizi ETI ti avvisano di software o attività dannosi che potrebbero minacciare la tua organizzazione o i suoi clienti. Il servizio fornisce dati di intelligence sulle minacce tramite feed TAXII 2.1 in formato STIX 2.1, tra cui indicatori di compromissione APT, C&C e target di botnet, domini, IP, URL, file, URL di phishing, ransomware e minacce per Android dannosi.

Prima di iniziare

Assicurati di soddisfare i seguenti prerequisiti:

  • Un'istanza Google SecOps
  • Un progetto Google Cloud con le seguenti API abilitate:
    • API Cloud Storage
    • API Cloud Run Functions
    • API Cloud Scheduler
    • API Cloud Pub/Sub
  • Autorizzazioni per creare e gestire bucket Google Cloud Storage, funzioni Cloud Run, argomenti Pub/Sub e job Cloud Scheduler
  • Autorizzazioni per gestire i criteri IAM sui bucket Google Cloud Storage
  • Un abbonamento attivo a ESET Threat Intelligence
  • Accesso al portale ESET Threat Intelligence all'indirizzo https://eti.eset.com

Creare 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 eset-ti-logs).
    Tipo di località Scegli in base alle tue esigenze (regione singola, doppia regione, più regioni)
    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)
    Strumenti di protezione (Facoltativo) Attiva il controllo delle versioni degli oggetti o la policy di conservazione
  6. Fai clic su Crea.

Raccogliere le credenziali TAXII di ESET Threat Intelligence

Per consentire alla funzione Cloud Run di recuperare i dati di intelligence sulle minacce, devi attivare i feed TAXII e generare le credenziali TAXII dal portale ETI.

Attivare i feed TAXII

  1. Accedi al portale ESET Threat Intelligence all'indirizzo https://eti.eset.com.
  2. Vai a Feed di dati nel menu principale.
  3. Fai clic sull'icona con tre puntini accanto al feed di dati che vuoi attivare.
  4. Seleziona Attiva feed.
  5. Ripeti i passaggi 3-4 per ogni feed che vuoi importare in Google SecOps.

Genera credenziali TAXII

  1. Nel portale ESET Threat Intelligence, vai a Impostazioni amministrazione > Credenziali di accesso.
  2. Fai clic su Genera credenziali TAXII.
  3. Nella finestra di dialogo visualizzata, copia e salva i seguenti valori:

    • Nome utente: il tuo nome utente TAXII
    • Password: la password TAXII

Registrare i dettagli del feed TAXII

Dopo aver attivato i feed e generato le credenziali, registra le seguenti informazioni per ogni feed che vuoi importare:

  1. Nel portale ESET Threat Intelligence, vai a Data Feeds.
  2. Fai clic sull'icona con tre puntini accanto a un feed attivato.
  3. Seleziona Mostra dettagli feed di dati.
  4. Nel riquadro laterale, prendi nota dei seguenti valori:

    • Nome feed TAXII: l'identificatore del feed (ad esempio botnet stix 2.1)
    • ID TAXII 2: l'ID raccolta (ad esempio, 0abb06690b0b47e49cd7794396b76b20)
    • URL feed TAXII 2: l'URL completo della raccolta

Feed TAXII disponibili

  • ESET Threat Intelligence fornisce i seguenti feed TAXII 2.1:

    Nome feed Nome feed TAXII ID raccolta
    Feed di infostealer per Android androidinfostealer stix 2.1 9ee501cde0c44d6db4ae995fead1a7c8
    Feed delle minacce per Android androidthreats stix 2.1 daf3de8fab144552a1cb5af054ed07ee
    APT IoC apt stix 2.1 97e3eb74ae5f46dd9e22f677a6938ee7
    Feed botnet botnet stix 2.1 0abb06690b0b47e49cd7794396b76b20
    Botnet - C&C botnet.cc stix 2.1 d1923a526e8f400dbb301259240ee3d5
    Botnet - Target botnet.target stix 2.1 61b6e4f9153e411ca7a9982a2c6ae788
    Feed di frodi di criptovalute cryptoscam stix 2.1 2c183ce9551a43338c6cc2ed7c2a704d
    Feed di dominio domain stix 2.1 a34aa0a4f9de419582a883863503f9c4
    Feed IoC eCrime ecrime stix 2.1 08059376eac84ec4a076cfd682493f91
    Feed IP ip stix 2.1 baaed2a92335418aa753fe944e13c23a
    Allegati email dannosi emailattachments stix 2.1 c0d56cf7f81d482eb97fd46beaa4bae0
    Feed di file dannosi file stix 2.1 ee6a153ed77e4ec3ab21e76cc2074b9f
    Feed URL di phishing phishingurl stix 2.1 d0a6c0f962dd4dd2b3eeb96b18612584
    Feed di file adware PUA puaadware stix 2.1 d1bfc81202fc4c6599326771ec2da41d
    Feed di file di app a doppio uso PUA puadualapps stix 2.1 970a7d0039ac4668addf058cd9feb953
    Feed ransomware ransomware stix 2.1 8d3490d688ce4a989aee9af5c680d8bf
    Feed URL fraudolenti scamurl stix 2.1 2130adc3c67c43f9a3664b187931375e
    Feed di smishing smishing stix 2.1 330ad7d0c736476babe5e49077b96c95
    Feed di truffe via SMS smsscam stix 2.1 6e20217a2e1246b8ab11be29f759f716
    Feed URL url stix 2.1 1d3208c143be49da8130f5a66fd3a0fa

Crea un account di servizio per la funzione Cloud Run

  1. Nella console Google Cloud, vai a IAM e amministrazione > Service account.
  2. Fai clic su Crea account di servizio.
  3. Fornisci i seguenti dettagli di configurazione:

    • Nome del service account: inserisci eset-ti-collector
    • Descrizione service account: inserisci Service account for ESET Threat Intelligence Cloud Run function to write STIX objects to GCS
  4. Fai clic su Crea e continua.

  5. Nella sezione Concedi a questo account di servizio l'accesso al progetto, aggiungi i seguenti ruoli:

    1. Fai clic su Seleziona un ruolo, cerca e seleziona Amministratore oggetti di archiviazione.
    2. Fai clic su Aggiungi un altro ruolo, cerca e seleziona Cloud Run Invoker.
  6. Fai clic su Continua.

  7. Fai clic su Fine.

Concedi le autorizzazioni IAM sul bucket Google Cloud Storage

  1. Vai a Cloud Storage > Bucket.
  2. Fai clic sul nome del bucket (ad esempio eset-ti-logs).
  3. Vai alla scheda Autorizzazioni.
  4. Fai clic su Concedi l'accesso.
  5. Fornisci i seguenti dettagli di configurazione:

    • Aggiungi entità: inserisci l'email del account di servizio (ad esempio, eset-ti-collector@PROJECT_ID.iam.gserviceaccount.com).
    • Assegna i ruoli: seleziona Storage Object Admin.
  6. Fai clic su Salva.

Crea argomento Pub/Sub

L'argomento Pub/Sub attiva la funzione Cloud Run quando un messaggio viene pubblicato da Cloud Scheduler.

  1. Nella console Google Cloud, vai a Pub/Sub > Argomenti.
  2. Fai clic su Crea argomento.
  3. Fornisci i seguenti dettagli di configurazione:
    • ID argomento: inserisci eset-ti-trigger
    • Aggiungi una sottoscrizione predefinita: lascia selezionata l'opzione
  4. Fai clic su Crea.

Crea la funzione Cloud Run

  1. Nella console Google Cloud, vai a Cloud Run Functions.
  2. Fai clic su Crea funzione.
  3. Fornisci i seguenti dettagli di configurazione:

    Impostazione Valore
    Ambiente 2ª gen.
    Nome della funzione eset-ti-collector
    Regione Seleziona la stessa regione del bucket GCS
    Tipo di trigger Cloud Pub/Sub
    Argomento Pub/Sub eset-ti-trigger
    Memoria allocata 512 MiB
    Timeout 540 secondi
    Service account di runtime eset-ti-collector
  4. Fai clic su Avanti.

  5. Imposta Runtime su Python 3.12.

  6. Imposta Punto di ingresso su main.

  7. Nel file requirements.txt, aggiungi le seguenti dipendenze:

    functions-framework==3.*
    google-cloud-storage==2.*
    urllib3==2.*
    
  8. Nel file main.py, incolla il seguente codice:

    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. Fai clic su Esegui il deployment.

  10. Attendi che venga eseguito il deployment della funzione. Al termine del deployment, lo stato cambia in un segno di spunta verde.

Configura le variabili di ambiente

  1. Dopo il deployment della funzione, vai a Cloud Run Functions > eset-ti-collector.
  2. Fai clic su Modifica ed esegui il deployment di una nuova revisione.
  3. Fai clic sulla scheda Variabili e secret (o espandi Impostazioni di runtime, build, connessioni e sicurezza per 1ª generazione).
  4. Aggiungi le seguenti variabili di ambiente:

    Chiave Valore di esempio
    GCS_BUCKET eset-ti-logs
    GCS_PREFIX eset-ti
    STATE_KEY eset-ti/state.json
    TAXII_USERNAME Il tuo nome utente TAXII dal portale ETI
    TAXII_PASSWORD La password TAXII del portale ETI
    COLLECTION_ID 0abb06690b0b47e49cd7794396b76b20
    MAX_RECORDS 10000
    LOOKBACK_HOURS 48
  5. Fai clic su Esegui il deployment.

Crea job Cloud Scheduler

Cloud Scheduler pubblica un messaggio nell'argomento Pub/Sub in base a una pianificazione, attivando la funzione Cloud Run per eseguire il polling di ESET Threat Intelligence per nuovi oggetti STIX.

  1. Nella console Google Cloud, vai a Cloud Scheduler.
  2. Fai clic su Crea job.
  3. Fornisci i seguenti dettagli di configurazione:

    Impostazione Valore
    Nome eset-ti-poll
    Regione Seleziona la stessa regione della funzione
    Frequenza 0 */1 * * * (ogni ora)
    Fuso orario Seleziona il tuo fuso orario (ad esempio, UTC)
  4. Fai clic su Continua.

  5. Nella sezione Configura l'esecuzione:

    • Tipo target: seleziona Pub/Sub.
    • Argomento: seleziona eset-ti-trigger
    • Corpo del messaggio: inserisci {"poll": true}
  6. Fai clic su Crea.

Verifica la funzione Cloud Run

  1. In Cloud Scheduler, individua il job eset-ti-poll.
  2. Fai clic su Forza esecuzione per attivare un'esecuzione immediata.
  3. Vai a Cloud Run functions > eset-ti-collector > Log.
  4. Verifica che la funzione sia stata eseguita correttamente controllando le voci di log, ad esempio:

    Fetched 250 objects (total: 250)
    Wrote 250 STIX objects to gs://eset-ti-logs/eset-ti/eset_ti_0abb06690b0b47e49cd7794396b76b20_20250115_103000.json
    
  5. Vai a Cloud Storage > Bucket > eset-ti-logs.

  6. Vai al prefisso eset-ti/.

  7. Verifica che i file NDJSON vengano creati con oggetti STIX.

Recupera l'account di servizio Google SecOps e configura il feed

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.
  3. Fai clic su Configura un singolo feed.
  4. Nel campo Nome feed, inserisci un nome per il feed (ad esempio, ESET Threat Intelligence - Botnet).
  5. Seleziona Google Cloud Storage V2 come Tipo di origine.
  6. Seleziona ESET Threat Intelligence come Tipo di log.
  7. Fai clic su Ottieni service account. Verrà visualizzata un'email univoca del account di servizio, ad esempio:

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

  9. Fai clic su Avanti.

  10. 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://eset-ti-logs/eset-ti/
      
    • 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 del 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 (ad esempio, ESET_IOC)

  11. Fai clic su Avanti.

  12. Controlla la nuova configurazione del feed nella schermata Finalizza e poi fai clic su Invia.

Concedi le autorizzazioni IAM al account di servizio Google SecOps

Il account di servizio Google SecOps deve disporre del ruolo Visualizzatore oggetti Storage nel bucket Google Cloud Storage.

  1. Vai a Cloud Storage > Bucket.
  2. Fai clic sul nome del bucket (ad esempio eset-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 i ruoli: seleziona Visualizzatore oggetti Storage
  6. Fai clic su Salva.

Tabella di mappatura UDM

Campo log Mappatura UDM Logic
quando metadata.event_timestamp Timestamp in cui si è verificato l'evento
metadata.event_type Tipo di evento (ad esempio, USER_LOGIN, NETWORK_CONNECTION)
messageid metadata.id Identificatore univoco dell'evento
protocollo network.ip_protocol Protocollo IP (ad esempio TCP, UDP)
deviceName principal.hostname Nome host di origine
srcAddr principal.ip Indirizzo IP di origine della connessione
srcPort principal.port Numero porta di origine
azione security_result.action Azione intrapresa dal prodotto di sicurezza (ad esempio, CONSENTI, BLOCCA)
dstAddr target.ip Indirizzo IP di destinazione
dstPort target.port Numero di porta di destinazione
metadata.product_name Nome del prodotto
metadata.vendor_name Nome fornitore/azienda

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