Raccogli i log di Trellix Endpoint Security HX (precedentemente 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 fornisce funzionalità avanzate di rilevamento, indagine e contenimento delle minacce. Utilizza una protezione basata sull'intelligence e 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 globalmente univoco (ad esempio fireeye-hx-logs)Tipo di località Scegli in base alle tue esigenze (Regione, 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 (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
Recupera l'URL della console HX
- Accedi alla console web di Trellix Endpoint Security HX.
- Prendi nota dell'URL della console dalla barra degli indirizzi del browser (formato:
https://<hx-hostname>:<port>).
Crea o verifica l'account utente API
- Accedi alla console Trellix HX con un account amministratore.
- Vai ad Amministratore > Account utente.
- Crea un nuovo utente o selezionane uno esistente per l'accesso all'API.
- Assicurati che l'utente abbia il ruolo api_analyst o api_admin.
- Prendi nota del nome utente e della password per l'accesso all'API.
Verifica l'accesso all'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 le autorizzazioni per scrivere nel bucket GCS ed essere richiamata da Pub/Sub.
Crea service account
- Nella console GCP, 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, quindi su Fine.
Concedi le 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'indirizzo email del account di servizio.
- Assegna i ruoli: seleziona Storage Object Admin.
- Fai clic su Salva.
Crea argomento Pub/Sub
Crea un argomento in cui Cloud Scheduler pubblicherà e a cui la funzione Cloud Run si iscriverà.
- 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 Container, 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 del 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. Dopo aver creato il servizio, si aprirà l'editor di codice incorporato.
Aggiungi codice per la funzione
- Inserisci main nel campo 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 (consigliato UTC) Tipo di target Pub/Sub Argomento fireeye-hx-logs-triggerCorpo del messaggio {}Fai clic su Crea.
Testa l'integrazione
- In Cloud Scheduler, trova il tuo job e fai clic su Forza esecuzione.
- Vai a Cloud Run > Servizi > Log per verificare l'esito positivo.
- Controlla Cloud Storage per verificare che esista un nuovo file
.ndjsonnella cartellahx-alerts/.
Configura un feed in Google SecOps
- Vai a Impostazioni > Gestione dei dati > Feed. Se utilizzi una piattaforma solo SIEM, vai a Impostazioni > Feed.
- Fai clic su Aggiungi nuovo feed > Configura un singolo feed.
- Nome del 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'indirizzo 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 dell'origine: seleziona in base alle tue preferenze.
- 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 Storage Object Viewer 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'indirizzo email del account di servizio Google SecOps.
- Assegna ruoli: seleziona Visualizzatore oggetti Storage.
- Fai clic su Salva.
Tabella di mappatura UDM
| Campo del 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 |
Impostalo su Trellix. |
| N/D | metadata.product_name |
Imposta su Endpoint Security HX. |
| N/D | metadata.log_type |
Impostalo 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.