Crea regole di rilevamento composite

Supportato in:

Questo documento fornisce una guida tecnica su come creare una regola composita all'interno della piattaforma Google Security Operations, un processo che prevede il collegamento di più regole YARA-L 2.0 per identificare pattern di attacco complessi. I rilevamenti compositi sono strutturati come regole a più eventi, mantenendo la stessa sintassi fondamentale delle regole standard a evento singolo. Per saperne di più, consulta Panoramica dei rilevamenti compositi.

Informazioni sulla struttura delle regole

Le regole di rilevamento composite sono sempre regole a più eventi e seguono la stessa struttura e sintassi di una regola a evento singolo.

Una regola composita ha i seguenti componenti essenziali:

  • Sezione events: definisce gli input, ovvero i rilevamenti o gli eventi specifici analizzati dalla regola.

  • Sezione match: specifica come devono essere collegati gli input in un intervallo di tempo definito.

  • Sezione condition: contiene la logica finale che determina se gli eventi uniti soddisfano i criteri per attivare un avviso.

Definisci gli input nella sezione events

Il primo passaggio per creare una regola di rilevamento composita consiste nel definire gli input della regola nella sezione events. Gli input per le regole composite provengono dalle raccolte, che archiviano i rilevamenti generati da altre query. Google SecOps fornisce i seguenti due metodi per accedere ai dati dalle raccolte.

Contenuti di rilevamento dei riferimenti con variabili o metaetichette

Per accedere ai dati di un rilevamento senza fare riferimento agli eventi UDM originali, puoi utilizzare le variabili outcome, le variabili match o le etichette meta. Ti consigliamo questo approccio perché offre una maggiore flessibilità e una migliore compatibilità tra i diversi tipi di regole.

Ad esempio, più regole possono memorizzare una stringa (come un URL, un nome file o una chiave del registro) in una variabile outcome comune se stai cercando quella stringa in contesti diversi. Per accedere a questa stringa da una regola composita, inizia con detection e individua le informazioni pertinenti utilizzando gli elementi della risorsa Raccolta.

Esempio: supponiamo che una regola di rilevamento produca le seguenti informazioni:

  • Variabile di risultato: dest_domain = "cymbal.com"

  • Campo UDM: target.hostname = "cymbal.com"

Nella regola composita, puoi accedere a questi dati utilizzando i seguenti percorsi:

  • detection.detection.variables["dest_domain"].string_val per accedere alla variabile di risultato dest_domain.

  • detection.collection_elements.references.event.target.hostname per accedere al campo UDM target.hostname.

  • detection.time_window.start_time.seconds per accedere al timestamp di inizio del rilevamento.

L'API Collection e l'API SecurityResult forniscono l'accesso a entrambi:

  • Metadati di rilevamento e valori dei risultati (detection.detection)
  • Eventi UDM sottostanti delle regole di riferimento (collection_elements)

Contenuti di rilevamento dei riferimenti con ID o nome della regola

Puoi fare riferimento a una regola in base al nome o all'ID. Consigliamo questo approccio quando la logica di rilevamento dipende da regole specifiche e vuoi ridurre i dati analizzati solo ai risultati di queste regole. Il riferimento a regole pertinenti per nome o ID migliora le prestazioni ed evita i timeout riducendo i dati analizzati. Ad esempio, puoi eseguire query direttamente sui campi come target.url o principal.ip da un rilevamento precedente noto.

  • Fai riferimento a una regola tramite l'ID regola (consigliato): utilizza il campo detection.detection.rule_id per fare riferimento a una regola tramite l'ID. Puoi trovare l'ID regola nell'URL della regola in Google SecOps. Le regole generate dagli utenti hanno ID nel formato ru_UUID, mentre i rilevamenti predefiniti hanno ID nel formato ur_UUID. Ad esempio:

    detection.detection.rule_id = "ru_e0d3f371-6832-4d20-b0ad-1f4e234acb2b"

  • Fai riferimento a una regola tramite il nome della regola: utilizza il campo detection.detection.rule_name per fare riferimento a una regola tramite il nome. Puoi specificare il nome esatto della regola o utilizzare un'espressione regolare per trovare una corrispondenza. Ad esempio:

    • detection.detection.rule_name = "My Rule Name"
    • detection.detection.rule_name = "/PartOfName/"

Input di join nella sezione match

Per collegare rilevamenti, eventi o entità correlati in una regola composita, definisci la sezione match utilizzando le variabili definite nella sezione events. Queste variabili possono includere etichette delle regole, variabili di risultato, variabili di corrispondenza, campi di rilevamento o elementi di raccolta.

Per informazioni sulla sintassi, vedi Sintassi della sezione Corrispondenza.

Regole composite: intervalli di tempo e finestre di hop

Le regole composite abbinano rilevamenti ed eventi a un intervallo di tempo anziché a un singolo punto nel tempo. Corrispondono a una finestra di hop composita se la finestra di rilevamento dell'input si sovrappone a quella di hop (ad esempio, l'attività era attiva durante quel periodo di tempo).

Un singolo rilevamento può attivare più avvisi se si estende sul confine tra finestre di hop adiacenti (a causa dei ritardi della pipeline, queste corrispondenze storiche vengono visualizzate in un secondo momento). In particolare, una finestra di hopping di una regola composita attiva una corrispondenza se la finestra temporale di rilevamento dell'input (da WindowStart a WindowEnd) si sovrappone alla finestra di hopping.

