Raccogli i log di Trellix Endpoint Security HX (in precedenza FireEye HX)

Versione parser: 30.0

Supportato in:

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

  1. Vai alla console Google Cloud.
  2. Seleziona il progetto.
  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 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
  6. Fai clic su Crea.

Raccogli le credenziali API di Trellix Endpoint Security HX

Recuperare l'URL della console HX

  1. Accedi alla console web Trellix Endpoint Security HX.
  2. Prendi nota dell'URL della console dalla barra degli indirizzi del browser (formato: https://<hx-hostname>:<port>).

Creare o verificare l'account utente API

  1. Accedi alla console Trellix HX con un account amministratore.
  2. Vai ad Amministrazione > Account utente.
  3. Crea un nuovo utente o selezionane uno esistente per l'accesso API.
  4. Assicurati che l'utente disponga del ruolo api_analyst o api_admin.
  5. 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

  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: fireeye-hx-collector-sa
    • Descrizione del service account: Service account for Cloud Run function to collect Trellix HX logs
  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. Storage Object Admin
    2. Cloud Run Invoker
    3. Cloud Functions Invoker
  6. Fai clic su Continua, poi su Fine.

Concedi autorizzazioni IAM sul bucket GCS

  1. Vai a Cloud Storage > Bucket.
  2. Fai clic sul nome del bucket (fireeye-hx-logs).
  3. Vai alla scheda Autorizzazioni.
  4. Fai clic su Concedi l'accesso.
  5. Aggiungi entità: inserisci l'email del account di servizio.
  6. Assegna i ruoli: seleziona Storage Object Admin.
  7. 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.

  1. Nella console Google Cloud, vai a Pub/Sub > Argomenti.
  2. Fai clic su Crea argomento.
  3. ID argomento: fireeye-hx-logs-trigger.
  4. Fai clic su Crea.

Crea una funzione Cloud Run per raccogliere i log

  1. Nella console Google Cloud, vai a Cloud Run.
  2. Fai clic su Crea servizio.
  3. Seleziona Funzione.
  4. Nella sezione Configura, fornisci i seguenti dettagli:

    Impostazione Valore
    Nome servizio fireeye-hx-collector
    Regione Seleziona la regione corrispondente al tuo bucket GCS
    Tempo di esecuzione Python 3.12 o versioni successive
  5. Nella sezione Trigger:

    1. Fai clic su + Aggiungi trigger.
    2. Seleziona Cloud Pub/Sub.
    3. In Seleziona un argomento Cloud Pub/Sub, scegli fireeye-hx-logs-trigger.
    4. Fai clic su Salva.
  6. Nella sezione Autenticazione, seleziona Richiedi autenticazione e seleziona Identity and Access Management (IAM).

  7. Scorri verso il basso fino a Container, networking, sicurezza.

  8. Nella scheda Sicurezza, seleziona il account di servizio fireeye-hx-collector-sa.

  9. Nella scheda Contenitori, fai clic su Variabili e secret e aggiungi quanto segue:

    Nome variabile Valore di esempio Descrizione
    GCS_BUCKET fireeye-hx-logs Nome bucket GCS
    GCS_PREFIX hx-alerts Prefisso per i file di log
    STATE_KEY hx-alerts/state.json Percorso file di stato
    HX_HOST https://hx-console.example.com:3000 URL della console HX
    HX_USER api_user Nome utente API
    HX_PASS api_password Password API
    MAX_RECORDS 1000 Numero massimo di record per esecuzione
    PAGE_SIZE 100 Record per pagina
    LOOKBACK_HOURS 24 Periodo di riferimento iniziale
  10. In Richieste, imposta Timeout richiesta su 600 secondi.

  11. Fai clic su Crea. Una volta creato il servizio, si aprirà l'editor di codice incorporato.

Aggiungi codice per la funzione

  1. Inserisci main nel campo Entry point (Punto di ingresso).
  2. 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.0
    
  3. Fai clic su Esegui il deployment per salvare la funzione ed eseguirne il deployment.

Crea job Cloud Scheduler

  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 fireeye-hx-collector-hourly
    Regione 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-trigger
    Corpo del messaggio {}
  4. Fai clic su Crea.

Testare l'integrazione

  1. In Cloud Scheduler, trova il job e fai clic su Forza esecuzione.
  2. Vai a Cloud Run > Servizi > Log per verificare la riuscita dell'operazione.
  3. Controlla Cloud Storage per verificare che esista un nuovo file .ndjson nella cartella hx-alerts/.

Configura un feed in Google SecOps

  1. Vai a Impostazioni SIEM > Feed.
  2. Fai clic su Aggiungi nuovo feed > Configura un singolo feed.
  3. Nome feed: Trellix HX Logs.
  4. Tipo di origine: Google Cloud Storage V2.
  5. Tipo di log: FireEye HX.
  6. Fai clic su Ottieni service account e copia l'email (ad es. chronicle-12345678@...).
  7. Fai clic su Avanti.
  8. URL del bucket di archiviazione: gs://fireeye-hx-logs/hx-alerts/ (includi la barra finale).
  9. Opzione di eliminazione della fonte: seleziona l'opzione che preferisci.
  10. 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.

  1. Vai a Cloud Storage > Bucket.
  2. Seleziona il bucket e vai alla scheda Autorizzazioni.
  3. Fai clic su Concedi l'accesso.
  4. Aggiungi entità: incolla l'email del account di servizio Google SecOps.
  5. Assegna ruoli: seleziona Visualizzatore oggetti Storage.
  6. 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.