Regole di rilevamento composito

Supportato in:

Il rilevamento composito in Google SecOps prevede il collegamento di più regole YARA-L. Questo documento spiega come creare una regola composita. Per maggiori informazioni, consulta Panoramica dei rilevamenti compositi.

Comprendere la struttura della regola

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 è costituita dai seguenti componenti essenziali:

  • Sezione events: definisce gli input, ovvero i rilevamenti o gli eventi specifici che la regola analizza.

  • 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. 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.outcomes["dest_domain"] per accedere alla variabile dest_domain risultato.

  • 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 entrambe:

  • Valori dei metadati e dei risultati del rilevamento (detection.detection)
  • Eventi UDM sottostanti delle regole a cui viene fatto 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 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.

  • Fai 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 curati hanno ID nel formato ur_UUID. Ad esempio:

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

  • Fai riferimento a una regola in base al nome: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 trovarla. Ad esempio:

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

Input di unione 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 di corrispondenza.

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, consulta la sezione Sintassi della sezione Condizione.

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:

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

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

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