Utilizzare le tabelle di dati

Supportato in:

Le tabelle di dati sono costrutti di dati multicolonna che ti consentono di inserire i dati in Google Security Operations. Le tabelle di dati possono fungere da tabelle di ricerca con colonne definite e i dati archiviati in righe. Puoi creare o importare una tabella di dati nel tuo account Google SecOps utilizzando l'interfaccia web di Google SecOps, l'API delle tabelle di dati o una query Panoramica di YARA-L 2.0.

Assegnare ambiti alle tabelle di dati utilizzando RBAC per i dati

Per utilizzare le tabelle di dati, devi assegnare gli ambiti alle tabelle di dati utilizzando il controllo dell'accesso basato sui ruoli (RBAC) dei dati. Assegnando ambiti a una tabella di dati, puoi controllare quali utenti e risorse possono accedervi e utilizzarla. Per saperne di più, consulta Configurare il controllo dell'accesso basato sui ruoli per le tabelle di dati.

Gestire le tabelle di dati utilizzando l'interfaccia web di Google SecOps

Le sezioni seguenti descrivono come gestire le tabelle di dati utilizzando l'interfaccia web, incluso come accedere alle tabelle di dati, aggiungerne una nuova, modificarne i contenuti, aggiungere righe e rimuovere una tabella di dati dal tuo account.

Accedere alle tabelle di dati

Per accedere alla pagina Tabelle di dati:

  • Nella barra laterale, seleziona Indagine > Tabelle di dati.

Per trovare una tabella di dati specifica, inserisci il nome nel campo Cerca nella parte superiore della barra laterale Tabelle di dati.

Aggiungere una nuova tabella di dati

Quando aggiungi una nuova tabella di dati, puoi inserire manualmente i dati CSV, incollarli o importare un file CSV o TSV nella tabella di dati.

Le seguenti configurazioni sono permanenti e non possono essere modificate dopo il salvataggio di una nuova tabella di dati:

Per aggiungere una nuova tabella di dati a Google SecOps:

  1. Nella barra laterale, seleziona Indagine > Tabelle di dati.

  2. Nella parte superiore della barra laterale Tabelle di dati, fai clic su Crea.

  3. Nella finestra di dialogo Crea nuova tabella di dati, assegna un nome alla tabella e, facoltativamente, aggiungi una descrizione.

  4. Esegui una delle seguenti operazioni:

    • Inserisci manualmente i dati CSV o incollali nell'area Testo (modalità di modifica).
    • Per importare i dati da un file CSV o TSV nella tabella dei dati:
    1. Fai clic su Importa file.
    2. Vai al file e fai clic su Apri. Viene visualizzata la finestra di dialogo Importa file.
    3. Se hai selezionato un file TSV nel passaggio precedente, procedi nel seguente modo:
      1. Dall'elenco Tipo di separatore, seleziona Rileva automaticamente o Tabulazione.
      2. Nell'elenco Avvia importazione dalla riga, specifica la riga del file da cui importare i dati.
    4. Fai clic su Importa dati.
  5. Seleziona la modalità di modifica Tabella e configura quanto segue in base alle esigenze:

  6. Fai clic su Salva. La nuova tabella dati viene visualizzata nella barra laterale Tabelle dati ed è pronta per accettare dati aggiuntivi.

Mappare i tipi di dati alle colonne della tabella dei dati

Quando aggiungi una nuova tabella di dati, puoi mappare i tipi di dati (stringa, espressione regolare, CIDR o numero) alle colonne della tabella di dati.

Puoi mappare i campi dati singoli a una colonna di dati e mappare i campi dati ripetuti a una colonna di dati utilizzando l'interfaccia web o l'API, nel seguente modo:

  • Sia nell'interfaccia web che nell'API, separa i valori dei campi di dati utilizzando una barra verticale (|). Nell'interfaccia web, se un valore include una barra verticale (|), viene trattato come un valore ripetuto per impostazione predefinita.

  • Per le richieste API, imposta repeated_values su true.

Per saperne di più, consulta Campi ripetuti.

Nell'esempio seguente, la colonna Field_value della tabella dei dati contiene valori per più campi:

Field_value Field_name
altostrat.com FQDN
192.0.2.135 IP
charlie userid
esempio nome host

La tabella precedente è suddivisa in quattro colonne, ognuna delle quali è mappata a un solo tipo di campo prima di poter essere utilizzata per uno qualsiasi dei casi d'uso della tabella dei dati presentati in questo documento.

FQDN IP Userid Nome host
altostrat.com 192.0.2.135 charlie esempio

Designare le colonne chiave

Quando aggiungi una nuova tabella di dati, puoi designare colonne specifiche come colonne chiave.

Contrassegnare una colonna come colonna chiave identifica in modo univoco i valori di quella colonna, impedisce la duplicazione dei dati e migliora il rilevamento dei dati per regole e ricerche.

Designare colonne per supportare i campi ripetuti

Quando aggiungi una nuova tabella di dati, puoi designare colonne specifiche per supportare i campi ripetuti.

Le colonne destinate ad archiviare campi multivalore o campi ripetuti devono essere designate esplicitamente come ripetute al momento della creazione della tabella di dati.

Mappare i nomi delle colonne ai campi delle entità (facoltativo)

Quando aggiungi una nuova tabella dati, puoi mappare i nomi delle colonne della tabella dati ai campi entità.