Ad esempio:

  1. Una regola composita ha finestre di hopping di 60 minuti: Hop 1 (18:58 - 19:58) e Hop 2 (19:58 - 20:58).
  2. Il rilevamento di un produttore upstream ha una finestra di 19:57:54 - 20:56:54 (durata di 59 minuti).
  3. Poiché la finestra del producer è iniziata alle 19:57:54 (6 secondi prima della fine della finestra di hopping 1) ed è terminata alle 20:56:54 (durante la finestra di hopping 2), si sovrappone a entrambe le finestre di hopping.
  4. In questo modo vengono attivate due rilevazioni composite (una per l'hop 1 e una per l'hop 2), contribuendo a evitare falsi negativi. Se la regola del producer non corrispondeva alla sovrapposizione, il rilevamento parzialmente sovrapposto non veniva preso in considerazione per l'hop 1 o l'hop 2 e la correlazione tra il rilevamento e altri eventi veniva persa.

Per ulteriori informazioni ed esempi su come specificare le finestre di hopping, consulta Finestre di hopping.

Definisci la sezione condition

Definisci la sezione condition per valutare i risultati della sezione match. Se la condizione è true, viene generato un avviso. Per informazioni sulla sintassi, vedi Sintassi della sezione Condizione.

Applica tecniche avanzate alle regole composite

Questa sezione spiega come applicare tecniche avanzate durante la creazione di regole composite.

Combinare eventi e rilevamenti

Le regole composite possono combinare più origini dati, inclusi eventi UDM, dati del grafico delle entità e campi di rilevamento. Si applicano le seguenti linee guida:

  • Utilizza variabili distinte per origine: assegna variabili evento uniche a ogni origine dati (ad esempio, $e per gli eventi, $d per i rilevamenti), in cui l'origine dati include eventi, entità e rilevamenti.

  • Unire le origini in base al contesto condiviso: collega le origini dati utilizzando valori comuni, come ID utente, indirizzi IP o nomi di dominio nelle condizioni della regola.

  • Definisci una finestra di corrispondenza: includi sempre una clausola match con una finestra temporale non superiore a 48 ore.

Esempio: combinazione di eventi e rilevamenti

rule CheckCuratedDetection_with_EDR_and_EG {
  meta:
    author = "noone@cymbal.com"
  events:
    $d.detection.detection.rule_name = /SCC: Custom Modules: Configurable Bad Domain/
    $d.detection.collection_elements.references.event.network.dns.questions.name = $domain
    $d.detection.collection_elements.references.event.principal.asset.hostname = $hostname

    $e.metadata.log_type = "LIMACHARLIE_EDR"
    $e.metadata.product_event_type = "NETWORK_CONNECTIONS"
    $domain = re.capture($e.principal.process.command_line, "\\s([a-zA-Z0-9.-]+\\.[a-zA-Z0-9.-]+)$")
    $hostname = re.capture($e.principal.hostname, "([^.]*)")

    $prevalence.graph.metadata.entity_type = "DOMAIN_NAME"
    $prevalence.graph.metadata.source_type = "DERIVED_CONTEXT"
    $prevalence.graph.entity.hostname = $domain
    $prevalence.graph.entity.domain.prevalence.day_count = 10
    $prevalence.graph.entity.domain.prevalence.rolling_max <= 5
    $prevalence.graph.entity.domain.prevalence.rolling_max > 0

  match:
    $hostname over 1h

  outcome:
    $risk_score = 80
    $CL_target = array($domain)

  condition:
    $e and $d and $prevalence
}

Crea rilevamenti compositi sequenziali

I rilevamenti compositi sequenziali identificano pattern di eventi correlati in cui la sequenza di rilevamenti è importante, ad esempio un rilevamento di un tentativo di accesso con attacco di tipo brute force, seguito da un accesso riuscito. Questi pattern possono combinare più rilevamenti di base, eventi UDM non elaborati o entrambi.

Per creare un rilevamento composito sequenziale, devi applicare l'ordine all'interno della regola. Per applicare la sequenza prevista, utilizza uno dei seguenti metodi:

  • Finestre scorrevoli: definisci la sequenza di rilevamenti utilizzando le finestre scorrevoli nelle condizioni match.

  • Confronti dei timestamp:confronta i timestamp dei rilevamenti all'interno della logica della regola per verificare che si verifichino nell'ordine selezionato.

Esempio: rilevamenti compositi sequenziali

events:
    $d1.detection.detection.rule_name = "fileEvent_rule"
    $userid = $d1.detection.detection.variables["user"].string_val
    $hostname = $d1.detection.detection.variables["hostname"].string_val

    $d2.detection.detection.rule_name = "processExecution_rule"
    $userid = $d2.detection.detection.variables["user"].string_val
    $hostname = $d2.detection.detection.variables["hostname"].string_val

    $d3.detection.detection.rule_name = "networkEvent_rule"
    $userid = $d3.detection.detection.variables["user"].string_val
    $hostname = $d3.detection.detection.variables["hostname"].string_val

$d3.detection.collection_elements.references.event.metadata.event_timestamp.seconds > $d2.detection.collection_elements.references.event.metadata.event_timestamp.seconds

  match:
    $userid over 24h after $d1

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