Creare regole di rilevamento composito

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 la panoramica dei rilevamenti compositi.

Comprendere la struttura delle regole

Le regole di rilevamento composito 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 che la regola analizza.

  • Sezione match: specifica come gli input devono essere collegati in una finestra temporale definita.

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

Definire gli input nella sezione events

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

Fare riferimento ai contenuti di rilevamento con variabili o etichette meta

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 maggiore flessibilità e una migliore compatibilità tra i diversi tipi di regole.

Ad esempio, più regole possono memorizzare una stringa (ad esempio un URL, un nome file o una chiave di 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 Collection.

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

  • Variabile outcome: dest_domain = "cymbal.com"

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

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

  • detection.detection.outcomes["dest_domain"] per accedere alla variabile outcome 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 outcome (detection.detection)
  • Eventi UDM sottostanti delle regole a cui viene fatto riferimento (collection_elements)

Fare riferimento ai contenuti di rilevamento con l'ID o il nome della regola

Puoi fare riferimento a una regola in base al nome o all'ID. Ti consigliamo questo approccio quando la logica di rilevamento dipende da regole specifiche e vuoi ridurre i dati analizzati solo ai risultati di queste regole. Fare riferimento alle regole pertinenti per nome o ID migliora il rendimento 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.

  • Fare riferimento a una regola in base all'ID regola (consigliato): utilizza il campo detection.detection.rule_id per fare riferimento a una regola in base all'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"

  • Fare riferimento a una regola in base al nome della regola: utilizza il campo detection.detection.rule_name per fare riferimento a una regola in base al nome. Puoi specificare il nome esatto della regola o utilizzare un'espressione regolare per farlo corrispondere. Ad esempio:

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

Unire gli input 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 di regole, variabili outcome, variabili match, campi di rilevamento o elementi di raccolta.

Per informazioni sulla sintassi, consulta Sintassi della sezione Match.

Regole composite: intervalli di tempo e finestre di salto

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

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

Ad esempio:

  1. Una regola composita ha finestre di salto di 60 minuti: Salto 1 (18:58 - 19:58) e Salto 2 (19:58 - 20:58).
  2. Un rilevamento del produttore upstream ha una finestra di 19:57:54 - 20:56:54 (durata di 59 minuti).
  3. Poiché la finestra del produttore è iniziata alle 19:57:54 (6 secondi prima della fine del Salto 1) e si è conclusa alle 20:56:54 (durante il Salto 2), si sovrappone a entrambe le finestre di salto.
  4. Vengono attivati due rilevamenti compositi (uno per il Salto 1 e uno per il Salto 2), contribuendo a evitare falsi negativi. Se la regola del produttore non corrispondesse alla sovrapposizione, il rilevamento parzialmente sovrapposto non verrebbe preso in considerazione per il Salto 1 o il Salto 2 e la correlazione tra il rilevamento e altri eventi andrebbe persa.

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

Definire 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, consulta Sintassi della sezione Condition.

Applicare 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:

  • Utilizzare variabili distinte per origine: assegna variabili evento univoche a ogni origine dati (ad esempio, $e per gli eventi, $d per i rilevamenti), dove 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.

  • Definire 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
}

Creare rilevamenti compositi sequenziali

I rilevamenti compositi sequenziali identificano pattern di eventi correlati in cui la sequenza di rilevamenti è importante, ad esempio un rilevamento di tentativi di accesso con attacco di forza bruta, 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 questo 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.outcomes["user"]
    $hostname = $d1.detection.detection.outcomes["hostname"]

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

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

$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.