Nella seguente tabella di dati di esempio, le colonne Userid e Role sono mappate rispettivamente a entity.user.userid e entity.user.attribute.role.name:

Userid
(map to entity.user.userid)
Email Ruolo
(mappa a entity.user.attribute.role.name)
jack jack123@gmail.com amministratore
tony tony123@gmail.com ingegnere

Puoi mappare una colonna della tabella di dati a un campo proto dell'entità utilizzando il campo mapped_column_path della risorsa DataTable.

Per le colonne senza un percorso dell'entità definito, come Email in questa tabella di esempio, devi specificare manualmente un tipo di dati. Come per gli elenchi di riferimento, i tipi di dati supportati per le tabelle di dati sono number, string, regex e cidr.

Puoi includere colonne mappate e non mappate in una tabella di dati specificando una condizione join.

Le colonne non mappate vengono archiviate nel campo additional dell'entità a cui è unita la tabella. Questi vengono aggiunti come coppie chiave-valore, dove key è il nome della colonna e value è il valore della riga corrispondente.

Aggiungere una nuova riga a una tabella di dati

Per aggiungere una nuova riga:

  1. Nella scheda Dettagli, seleziona la modalità di modifica Tabella.
  2. Fai clic con il tasto destro del mouse su una riga esistente e seleziona Aggiungi riga sopra.
  3. Inserisci i dati per una nuova riga. La prima riga viene trattata come intestazione della tabella. Assicurati di abbinare ogni elemento di dati alla colonna di dati e al tipo di dati appropriati.
  4. Fai clic su Salva.

Modificare una riga in una tabella di dati

Per modificare una riga:

  1. Fai clic sul campo che vuoi modificare. Il campo diventa modificabile.
  2. Apporta le modifiche.
  3. Fai clic su Salva.

Cercare righe della tabella dati

Puoi cercare informazioni specifiche all'interno di una tabella di dati utilizzando l'interfaccia web. Nella scheda Dettagli, inserisci una stringa di ricerca nel campo di ricerca e fai clic su Cerca. Vengono visualizzate le righe contenenti la stringa di ricerca.

Gestisci il TTL della riga della tabella

Per gestire il valore di durata (TTL) per le righe della tabella:

  1. Fai clic su Mostra TTL per riga. Viene visualizzata una colonna TTL che indica se ogni riga è scaduta. Se non è scaduto, viene visualizzato il tempo rimanente prima della scadenza.

  2. Fai clic sul tempo di scadenza predefinita delle righe per visualizzare la finestra di dialogo Aggiorna scadenza predefinita delle righe e regolare il TTL delle righe della tabella.

  3. Inserisci un nuovo valore TTL in Ore o Giorni. Il valore minimo è 24 ore. Il valore massimo è 365 giorni.

  4. Fai clic su Salva.

Eliminare una riga della tabella

Per eliminare una riga, fai clic con il tasto destro del mouse sulla riga e seleziona Elimina riga/e.

Per eliminare più righe, seleziona ogni riga da rimuovere. Poi fai clic con il tasto destro del mouse su una riga selezionata e scegli Elimina riga/e.

Rimuovere una tabella di dati

Per rimuovere una tabella di dati:

  1. Seleziona una tabella di dati dall'elenco Tabelle di dati nella barra laterale.

  2. Fai clic su Elimina.

Gestire le tabelle di dati utilizzando l'API Chronicle

Puoi anche utilizzare le risorse REST disponibili nell'API Chronicle per gestire le tabelle di dati in Google SecOps. L'API può replicare tutte le funzionalità disponibili nell'interfaccia web e include alcune funzionalità aggiuntive che consentono di gestire le tabelle di dati con prestazioni migliori e su una scala più ampia.

Ecco le risorse REST della tabella di dati:

Esempio: sintassi del filtro

Il seguente esempio di API Chronicle mostra come utilizzare la sintassi filter per cercare google.com nelle righe della tabella di dati:

curl -X GET \
  -H "Authorization: Bearer $(gcloud auth print-access-token)" \
  -H "Content-Type: application/json" \
  "https://staging-chronicle.sandbox.googleapis.com/v1alpha/projects/{$PROJECT}/locations/${REGION}/instances/${INSTANCE}/dataTables/${DATA_TABLE_NAME}/dataTableRows?filter=google.com"

Utilizzare le tabelle di dati in Google SecOps

Dopo aver aggiunto le tabelle di dati all'istanza di Google SecOps, puoi utilizzarle per filtrare, migliorare e arricchire i dati utilizzando le query YARA-L. Questo documento include numerosi esempi nella sintassi YARA-L, che puoi incorporare in Google SecOps.

Puoi utilizzare le tabelle di dati insieme alle query YARA-L sia nella ricerca che nelle regole.

Le tabelle di dati possono essere utilizzate nei seguenti modi:

Filtrare i dati di eventi ed entità UDM utilizzando una tabella di dati

Puoi filtrare gli eventi e le entità UDM confrontandoli con le voci di una tabella di dati. Unisci la tabella dei dati a un evento o a un'entità UDM utilizzando confronti basati sulle righe o basati sulle colonne.

Confronti basati su righe e colonne nelle tabelle di dati

