Raccogliere i log di ESET Threat Intelligence
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
- Vai alla console Google Cloud.
- Seleziona il tuo progetto o creane uno nuovo.
- Nel menu di navigazione, vai a Cloud Storage > Bucket.
- Fai clic su Crea bucket.
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 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
- Accedi al portale ESET Threat Intelligence all'indirizzo https://eti.eset.com.
- Vai a Feed di dati nel menu principale.
- Fai clic sull'icona con tre puntini accanto al feed di dati che vuoi attivare.
- Seleziona Attiva feed.
Ripeti i passaggi 3-4 per ogni feed che vuoi importare in Google SecOps.
Genera credenziali TAXII
- Nel portale ESET Threat Intelligence, vai a Impostazioni amministrazione > Credenziali di accesso.
- Fai clic su Genera credenziali TAXII.
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:
- Nel portale ESET Threat Intelligence, vai a Data Feeds.
- Fai clic sull'icona con tre puntini accanto a un feed attivato.
- Seleziona Mostra dettagli feed di dati.
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
- Nome feed TAXII: l'identificatore del feed (ad esempio
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
- Nella console Google Cloud, vai a IAM e amministrazione > Service account.
- Fai clic su Crea account di servizio.
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
- Nome del service account: inserisci
Fai clic su Crea e continua.
Nella sezione Concedi a questo account di servizio l'accesso al progetto, aggiungi i seguenti ruoli:
- Fai clic su Seleziona un ruolo, cerca e seleziona Amministratore oggetti di archiviazione.
- Fai clic su Aggiungi un altro ruolo, cerca e seleziona Cloud Run Invoker.
Fai clic su Continua.
Fai clic su Fine.
Concedi le autorizzazioni IAM sul bucket Google Cloud Storage
- Vai a Cloud Storage > Bucket.
- Fai clic sul nome del bucket (ad esempio
eset-ti-logs). - Vai alla scheda Autorizzazioni.
- Fai clic su Concedi l'accesso.
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.
- Aggiungi entità: inserisci l'email del account di servizio (ad esempio,
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.
- Nella console Google Cloud, vai a Pub/Sub > Argomenti.
- Fai clic su Crea argomento.
- Fornisci i seguenti dettagli di configurazione:
- ID argomento: inserisci
eset-ti-trigger - Aggiungi una sottoscrizione predefinita: lascia selezionata l'opzione
- ID argomento: inserisci
- Fai clic su Crea.
Crea la funzione Cloud Run
- Nella console Google Cloud, vai a Cloud Run Functions.
- Fai clic su Crea funzione.
Fornisci i seguenti dettagli di configurazione:
Impostazione Valore Ambiente 2ª gen. Nome della funzione eset-ti-collectorRegione Seleziona la stessa regione del bucket GCS Tipo di trigger Cloud Pub/Sub Argomento Pub/Sub eset-ti-triggerMemoria allocata 512 MiB Timeout 540 secondi Service account di runtime eset-ti-collectorFai clic su Avanti.
Imposta Runtime su Python 3.12.
Imposta Punto di ingresso su
main.Nel file
requirements.txt, aggiungi le seguenti dipendenze:functions-framework==3.* google-cloud-storage==2.* urllib3==2.*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}") raiseFai clic su Esegui il deployment.
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
- Dopo il deployment della funzione, vai a Cloud Run Functions > eset-ti-collector.
- Fai clic su Modifica ed esegui il deployment di una nuova revisione.
- Fai clic sulla scheda Variabili e secret (o espandi Impostazioni di runtime, build, connessioni e sicurezza per 1ª generazione).
Aggiungi le seguenti variabili di ambiente:
Chiave Valore di esempio GCS_BUCKETeset-ti-logsGCS_PREFIXeset-tiSTATE_KEYeset-ti/state.jsonTAXII_USERNAMEIl tuo nome utente TAXII dal portale ETI TAXII_PASSWORDLa password TAXII del portale ETI COLLECTION_ID0abb06690b0b47e49cd7794396b76b20MAX_RECORDS10000LOOKBACK_HOURS48Fai 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.
- Nella console Google Cloud, vai a Cloud Scheduler.
- Fai clic su Crea job.
Fornisci i seguenti dettagli di configurazione:
Impostazione Valore Nome eset-ti-pollRegione Seleziona la stessa regione della funzione Frequenza 0 */1 * * *(ogni ora)Fuso orario Seleziona il tuo fuso orario (ad esempio, UTC)Fai clic su Continua.
Nella sezione Configura l'esecuzione:
- Tipo target: seleziona Pub/Sub.
- Argomento: seleziona
eset-ti-trigger - Corpo del messaggio: inserisci
{"poll": true}
Fai clic su Crea.
Verifica la funzione Cloud Run
- In Cloud Scheduler, individua il job
eset-ti-poll. - Fai clic su Forza esecuzione per attivare un'esecuzione immediata.
- Vai a Cloud Run functions > eset-ti-collector > Log.
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.jsonVai a Cloud Storage > Bucket > eset-ti-logs.
Vai al prefisso
eset-ti/.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
- Vai a Impostazioni SIEM > Feed.
- Fai clic su Aggiungi nuovo feed.
- Fai clic su Configura un singolo feed.
- Nel campo Nome feed, inserisci un nome per il feed (ad esempio,
ESET Threat Intelligence - Botnet). - Seleziona Google Cloud Storage V2 come Tipo di origine.
- Seleziona ESET Threat Intelligence come Tipo di log.
Fai clic su Ottieni service account. Verrà visualizzata un'email univoca del account di servizio, ad esempio:
chronicle-12345678@chronicle-gcp-prod.iam.gserviceaccount.comCopia questo indirizzo email per utilizzarlo nel passaggio successivo.
Fai clic su Avanti.
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)
Fai clic su Avanti.
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.
- Vai a Cloud Storage > Bucket.
- Fai clic sul nome del bucket (ad esempio
eset-ti-logs). - Vai alla scheda Autorizzazioni.
- Fai clic su Concedi l'accesso.
- Fornisci i seguenti dettagli di configurazione:
- Aggiungi entità: incolla l'email del account di servizio Google SecOps
- Assegna i ruoli: seleziona Visualizzatore oggetti Storage
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.