Raccogli i log di Trellix Endpoint Security HX (in precedenza FireEye HX)
Versione parser: 30.0
Questa guida spiega come importare i log di Trellix Endpoint Security HX (precedentemente noto come FireEye HX) in Google Security Operations utilizzando Google Cloud Storage V2. Trellix Endpoint Security HX è una piattaforma di rilevamento e risposta degli endpoint (EDR) che offre funzionalità avanzate di rilevamento, analisi e contenimento delle minacce. Utilizza la protezione basata sull'intelligence e gli indicatori di compromissione (IOC) in tempo reale per rilevare e rispondere ad attacchi sofisticati sugli endpoint.
Prima di iniziare
Assicurati di soddisfare i seguenti prerequisiti:
- Un'istanza Google SecOps.
- Un progetto GCP con l'API Storage di Cloud Storage abilitata.
- Autorizzazioni per creare e gestire bucket GCS e policy IAM.
- Autorizzazioni per creare servizi Cloud Run, argomenti Pub/Sub e job Cloud Scheduler.
- Accesso con privilegi alla console Trellix Endpoint Security HX con accesso API abilitato.
- Un account utente API Trellix HX con almeno il ruolo Analista.
Crea un bucket Google Cloud Storage
- Vai alla console Google Cloud.
- Seleziona il progetto.
- 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 fireeye-hx-logs).Tipo di località Scegli in base alle tue esigenze (regione singola, a due regioni, multiregionale) Località Seleziona la località più vicina alla tua istanza Google SecOps Classe di archiviazione Standard (consigliato per i log ad accesso frequente) Controllo degli accessi Uniforme (opzione consigliata) Strumenti di protezione (Facoltativo) Abilita il controllo delle versioni degli oggetti o la policy di conservazione Fai clic su Crea.
Raccogli le credenziali API di Trellix Endpoint Security HX
Recuperare l'URL della console HX
- Accedi alla console web Trellix Endpoint Security HX.
- Prendi nota dell'URL della console dalla barra degli indirizzi del browser (formato:
https://<hx-hostname>:<port>).
Creare o verificare l'account utente API
- Accedi alla console Trellix HX con un account amministratore.
- Vai ad Amministrazione > Account utente.
- Crea un nuovo utente o selezionane uno esistente per l'accesso API.
- Assicurati che l'utente disponga del ruolo api_analyst o api_admin.
- Prendi nota del nome utente e della password per l'accesso all'API.
Verifica l'accesso API
Testa le tue credenziali prima di procedere con l'integrazione:
HX_HOST="[https://hx-console.example.com:3000](https://hx-console.example.com:3000)" HX_USER="api_user" HX_PASS="api_password" # Authenticate and get token curl -k -X POST "$HX_HOST/hx/api/v3/token" \ -u "$HX_USER:$HX_PASS"
Crea un account di servizio per la funzione Cloud Run
La funzione Cloud Run richiede un account di servizio con autorizzazioni di scrittura nel bucket GCS e di invocazione da parte di Pub/Sub.
Crea service account
- 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:
fireeye-hx-collector-sa - Descrizione del service account:
Service account for Cloud Run function to collect Trellix HX logs
- Nome del service account:
- Fai clic su Crea e continua.
- Nella sezione Concedi a questo account di servizio l'accesso al progetto, aggiungi i seguenti ruoli:
- Storage Object Admin
- Cloud Run Invoker
- Cloud Functions Invoker
- Fai clic su Continua, poi su Fine.
Concedi autorizzazioni IAM sul bucket GCS
- Vai a Cloud Storage > Bucket.
- Fai clic sul nome del bucket (
fireeye-hx-logs). - Vai alla scheda Autorizzazioni.
- Fai clic su Concedi l'accesso.
- Aggiungi entità: inserisci l'email del account di servizio.
- Assegna i ruoli: seleziona Storage Object Admin.
- Fai clic su Salva.
Crea argomento Pub/Sub
Crea un argomento a cui Cloud Scheduler pubblicherà e a cui la funzione Cloud Run eseguirà la sottoscrizione.
- Nella console Google Cloud, vai a Pub/Sub > Argomenti.
- Fai clic su Crea argomento.
- ID argomento:
fireeye-hx-logs-trigger. - Fai clic su Crea.
Crea una funzione Cloud Run per raccogliere i log
- Nella console Google Cloud, vai a Cloud Run.
- Fai clic su Crea servizio.
- Seleziona Funzione.
Nella sezione Configura, fornisci i seguenti dettagli:
Impostazione Valore Nome servizio fireeye-hx-collectorRegione Seleziona la regione corrispondente al tuo bucket GCS Tempo di esecuzione Python 3.12 o versioni successive Nella sezione Trigger:
- Fai clic su + Aggiungi trigger.
- Seleziona Cloud Pub/Sub.
- In Seleziona un argomento Cloud Pub/Sub, scegli
fireeye-hx-logs-trigger. - Fai clic su Salva.
Nella sezione Autenticazione, seleziona Richiedi autenticazione e seleziona Identity and Access Management (IAM).
Scorri verso il basso fino a Container, networking, sicurezza.
Nella scheda Sicurezza, seleziona il account di servizio
fireeye-hx-collector-sa.Nella scheda Contenitori, fai clic su Variabili e secret e aggiungi quanto segue:
Nome variabile Valore di esempio Descrizione GCS_BUCKETfireeye-hx-logsNome bucket GCS GCS_PREFIXhx-alertsPrefisso per i file di log STATE_KEYhx-alerts/state.jsonPercorso file di stato HX_HOSThttps://hx-console.example.com:3000URL della console HX HX_USERapi_userNome utente API HX_PASSapi_passwordPassword API MAX_RECORDS1000Numero massimo di record per esecuzione PAGE_SIZE100Record per pagina LOOKBACK_HOURS24Periodo di riferimento iniziale In Richieste, imposta Timeout richiesta su
600secondi.Fai clic su Crea. Una volta creato il servizio, si aprirà l'editor di codice incorporato.
Aggiungi codice per la funzione
- Inserisci main nel campo Entry point (Punto di ingresso).
Crea i seguenti file nell'editor in linea:
- main.py:
import functions_framework from google.cloud import storage import json import os import urllib3 from datetime import datetime, timezone, timedelta import time # Disable SSL warnings for self-signed certs urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning) # Initialize HTTP client with timeouts http = urllib3.PoolManager( timeout=urllib3.Timeout(connect=5.0, read=30.0), retries=False, cert_reqs='CERT_NONE', ) # Initialize Storage client storage_client = storage.Client() # Environment variables GCS_BUCKET = os.environ.get('GCS_BUCKET') GCS_PREFIX = os.environ.get('GCS_PREFIX', 'hx-alerts') STATE_KEY = os.environ.get('STATE_KEY', 'hx-alerts/state.json') HX_HOST = os.environ.get('HX_HOST') HX_USER = os.environ.get('HX_USER') HX_PASS = os.environ.get('HX_PASS') MAX_RECORDS = int(os.environ.get('MAX_RECORDS', '1000')) PAGE_SIZE = int(os.environ.get('PAGE_SIZE', '100')) LOOKBACK_HOURS = int(os.environ.get('LOOKBACK_HOURS', '24')) def get_api_token(host, username, password): url = f"{host}/hx/api/v3/token" auth_string = f"{username}:{password}" import base64 auth_b64 = base64.b64encode(auth_string.encode('utf-8')).decode('utf-8') headers = {'Authorization': f'Basic {auth_b64}'} response = http.request('POST', url, headers=headers) if response.status == 204: return response.headers.get('X-FeApi-Token') else: raise Exception(f"Authentication failed: HTTP {response.status}") @functions_framework.cloud_event def main(cloud_event): if not all([GCS_BUCKET, HX_HOST, HX_USER, HX_PASS]): print('Error: Missing required environment variables') return try: bucket = storage_client.bucket(GCS_BUCKET) state = load_state(bucket, STATE_KEY) now = datetime.now(timezone.utc) last_time = None if isinstance(state, dict) and state.get("last_event_time"): try: last_time = parse_datetime(state["last_event_time"]) - timedelta(minutes=2) except Exception as e: print(f"Warning: Could not parse last_event_time: {e}") if last_time is None: last_time = now - timedelta(hours=LOOKBACK_HOURS) print(f"Fetching alerts from {last_time.isoformat()} to {now.isoformat()}") token = get_api_token(HX_HOST, HX_USER, HX_PASS) alerts, newest_time = fetch_alerts(HX_HOST, token, last_time, now, PAGE_SIZE, MAX_RECORDS) hosts = fetch_hosts(HX_HOST, token) all_records = alerts + hosts if not all_records: print("No new records found.") save_state(bucket, STATE_KEY, now.isoformat()) return timestamp = now.strftime('%Y%m%d_%H%M%S') object_key = f"{GCS_PREFIX}/logs_{timestamp}.ndjson" ndjson = '\n'.join([json.dumps(record, ensure_ascii=False) for record in all_records]) + '\n' bucket.blob(object_key).upload_from_string(ndjson, content_type='application/x-ndjson') print(f"Wrote {len(all_records)} records to gs://{GCS_BUCKET}/{object_key}") save_state(bucket, STATE_KEY, newest_time if newest_time else now.isoformat()) release_token(HX_HOST, token) print(f"Successfully processed {len(all_records)} records") except Exception as e: print(f'Error processing logs: {str(e)}') raise def parse_datetime(value): if value.endswith("Z"): value = value[:-1] + "+00:00" return datetime.fromisoformat(value) def load_state(bucket, key): try: blob = bucket.blob(key) if blob.exists(): return json.loads(blob.download_as_text()) except Exception as e: print(f"Warning: Could not load state: {e}") return {} def save_state(bucket, key, last_event_time_iso): try: state = {'last_event_time': last_event_time_iso} bucket.blob(key).upload_from_string(json.dumps(state, indent=2), content_type='application/json') except Exception as e: print(f"Warning: Could not save state: {e}") def fetch_alerts(host, token, start_time, end_time, page_size, max_records): endpoint = f"{host}/hx/api/v3/alerts" headers = {'X-FeApi-Token': token, 'Accept': 'application/json'} records = []; newest_time = None; offset = 0; backoff = 1.0 while True: if len(records) >= max_records: break start_iso = start_time.strftime('%Y-%m-%dT%H:%M:%S.000Z') end_iso = end_time.strftime('%Y-%m-%dT%H:%M:%S.000Z') url = f"{endpoint}?sort=reported_at+asc&min_reported_at={start_iso}&max_reported_at={end_iso}&offset={offset}&limit={min(page_size, max_records - len(records))}" try: response = http.request('GET', url, headers=headers) if response.status == 429: time.sleep(int(response.headers.get('Retry-After', str(int(backoff))))); backoff = min(backoff * 2, 30.0); continue backoff = 1.0 if response.status != 200: break data = json.loads(response.data.decode('utf-8')) page_results = data.get('data', {}).get('entries', []) if not page_results: break records.extend(page_results) for alert in page_results: event_time = alert.get('reported_at') if event_time and (newest_time is None or event_time > newest_time): newest_time = event_time offset += len(page_results) if offset >= data.get('data', {}).get('total', 0): break except Exception: break return records, newest_time def fetch_hosts(host, token): endpoint = f"{host}/hx/api/v3/hosts" headers = {'X-FeApi-Token': token, 'Accept': 'application/json'} try: response = http.request('GET', f"{endpoint}?limit=100&offset=0", headers=headers) if response.status != 200: return [] return json.loads(response.data.decode('utf-8')).get('data', {}).get('entries', []) except Exception: return [] def release_token(host, token): try: http.request('DELETE', f"{host}/hx/api/v3/token", headers={'X-FeApi-Token': token}) except Exception: pass- requirements.txt:
functions-framework==3.* google-cloud-storage==2.* urllib3>=2.0.0Fai clic su Esegui il deployment per salvare la funzione ed eseguirne il deployment.
Crea job Cloud Scheduler
- Nella console Google Cloud, vai a Cloud Scheduler.
- Fai clic su Crea job.
Fornisci i seguenti dettagli di configurazione:
Impostazione Valore Nome fireeye-hx-collector-hourlyRegione Seleziona la stessa regione della funzione Cloud Run Frequenza 0 * * * *(ogni ora, allo scoccare dell'ora)Fuso orario Seleziona il fuso orario (UTC consigliato) Tipo di target Pub/Sub Argomento fireeye-hx-logs-triggerCorpo del messaggio {}Fai clic su Crea.
Testare l'integrazione
- In Cloud Scheduler, trova il job e fai clic su Forza esecuzione.
- Vai a Cloud Run > Servizi > Log per verificare la riuscita dell'operazione.
- Controlla Cloud Storage per verificare che esista un nuovo file
.ndjsonnella cartellahx-alerts/.
Configura un feed in Google SecOps
- Vai a Impostazioni SIEM > Feed.
- Fai clic su Aggiungi nuovo feed > Configura un singolo feed.
- Nome feed:
Trellix HX Logs. - Tipo di origine: Google Cloud Storage V2.
- Tipo di log: FireEye HX.
- Fai clic su Ottieni service account e copia l'email (ad es.
chronicle-12345678@...). - Fai clic su Avanti.
- URL del bucket di archiviazione:
gs://fireeye-hx-logs/hx-alerts/(includi la barra finale). - Opzione di eliminazione della fonte: seleziona l'opzione che preferisci.
- Fai clic su Avanti, rivedi e fai clic su Invia.
Concedi le autorizzazioni IAM al account di servizio
Il account di servizio Google SecOps deve avere il ruolo Visualizzatore oggetti Storage nel tuo bucket.
- Vai a Cloud Storage > Bucket.
- Seleziona il bucket e vai alla scheda Autorizzazioni.
- Fai clic su Concedi l'accesso.
- Aggiungi entità: incolla l'email del account di servizio Google SecOps.
- Assegna ruoli: seleziona Visualizzatore oggetti Storage.
- Fai clic su Salva.
Tabella di mappatura UDM
| Campo log | mappatura UDM | Logica |
|---|---|---|
alert.event_type |
metadata.product_event_type |
Mappatura diretta. |
alert.reported_at |
metadata.event_timestamp |
Analizzato come timestamp. |
alert.source |
principal.hostname |
Mappatura diretta. |
alert.agent._id |
principal.asset_id |
Mappatura diretta. |
alert.indicator.display_name |
security_result.threat_name |
Mappatura diretta. |
alert.md5values |
target.file.md5 |
Mappatura diretta. |
| N/D | metadata.vendor_name |
Imposta su Trellix. |
| N/D | metadata.product_name |
Imposta Endpoint Security HX. |
| N/D | metadata.log_type |
Imposta su FIREEYE_HX. |
cs12 |
additional.fields |
Mappato dal log delle modifiche |
cs9 |
target.process.file.md5 |
Mappato dal log delle modifiche |
account_name", "UUID", "Mitre", "host_details.data.sysinfo.url", "host_details.route", "host_details.data.reported_clone", and "host_details.data.timezone |
security_result.detection_fields |
Mappato dal log delle modifiche |
Desc |
metadata.description |
Mappato dal log delle modifiche |
Confidence |
security_result.confidence |
Mappato dal log delle modifiche |
alert.appliance._id |
additional.fields |
Mappato dal log delle modifiche |
host_details.data.stats.acqs", "host_details.data.stats.alerting_conditions", "host_details.data.stats.alerts", "host_details.data.stats.exploit_alerts", "host_details.data.stats.exploit_blocks", and "host_details.data.stats.false_positive_alerts |
security_result.detection_fields |
Mappato dal log delle modifiche |
categoryOutcome", "cs13 |
additional.fields |
Mappato dal log delle modifiche |
cs6 |
target.process.file.sha1 |
Mappato dal log delle modifiche |
host_details.message |
security_result.action_details |
Mappato dal log delle modifiche |
alert.md5values", "alert.resolution", "alert.is_false_positive", and "alert.alert_type |
additional.fields |
Mappato dal log delle modifiche |
type.threat_type |
security_result.threat_name |
Mappato dal log delle modifiche |
ent.lms_event_id |
metadata.product_log_id |
Mappato dal log delle modifiche |
email.smtp.mail_from |
network.email.from |
Mappato dal log delle modifiche |
email.headers.subject |
network.email.subject |
Mappato dal log delle modifiche |
email.headers.to |
network.email.to |
Mappato dal log delle modifiche |
ent.type", "ent.id", "ent.name", "ent.object_source", "ent.binary", and "ent.attributes.scan_id |
security_result.detection_fields |
Mappato dal log delle modifiche |
cs11Label |
additional_cs11Label.key |
Mappato dal log delle modifiche |
cs11 |
additional_cs11.value |
Mappato dal log delle modifiche |
alert.sysinfo.mac_address |
principal.mac |
Mappato dal log delle modifiche |
host_details.data.agent_version |
metadata.product_version |
Mappato dal log delle modifiche |
alert.url |
metadata.url_back_to_product |
Mappato dal log delle modifiche |
description |
metadata.description |
Mappato dal log delle modifiche |
alert.agent._id |
principal.asset.asset_id |
Mappato dal log delle modifiche |
alert.event_id |
metadata.product_log_id |
Mappato dal log delle modifiche |
deviceCustomDate1Label |
additional_deviceCustomDate1.key |
Mappato dal log delle modifiche |
deviceCustomDate1 |
additional_deviceCustomDate1.value |
Mappato dal log delle modifiche |
deviceCustomDate2 |
additional_deviceCustomDate2.value |
Mappato dal log delle modifiche |
client |
principal.ip |
Mappato dal log delle modifiche |
principal_ip |
principal.ip |
Mappato dal log delle modifiche |
remoteaddress |
principal.ip |
Mappato dal log delle modifiche |
host_ |
principal.hostname |
Mappato dal log delle modifiche |
line |
principal.application |
Mappato dal log delle modifiche |
username |
principal.user.userid |
Mappato dal log delle modifiche |
client_app_type |
principal.resource.attribute.labels |
Mappato dal log delle modifiche |
upstream |
target.url |
Mappato dal log delle modifiche |
role |
target.user.role_name |
Mappato dal log delle modifiche |
server |
target.resource.attribute.labels |
Mappato dal log delle modifiche |
localusername |
target.user.user_display_name |
Mappato dal log delle modifiche |
request |
additional.fields |
Mappato dal log delle modifiche |
mlocked |
additional.fields |
Mappato dal log delle modifiche |
kernel_stack |
additional.fields |
Mappato dal log delle modifiche |
sessionID |
network.session_id |
Mappato dal log delle modifiche |
auth_mechanism |
extensions.auth.mechanism |
Mappato dal log delle modifiche |
authsubmethod |
extensions.auth.auth_details |
Mappato dal log delle modifiche |
Log delle modifiche
Visualizza il log delle modifiche per questo parser
Hai bisogno di ulteriore assistenza? Ricevi risposte dai membri della community e dai professionisti di Google SecOps.