Tipo di confronto Logica chiave Operatori comuni Sintassi di esempio Quando utilizzarlo
Basato sulle righe Tutte le condizioni devono corrispondere ALL'INTERNO DELLA STESSA riga =, !=, >, >=, <, <= $e.field = %table.col_a Quando la relazione tra più valori di colonna nella stessa riga è importante.
Basato sulle colonne Il valore deve esistere OVUNQUE nella colonna IN, IN regex, IN cidr $e.field IN %table.col_b Quando controlli la presenza di un valore all'interno di un insieme di valori in una singola colonna.

Collega gli eventi UDM alle tabelle di dati utilizzando i metodi di confronto basati sulle righe o basati sulle colonne:

  • Per collegare gli eventi UDM alle tabelle di dati utilizzando il confronto basato sulle righe, utilizza gli operatori di uguaglianza (=, !=, >, >=, <, <=).

    Ad esempio: $<udm_variable>.<field_path> = %<data_table_name>.<column_name>

    • Se utilizzi più istruzioni di confronto, tutti i campi o le condizioni devono corrispondere alla stessa riga della tabella dei dati.
    • Per utilizzare gli operatori (ad esempio not, !=, >, >=, <, <=) nella query, devi includere almeno una condizione join tra i campi UDM e le righe della tabella di dati.

    • Google SecOps considera qualsiasi regola con una tabella di dati join come una regola multi-evento, che richiede una sezione match nella definizione della regola.

  • Per filtrare i dati in base ai valori corrispondenti degli eventi UDM rispetto alle righe della tabella dei dati, considera la seguente sintassi di join:

    • Sintassi di join corretta:

      L'"esclusione combinata" basata sulle righe richiede, ad esempio, un join left outer e una clausola where che controlla nulls.

    • Sintassi di join errata:

      Non racchiudere NOT in più condizioni di uguaglianza basate sulle righe. Questa sintassi non produce un effetto di "esclusione se viene trovata questa combinazione".

      Ad esempio, non utilizzare questa sintassi: NOT (field1 = %table.col1 AND field2 = %table.col2)

      Questo perché la corrispondenza viene comunque applicata riga per riga. Se una qualsiasi riga non soddisfa la condizione combinata interna, NOT fa sì che la valutazione della riga sia true, includendo potenzialmente l'evento anziché escluderlo.

  • Per utilizzare una colonna della tabella di dati di tipo CIDR o regex per il confronto basato sulle righe, utilizza la seguente sintassi:

    net.ip_in_range_cidr($e.principal.ip, %<data_table_name>.<column_name>)
    
      re.regex($e.principal.hostname, %<data_table_name>.<column_name>)
    
  • Per collegare gli eventi UDM alle tabelle di dati utilizzando il confronto basato sulle colonne, utilizza la parola chiave in.

    Ad esempio: $<udm_variable>.<field_path> in %<data_table_name>.<column_name>

  • Per filtrare gli eventi in cui il valore del campo esiste nella colonna specificata (ad esempio, una blocklist o una consent list), utilizza questa sintassi: NOT (... IN %table.column)

    Ad esempio: not ($evt_username in %my_data_table.username)

  • Per utilizzare una colonna della tabella dei dati di tipo CIDR o regex per il confronto basato sulle colonne, utilizza la seguente sintassi:

    $e.principal.ip in cidr %cidr_data_table.column_name
    
    $e.principal.hostname in regex %regex_data_table.column_name
    
  • Quando confronti colonne nelle tabelle di dati che sono tipi di dati CIDR o espressioni regolari, le parole chiave cidr e regex sono facoltative.

  • Puoi anche utilizzare l'operatore not con le tabelle di dati.

    La seguente query di esempio filtra le voci in cui gli indirizzi IP ($e.principal.ip) non corrispondono a nessuno degli intervalli CIDR elencati nella colonna benign_ip in cidr_data_table:

    not $e.principal.ip in %data_table.benign_ip
    

Utilizzare una tabella di dati come elenco di riferimento a più colonne

Puoi utilizzare una tabella di dati come elenco di riferimento a più colonne. Sebbene un elenco di riferimento possa accedere ai dati in una singola dimensione (una colonna), le tabelle di dati supportano più colonne, consentendoti di filtrare e accedere ai dati in diverse dimensioni.

Puoi collegare gli eventi UDM a una tabella di dati utilizzando la parola chiave in per il confronto basato sulle colonne, in modo da confrontare i valori di un campo UDM specifico con i valori di una singola colonna della tabella di dati.

Nell'esempio seguente, la tabella dei dati badApps contiene due colonne: hostname e ip. La query corrisponde a entrambi i valori (valore basato sul campo UDM e valore basato sulla tabella di dati, entrambi di tipo stringa) in modo indipendente.

  • Esempio di regola:

    rule udm_in_data_table {
    meta:
      description = "Use data table as multicolumn reference list"
    events:
      $e.metadata.event_type = "NETWORK_CONNECTION"
      $e.security_result.action = "ALLOW"
      $e.target.asset.asset_id = $assetid
    
      // Event hostname matches at least one value in table column hostname.
      $e.target.hostname in %badApps.hostname
    
      // Event IP matches at least one value in table column ip.
      $e.target.ip in %badApps.ip
    
    match:
      $assetid over 1h
    
    condition:
      $e
    }
    
  • Esempio di ricerca:

    events:
      $e.metadata.event_type = "NETWORK_CONNECTION"
      $e.security_result.action = "ALLOW"
      $e.target.asset.asset_id = $assetid
    
      // Event hostname matches at least one value in table column hostname.
      $e.target.hostname in %badApps.hostname
    
      // Event IP matches at least one value in table column ip.
      $e.target.ip in %badApps.ip
    

Join basati sulle righe tra una tabella di dati e un evento o un'entità UDM

Puoi collegare gli eventi UDM a una tabella di dati utilizzando gli operatori di uguaglianza e confronto (=, !=, >, >=, <, <=) per eseguire confronti basati sulle righe. Questo approccio consente di filtrare i dati in base ai valori corrispondenti degli eventi UDM rispetto alle righe della tabella di dati. Se utilizzi più istruzioni di confronto, tutti i campi o le condizioni devono corrispondere alla stessa riga della tabella di dati.

Per utilizzare gli operatori (ad esempio not, !=, >, >=, <, <=) nella query, devi includere almeno una condizione join tra i campi UDM e le righe della tabella di dati. Google SecOps considera qualsiasi regola con una tabella di dati join come una regola multi-evento, che richiede una sezione match corrispondente nella definizione della regola.

Quando si verifica un join, le righe della tabella di dati collegata sono visibili nella Ricerca. Per saperne di più, vedi Visualizzare le righe della tabella di dati nella ricerca.

  • I segnaposto sono supportati per le tabelle di dati nella sezione event di una query, ma devono essere collegati a un evento UDM o a un'entità UDM.

    L'esempio seguente utilizza una colonna della tabella dei dati di tipo string.

    • Questo esempio di query YARA-L verifica se un evento di accesso utente corrisponde a una riga in example_table.

    • Una condizione è che user ID esista in example_table.

    • Entrambe le condizioni devono corrispondere alla stessa riga in example_table affinché la regola venga attivata.

// Check if a user exists in a data table and that the user is active for all user login events.

Esempio di regola:

// Check if user exists in a data table and is active in all user login events.
rule udm_join_data_table {

meta:
  description = "Join data table with UDM event"

events:
  $e.metadata.event_type = "USER_LOGIN"
  $e.security_result.action = "ALLOW"
  $e.principal.user.userid = $userid

// Event must match at least 1 row in the data table 
// where the uid in the data table row is the userid on the event 
// and the active date in the same data table row is before the event timestamp.
%example_table.uid = $userid
$e.principal.hostname = %example_table.hostname

match:
  $userid over 1h

condition:
  $e
}

Esempio di ricerca:

events:
$e.metadata.event_type = "USER_LOGIN"
$e.security_result.action = "ALLOW"
$e.principal.user.userid = $userid

// Event must match at least 1 row in the data table 
// where the uid in the data table row is the userid on the event 
// and the active date in the same data table row is before the event timestamp

%example_table.uid = $userid
$e.principal.hostname = %example_table.hostname
  • Il seguente esempio illustra come funzionano insieme una tabella di dati e i dati degli eventi UDM.

    In base alla logica della query YARA-L precedente, un utente con user ID 32452 viene visualizzato nel rilevamento come hostname dell'utente dal sistema e corrisponde a hostname nella tabella dei dati.

    Tabella di dati
    uid title hostname
    32452 HR host1
    64452 Finanza host2
    46364 IT host3

    Tabella degli eventi UDM
    principal metadati security_result principal
    32452 USER_LOGIN CONSENTI host1
    64589 USER_LOGIN CONSENTI host9
    87352 USER_LOGIN CONSENTI host4

Scrivere i risultati delle query YARA-L nelle tabelle di dati

Puoi scrivere i risultati delle query YARA-L in una tabella di dati. Utilizzando questa funzionalità, puoi creare tabelle di dati dai tuoi dati Google SecOps e utilizzarle per filtrare e migliorare altri dati.

Puoi utilizzare la sintassi di scrittura delle query YARA-L per:

  • Definisci la sintassi YARA-L per scrivere i risultati delle query nelle tabelle di dati.

  • Utilizza le tabelle di dati per la threat intelligence, la risposta agli incidenti e altri casi d'uso della sicurezza.

  • I dati devono essere conformi alla sintassi e alle convenzioni di YARA-L.

Scrivere rilevamenti e avvisi nelle tabelle di dati utilizzando YARA-L

Puoi utilizzare una query YARA-L per inviare rilevamenti e avvisi alle tabelle di dati.

Utilizzando la funzione write_row, puoi sovrascrivere una riga di una tabella di dati con la chiave corrispondente nella tabella di dati utilizzando i risultati di una regola. Se la chiave non è presente nella tabella, aggiungi una nuova riga.

Specifica la funzione write_row nella sezione di esportazione di una query YARA-L. La scrittura dei dati nella tabella dei dati deve essere l'azione finale della query. Di conseguenza, le variabili di risultato vengono scritte nella tabella dei dati.

export:
  %<data_table_name>.write_row(
  data_table_column_x_name: <value>,
  data_table_column_y_name: <value>,
  ...,
  ...,
  data_table_column_z_name: <value>
)
// depending on the key column(s), the rows will be updated for existing keys 
and appended for new keys

Modificare una tabella di dati utilizzando YARA-L

Di seguito viene mostrato come modificare una tabella di dati utilizzando YARA-L:

TableName: ip_user_domain_table (le colonne chiave per la chiave primaria vengono definite al momento della creazione)

Indirizzo IP employee_id* dominio
192.0.2.10 Dana altostrat.com
192.0.2.20 Quinn altostrat.com
192.0.2.30 Lee cymbalgroup.com

* indica la chiave primaria.

La seguente query acquisisce combinazioni uniche di principal.ip, principal.user.employee_id e target.domain. Filtra i risultati in base alla prevalenza di target.domain:

events:
  $e.principal.ip = $principal_ip
  $e.principal.user.employee_id = $principal_user_employee_id
  $e.target.domain.name = $target_domain
  $e.target.domain.prevalence.day_count < 5

// To run this query as a rule, add Condition Section here 
// condition:$e

Risultati della query:

ip empid dominio
192.0.2.10 Dana altostrat.com
192.0.2.30 Lee examplepetstore.com
192.0.2.20 Quinn altostrat.com

Esempio: utilizza write_row per scrivere l'output della query in una tabella di dati

Esempio di regola:

  rule udm_write_data_table {
  meta:
      description = "Writeto data table"
  events:
    $e.principal.user.employee_id = $principal_user_employee_id
    $e.target.domain.name = $target_domain
    $e.target.domain.prevalence.day_count < 5

  outcome:
    $hostname = $target_domain
    $principal_emp_id = $principal_user_employee_id
  
  condition:
    $e

  export:
    %ips_with_hostnames.write_row(
        employeeid:$principal_emp_id,
        hostname:$hostname
    )
  }
  • Esempio di ricerca:

    events:
      $e.principal.user.employee_id = $principal_user_employee_id
      $e.target.domain.name = $target_domain
      $e.target.domain.prevalence.day_count < 5
    
    outcome:
      $hostname = $target_domain
      $principal_emp_id = $principal_user_employee_id
    
    export:
      %ips_with_hostnames.write_row(
        employeeid:$principal_emp_id,
        hostname:$hostname
      )
    

Esempio: Understanding write_row

Nell'esempio seguente, user e ip vengono utilizzati come chiavi primarie. Ogni rilevamento che persiste nella tabella dei rilevamenti comporta una valutazione della chiamata di funzione nella sezione di esportazione della query.

Esempio di regola:

  rule udm_write_data_table {
  meta:
    description = "Write data table"
  events:
    $e.metadata.event_type = "USER_LOGIN"
    all $e.security_result.action != "BLOCK"
    all $e.security_result.action != "UNKNOWN_ACTION"

    $user = $e.principal.user.userid
    $ip = $e.target.ip
    $ts = $e.metadata.event_timestamp.seconds

  match:
    $user, $ip over 1h

  outcome:
    $first_seen = min($ts)

  condition:
    $e

  export:
    %successful_logins.write_row(user:$user, ip:$ip)
  }
  • Esempio di ricerca:

    events:
      $e.metadata.event_type = "USER_LOGIN"
      all $e.security_result.action != "BLOCK"
      all $e.security_result.action != "UNKNOWN_ACTION"
    
      $ts = $e.metadata.event_timestamp.seconds
    
    outcome:
      $user = $e.principal.user.userid
      $ip = $e.target.ip[0]
    
    export:
      %successful_logins.write_row(user:$user, ip:$ip)
    

    Ecco i dati dell'evento:

    metadata: {
      event_type: USER_LOGIN
      event_timestamp: { seconds: 1283299200 }
    }
    principal: {
      user: {
        userid: "charlie"
      }
    }
    target: {
      ip: ["192.0.2.135", "192.0.2.136"]
    }
    security_result: {
      action: ALLOW
    }
    
  • Quando questa query viene eseguita come regola, vengono restituiti i seguenti rilevamenti:

    ID rilevamento Match $user Match $ip
    0 charlie 192.0.2.135
    1 charlie 192.0.2.136

    La tabella dei dati contiene quanto segue:

    user ip
    charlie 192.0.2.135
    charlie 192.0.2.136
  • La seguente query di ricerca illustra il supporto offerto nella ricerca per la scrittura di valori scalari nelle tabelle di dati.

    events:
      $e.metadata.event_type = "NETWORK_CONNECTION"
    
    export:
      %summary_table.write_row(col_name: $e.metadata.product_name, Vendor_name: $e.metadata.vendor_name)
    

Arricchire il grafico delle entità con una tabella dati

Puoi utilizzare le tabelle di dati per aggiungere, rimuovere o sostituire le entità presentate in un grafico delle entità dalle regole. Utilizza le funzioni nella sezione setup della regola per indicare in che modo la tabella dei dati deve essere unita, aggiunta o utilizzata per rimuovere le entità dagli eventi entità a cui viene fatto riferimento nella sezione events.

Puoi utilizzare il seguente modello di regola per modificare un grafico delle entità:

rule entity_graph_template {

  meta:
    ...

  setup:
    // import the data table into entity graph
    <enrichment_keyword> <join_condition>

  events:
    ...

  match:
    ...

  condition:
    ...
}

Puoi utilizzare le seguenti funzioni YARA-L 2.0 per migliorare il grafico delle entità con una tabella di dati:

  • graph_override: sovrascrivi le righe nel grafico delle entità che corrispondono alla condizione di unione con i dati della tabella dei dati.

    Ad esempio: [graph_override](?tab=t.0#heading=h.v0fps7eke1if)

  • graph_append: aggiunge le righe della tabella di dati alle righe del grafico delle entità. L'operazione graph_append richiede un array che includa una variabile della tabella di dati e una variabile evento entità anziché una condizione di unione.

    Nell'esempio seguente, $g1 è la variabile del grafico delle entità e example_table è la tabella dei dati: graph_append [$g1, %example_table]

    Per la funzione append, le tabelle di dati devono includere le seguenti colonne per convalidare l'entità:

    • start_time (mappato su metadata.interval.start_time.seconds)

    • end_time (mappato su metadata.interval.end_time.seconds)

    Non è possibile mappare le colonne della tabella di dati ai campi dei metadati utilizzando l'interfaccia web. Per i casi d'uso di append, le tabelle di dati devono essere create utilizzando l'API Chronicle (https://cloud.google.com/chronicle/docs/reference/rest/v1alpha/projects.locations.instances.dataTables/create)

  • graph_exclude: rimuovi le righe nel grafico delle entità che corrispondono alla condizione join.

    Ad esempio: [graph_exclude](?tab=t.0#heading=h.o0qbb5paki6g)

La condizione di join deve essere un'espressione di uguaglianza tra la colonna della tabella dati e il campo del grafico delle entità. Per le funzioni graph_override e graph_exclude, la sintassi per accedere a una tabella di dati è la seguente:

<data_table_name>.<column_name>

Qualsiasi filtro specificato per <entity_variable> nella sezione degli eventi viene applicato dopo il miglioramento con la tabella dei dati.

Dopo che l'entità nel grafico delle entità è stata arricchita con l'entità nella tabella di dati, la variabile dell'entità nel grafico delle entità deve essere unita all'entità UDM.

Eseguire l'override del grafico delle entità con i dati della tabella dati

Con la funzione graph_override, i campi presenti sia nel grafico delle entità sia nella tabella dei dati vengono sostituiti con i campi della tabella dei dati. I campi presenti nel grafico delle entità e non nella tabella di dati rimangono invariati. Sono inclusi i campi non presenti nel grafico delle entità, ma presenti nella tabella dei dati.

Solo le colonne della tabella dei dati mappate eseguono l'override delle colonne del grafico delle entità. Le colonne non mappate vengono aggiunte al campo additional del grafico delle entità a cui è unita la tabella dati.

Esempio: corrispondenza in una singola unione

Nell'esempio seguente, le righe del grafico delle entità che corrispondono alla condizione di join tra la colonna della tabella di dati e il campo del grafico delle entità ($g1.graph.entity.ip = %example_table.my_ip) vengono sostituite dalla tabella di dati.

rule rule_override {
  meta:
    description = "Override entity context with data table before joining with UDM event"

  setup:
    //Rows in the entity graph that match the join condition are overridden by the data table
    graph_override ($g1.graph.entity.ip = %example_table.my_ip)

  events:
    $e.metadata.event_type = "NETWORK_CONNECTION"
    $e.security_result.action = "ALLOW"

    // Filter will be applied after graph is overridden by data table
    $g1.graph.entity.hostname = "ftp01"

    // Accessing unmapped columns
    $g1.graph.additional.fields["Owner"] = "alice"

    // Joining the UDM event with the enriched entity graph
    $e.target.ip = $iocip
    $g1.graph.entity.ip = $iocip

  match:
    $iocip over 1h

  condition:
    $e and $g1
}

Per utilizzare una colonna non mappata (ad esempio "Proprietario") della tabella di dati, utilizza un'istruzione equivalente per $g1.graph.entity.owner = "alice" is $g1.graph.additional.fields["Owner"] = "alice". Questo perché tutte le colonne non mappate della tabella dei dati vengono inserite nel campo additional del grafico delle entità ($g1).

Le tabelle seguenti illustrano un'operazione di override in cui le righe nel grafico delle entità vengono arricchite quando il campo IP nella tabella dei dati corrisponde al campo IP nel grafico delle entità.

Grafico delle entità esistente
Nome host IP MAC
ftp01 10.1.1.4 …:01
www01 10.1.1.5 …:02
Tabella di dati
Nome host IP MAC Proprietario
ftp01 10.1.1.4 …:bb alice
h1 10.1.1.6 …:cc bob
h2 10.1.1.7 …:gg chris
h3 10.1.1.4 …:ee doug

Grafico delle entità arricchito
Nome host IP MAC Proprietario
ftp01 10.1.1.4 …:bb alice
www01 10.1.1.5 …:02
h3 10.1.1.4 …:ee doug

Esempio: corrispondenza su più unioni

Nel seguente esempio, le righe nel grafico delle entità che corrispondono alle più condizioni di join ($g1.graph.entity.ip = %example_table.my_ip e $g1.graph.entity.hostname = %example_table.my_hostname) vengono sostituite dalla tabella di dati.

rule rule_override {
meta:
    description = "Override Entity context with Data Table before joining with UDM event"
setup:
  // example with more than one condition
  graph_override ($g1.graph.entity.ip = %example_table.my_ip and
  $g1.graph.entity.hostname = %example_table.my_hostname) 
events:
  $e.metadata.event_type = "NETWORK_CONNECTION"
  $e.security_result.action = "ALLOW"

  // Filter will be applied after graph is overridden by data table
  $g1.graph.entity.hostname = "ftp01"

  // joining the UDM event with the enriched entity graph
  $e.target.ip = $iocip
  $g1.graph.entity.ip = $iocip

match:
  $iocip over 1h

condition:
  $e and $g1
}

Le tabelle seguenti illustrano un'operazione di override in cui le righe del grafico delle entità vengono arricchite quando sia il campo IP sia il campo nome host nella tabella dei dati corrispondono al campo IP e al campo nome host nel grafico delle entità.

Grafico delle entità esistente
Nome host IP MAC
ftp01 10.1.1.4 …:01
www01 10.1.1.5 …:02
Tabella di dati
Nome host IP MAC Proprietario
ftp01 10.1.1.4 …:bb alice
h1 10.1.1.5 …:cc bob
h2 10.1.1.6 …:dd chris
h3 10.1.1.4 …:ee doug
Grafico delle entità arricchito
Nome host IP MAC Proprietario
ftp01 10.1.1.4 …:bb alice
www01 10.1.1.5 …:02

Aggiungere i dati dalla tabella dati al grafico delle entità

Con la funzione graph_append, non è necessaria alcuna condizione di join.

Nell'esempio seguente, tutte le righe della tabella dei dati vengono aggiunte alle righe del grafico delle entità.

rule rule_append {
meta:
  description = "Data table append entity"
   
setup:
  graph_append [$g1, %example_table]

events:
    // filter UDM events
  $e.metadata.event_type = "NETWORK_CONNECTION"
  $e.security_result.action = "ALLOW"

  // Join the filtered UDM events with the enriched graph
  $e.target.ip = $iocip
  $g1.graph.entity.ip = $iocip

match:
  $iocip over 1h

condition:
  $e and $g1
}

La seguente tabella di esempio illustra un'operazione di accodamento in cui le righe della tabella di dati vengono accodate alle righe del grafico delle entità:

Grafico delle entità esistente
Nome host IP MAC
ftp01 10.1.1.4 …:01
www01 10.1.1.5 …:02
Tabella di dati
IP MAC Proprietario
10.1.1.4 …:01 alice
10.1.1.6 …:cc bob
10.1.1.7 …:gg chris
10.1.1.4 …:ee doug
Grafico delle entità arricchito
Nome host IP MAC Proprietario
ftp01 10.1.1.4 …:01
www01 10.1.1.5 …:02
10.1.1.4 …:bb alice
10.1.1.6 …:cc bob
10.1.1.7 …:gg chris
10.1.1.4 …:ee doug

Utilizza graph_exclude per rimuovere righe dal grafico delle entità

Con la funzione graph_exclude, le righe del grafico delle entità che corrispondono alla condizione di join vengono rimosse dal grafico delle entità.

Nell'esempio seguente, vengono rimosse tutte le righe nel grafico delle entità che corrispondono alla condizione di join specificata (tra la colonna della tabella di dati e il campo del grafico delle entità). Nessuna riga della tabella di dati viene aggiunta al grafico delle entità.

rule rule_exclude {

    meta:
    setup:
      graph_exclude ($g1.graph.entity.ip = %example_table.ip)

    events:
        $e.metadata.event_type = "NETWORK_CONNECTION"
        $e.security_result.action = "ALLOW"
        $e.target.ip = $iocip
        $g1.graph.entity.ip = $iocip

    match:
        $iocip over 1h

    condition:
        $e and $g1
}

Le tabelle seguenti illustrano un'operazione di esclusione in cui vengono rimosse le righe del grafico delle entità che corrispondono al campo IP della tabella dei dati:

Grafico delle entità esistente
Nome host IP MAC
ftp01 10.1.1.4 …:01
www01 10.1.1.5 …:02
Tabella di dati
IP MAC Proprietario
10.1.1.4 …:bb alice
10.1.1.6 …:cc bob
10.1.1.7 …:gg chris
Grafico delle entità arricchito
Nome host IP MAC
www01 10.1.1.5 …:02

Limitazioni

  • Numero massimo di tabelle di dati per un account Google SecOps: 1000.

  • Le tabelle di dati supportano solo i dati CSV. Le tabelle dei dati supportano i valori delimitati da tabulazioni solo quando aggiungi una nuova tabella dei dati e importi un file con valori delimitati da tabulazioni (TSV).

  • I campi della tabella dati non supportano i caratteri virgola (,).

  • I limiti al numero di istruzioni in quando si fa riferimento a un elenco di riferimento in una query si applicano anche alle istruzioni in in una tabella di dati.

  • Numero massimo di istruzioni in in una query per colonne di tipo di dati String e Number: 7.

  • Numero massimo di istruzioni in con operatori di espressioni regolari: 4.

  • Numero massimo di istruzioni in con operatori CIDR: 2.

  • Numero massimo di colonne per tabella di dati: 1000.

  • Numero massimo di righe per tabella di dati: 10 milioni.

  • Limite aggregato massimo del volume di dati nelle tabelle di dati di un account: 1 TB.

  • Limite massimo di visualizzazione nella pagina web per le righe della tabella di dati nella visualizzazione dell'editor di testo e tabelle: 10.000 righe.

  • Limite massimo di caricamento dei file per la creazione di tabelle di dati: 10 GB.

  • I segnaposto non sono consentiti nella sezione di configurazione.

  • Le colonne non mappate di una tabella dati con il tipo di dati impostato su string possono essere unite solo ai campi stringa dell'evento UDM o dell'entità UDM.

  • Utilizza solo colonne non mappate in una tabella di dati con un tipo di dati impostato su cidr o regex per CIDR o espressione regolare.

  • Ricerca nelle tabelle di dati: i caratteri jolly delle espressioni regolari non sono supportati e i termini di ricerca sono limitati a 100 caratteri.

Limitazioni per i join delle tabelle di dati nelle regole

Ai join delle tabelle di dati nelle regole si applicano le seguenti limitazioni.

  • Il recupero di tutti i campioni di eventi per i rilevamenti non è supportato quando si utilizzano unioni di tabelle di dati con gli eventi.

  • A differenza di entità e UDM, le tabelle di dati non supportano i segnaposto. Ciò comporta le seguenti limitazioni:

    • Non puoi applicare un insieme di filtri a una tabella di dati e unirla a un'entità UDM.

    • Non puoi applicare un insieme diverso di filtri alla stessa tabella di dati mentre la unisci a un altro segnaposto UDM.

    Ad esempio, una tabella di dati denominata dt con tre colonne: my_hostname, org e my_email e con la seguente regola:

    events:
      $e1.principal.hostname =  %dt.my_hostname
      %dt.org ="hr"
    
      $e2.principal.email =  %dt.my_email
      %dt.org !="hr"
    

Vengono applicati prima tutti i filtri di una tabella di dati, poi le righe filtrate della tabella di dati vengono unite a UDM. In questo caso, i filtri contraddittori (%dt.org ="hr" and %dt.org !="hr") nella tabella dt generano una tabella di dati vuota, che viene poi unita a e1 e e2.

Limitazioni relative all'utilizzo di tabelle di dati con regole

Alle tabelle di dati si applicano le seguenti limitazioni quando vengono utilizzate con le regole.

Limitazioni per la frequenza di esecuzione

La frequenza di esecuzione in tempo reale non è supportata per le regole con tabelle di dati.

Limitazioni per l'output nelle tabelle di dati

  • I modificatori any e all non sono supportati per le colonne dei campi ripetuti nelle tabelle di dati.

  • L'indicizzazione degli array non è supportata per le colonne dei campi ripetuti nelle tabelle di dati.

  • Puoi esportare le variabili di risultato solo in una tabella di dati. Non puoi esportare direttamente i percorsi degli eventi o le colonne della tabella di dati.

  • Gli elenchi di colonne devono includere le colonne di chiave primaria per le tabelle dati.

  • Puoi avere un massimo di 20 risultati.

  • Se una tabella di dati non esiste, ne viene creata una nuova con il tipo di dati string predefinito per tutte le colonne, seguendo l'ordine specificato.

  • Solo una regola può scrivere in una tabella di dati alla volta. Se una regola tenta di scrivere in una tabella di dati in cui un'altra regola sta già scrivendo, la compilazione della regola non riesce.

  • Non è garantito che una regola del produttore possa aggiungere righe a una tabella di dati prima che inizi una regola del consumatore per quella tabella di dati.

  • Una singola regola ha un limite al numero di righe di risultati. Un limite massimo di 10.000 righe si applica ai risultati,ai dati persistenti e alle tabelle di dati.

  • Quando aggiorni una riga, i nuovi valori di tutte le colonne non chiave sostituiscono quelli precedenti. Qualsiasi aggiornamento, inclusa l'aggiunta di una nuova riga, richiede circa cinque minuti per essere disponibile per le query.

Limitazioni per l'arricchimento delle entità dalle tabelle dati

  • Puoi applicare una sola operazione di arricchimento (override, append o exclude) a una singola variabile del grafico delle entità.

  • Ogni operazione di arricchimento può utilizzare una sola tabella di dati.

  • Puoi definire un massimo di due operazioni di arricchimento di qualsiasi tipo nella sezione setup di una regola YARA-L.

Nell'esempio seguente, un'operazione override viene applicata alla variabile del grafico delle entità $g1 e un'operazione append viene applicata alla variabile del grafico delle entità $g2.

    setup:
    graph_override($g1.graph.entity.user.userid = %table1.myids)
    graph_append [$g2, %table1]

Nell'esempio precedente, la stessa tabella di dati (table1) viene utilizzata per migliorare diversi grafici delle entità. Puoi anche utilizzare tabelle di dati diverse per migliorare i vari grafici delle entità, come segue:

    setup:
    graph_override($g1.graph.entity.user.userid = %table1.myids)
    graph_append [$g2, %table2]

Limitazioni dell'utilizzo delle tabelle di dati con la ricerca

Alle tabelle di dati si applicano le seguenti limitazioni quando vengono utilizzate con la ricerca:

  • Non puoi eseguire query di ricerca sulle tabelle di dati utilizzando l'API Chronicle. Le query sono supportate solo tramite l'interfaccia web.

  • L'esecuzione di una singola query può restituire un massimo di 1 milione di righe a una tabella di dati o 1 GB, a seconda del limite raggiunto per primo.

  • L'output della ricerca in una tabella di dati ignora le righe di eventi se superano i 5 MB.

  • L'arricchimento delle entità non è supportato con la ricerca.

  • Le tabelle di dati non sono supportate per gli utenti delle chiavi di crittografia gestite dal cliente (CMEK).

  • Le scritture sono limitate a 6 al minuto per cliente.

  • Il supporto API non è disponibile per le operazioni sulle tabelle di dati correlate alla ricerca.

  • Le query statistiche non sono supportate con le unioni di tabelle di dati.

  • Le tabelle di dati e i join delle tabelle di dati sono supportati solo con gli eventi UDM e non con le entità.

    Supportato: %datatable1.column1 = %datatable2.column1

    Non supportato: graph.entity.hostname = %sample.test

  • Non puoi includere una variabile match nella sezione export di una query sulle statistiche.

    Ad esempio, non è supportato quanto segue:

      match:
          principal.hostname
      export:
          %sample.write_row(
          row: principal.hostname
        )
    

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