Usar tablas de datos

Disponible en:

Las tablas de datos son estructuras de datos de varias columnas que te permiten introducir tus propios datos en Google Security Operations. Las tablas de datos pueden actuar como tablas de consulta con columnas definidas y los datos almacenados en filas. Puedes crear o importar una tabla de datos a tu cuenta de Google SecOps usando la interfaz web de Google SecOps, la API de tablas de datos o una consulta de Descripción general de YARA-L 2.0.

Asignar permisos a tablas de datos mediante el control de acceso basado en roles de datos

Para usar tablas de datos, debes asignarles ámbitos mediante el control de acceso basado en roles de datos (RBAC de datos). Al asignar permisos a una tabla de datos, puede controlar qué usuarios y recursos pueden acceder a ella y utilizarla. Para obtener más información, consulta Configurar el control de acceso basado en roles de datos para tablas de datos.

Gestionar tablas de datos con la interfaz web de Google SecOps

En las siguientes secciones se describe cómo gestionar las tablas de datos mediante la interfaz web, incluido cómo acceder a ellas, añadir una nueva, editar su contenido, añadir filas y eliminar una tabla de datos de tu cuenta.

Acceder a tus tablas de datos

Para acceder a la página Tablas de datos, sigue estos pasos:

  • En la barra lateral, selecciona Investigación > Tablas de datos.

Para encontrar una tabla de datos específica, en la parte superior de la barra lateral Tablas de datos, introduce su nombre en el campo Buscar.

Añadir una tabla de datos

Cuando añades una tabla de datos, puedes introducir datos CSV manualmente, pegarlos o importar un archivo CSV o TSV en la tabla de datos.

Las siguientes configuraciones son permanentes y no se pueden cambiar una vez que se guarda una tabla de datos:

Para añadir una tabla de datos a Google SecOps, sigue estos pasos:

  1. En la barra lateral, selecciona Investigación > Tablas de datos.

  2. En la parte superior de la barra lateral Tablas de datos, haz clic en Crear.

  3. En el cuadro de diálogo Crear tabla de datos, asigna un nombre a la tabla y, si quieres, añade una descripción.

  4. Elige una de estas opciones:

    • Introduce los datos CSV manualmente o pégalos en el área Texto (modo de edición).
    • Para importar datos de un archivo CSV o TSV a la tabla de datos, sigue estos pasos:
    1. Haz clic en Importar archivo.
    2. Ve al archivo y haz clic en Abrir. Se abrirá el cuadro de diálogo Importar archivo.
    3. Si has seleccionado un archivo TSV en el paso anterior, haz lo siguiente:
      1. En la lista Tipo de separador, selecciona Detectar automáticamente o Tabulación.
      2. En la lista Iniciar importación en la fila, especifique la fila del archivo desde la que se importarán los datos.
    4. Haga clic en Importar datos.
  5. Seleccione el modo de edición Tabla y configure lo siguiente según sea necesario:

  6. Haz clic en Guardar. La nueva tabla de datos se muestra en la barra lateral Tablas de datos y está lista para recibir más datos.

Asignar tipos de datos a columnas de tablas de datos

Cuando añades una tabla de datos, puedes asignar tipos de datos (cadena, expresión regular, CIDR o número) a las columnas de la tabla.

Puede asignar campos de datos únicos a una columna de datos y campos de datos repetidos a una columna de datos mediante la interfaz web o la API, como se indica a continuación:

  • Tanto en la interfaz web como en la API, los valores de los campos de datos deben separarse con una barra vertical (|). En la interfaz web, si un valor incluye una barra vertical (|), se trata como un valor repetido de forma predeterminada.

  • En las solicitudes a la API, asigna el valor repeated_values a true.

Para obtener más información, consulta Campos repetidos.

En el siguiente ejemplo, la columna Field_value de la tabla de datos contiene valores para varios campos:

Field_value Field_name
altostrat.com FQDN
192.0.2.135 IP
charlie userid
Ejemplo nombre de host

La tabla anterior se divide en cuatro columnas, y cada una de ellas se asigna a un solo tipo de campo antes de poder usarse en cualquiera de los casos prácticos de tablas de datos que se presentan en este documento.

FQDN IP Userid Hostname (Nombre de host)
altostrat.com 192.0.2.135 charlie ejemplo

Designar columnas clave

Cuando añades una tabla de datos, puedes designar columnas específicas como columnas clave.

Si marcas una columna como columna de clave, los valores de esa columna se identificarán de forma única, se evitará que se dupliquen los datos y se podrá encontrar información de forma más eficiente mediante reglas y búsquedas.

Designar columnas para admitir campos repetidos

Cuando añades una tabla de datos, puedes designar columnas específicas para que admitan campos repetidos.

Las columnas que se vayan a usar para almacenar campos de varios valores o campos repetidos deben designarse explícitamente como repetidas al crear la tabla de datos.

Asignar nombres de columna a campos de entidad (opcional)

Cuando añades una tabla de datos, puedes asignar los nombres de las columnas a los campos de entidad.

En la siguiente tabla de datos de ejemplo, las columnas Userid y Role se asignan a entity.user.userid y entity.user.attribute.role.name, respectivamente:

Userid
(map to entity.user.userid)
Correo electrónico Rol
(se asigna a entity.user.attribute.role.name)
gato jack123@gmail.com administrador
Tony tony123@gmail.com ingeniero

Puede asignar una columna de una tabla de datos a un campo proto de una entidad mediante el campo mapped_column_path del recurso DataTable.

En el caso de las columnas sin una ruta de entidad definida, como Email en esta tabla de ejemplo, debes especificar manualmente un tipo de datos. Al igual que con las listas de referencia, los tipos de datos admitidos para las tablas de datos son number, string, regex y cidr.

Puede incluir columnas asignadas y sin asignar en una tabla de datos especificando una condición join.

Las columnas no asignadas se almacenan en el campo additional de la entidad a la que se une la tabla. Se añaden como pares clave-valor, donde key es el nombre de la columna y value es el valor de la fila correspondiente.

Añadir una fila a una tabla de datos

Para añadir una fila, siga estos pasos:

  1. En la pestaña Detalles, selecciona el modo de edición Tabla.
  2. Haz clic con el botón derecho en una fila y selecciona Añadir fila encima.
  3. Introduce los datos de una nueva fila. La primera fila se considera el encabezado de la tabla. Asegúrese de que cada elemento de datos coincida con la columna de datos y el tipo de datos adecuados.
  4. Haz clic en Guardar.

Editar una fila de una tabla de datos

Para editar una fila, siga estos pasos:

  1. Haz clic en el campo que quieras cambiar. El campo se puede editar.
  2. Haz los cambios que quieras.
  3. Haz clic en Guardar.

Buscar en las filas de una tabla de datos

Puede buscar información específica en una tabla de datos mediante la interfaz web. En la pestaña Detalles, introduce una cadena de búsqueda en el campo de búsqueda y haz clic en Buscar. Se muestran las filas que contienen la cadena de búsqueda.

Gestionar el TTL de las filas de la tabla

Para gestionar el valor de tiempo de vida (TTL) de las filas de una tabla, siga estos pasos:

  1. Haga clic en Mostrar TTL por fila. Se muestra una columna TTL que indica si ha caducado cada fila. Si no ha caducado, se muestra el tiempo restante antes de que caduque.

  2. Haga clic en el tiempo de Vencimiento predeterminado de las filas para mostrar el cuadro de diálogo Actualizar el vencimiento predeterminado de las filas y ajuste el TTL de las filas de la tabla.

  3. Introduce un nuevo valor de TTL en Horas o Días. El valor mínimo es de 24 horas. El valor máximo es 365 días.

  4. Haz clic en Guardar.

Eliminar una fila de una tabla

Para eliminar una fila, haz clic con el botón derecho en ella y selecciona Eliminar filas.

Para eliminar varias filas, selecciona cada una de ellas. A continuación, haz clic con el botón derecho en cualquier fila seleccionada y elige Eliminar filas.

Quitar una tabla de datos

Para quitar una tabla de datos, siga estos pasos:

  1. En la barra lateral, seleccione una tabla de datos de la lista Tablas de datos.

  2. Haz clic en Eliminar.

Gestionar tablas de datos con la API de Chronicle

También puedes usar los recursos REST disponibles en la API de Chronicle para gestionar tablas de datos en Google SecOps. La API puede replicar todas las funciones disponibles en la interfaz web e incluye algunas funciones adicionales que te permiten gestionar tablas de datos con más rendimiento y a mayor escala.

Estos son los recursos REST de la tabla de datos:

Ejemplo: sintaxis de filtro

En el siguiente ejemplo de la API de Chronicle se muestra cómo usar la sintaxis filter para buscar google.com en las filas de una tabla de datos:

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"

Usar tablas de datos en Google SecOps

Una vez que hayas añadido tablas de datos a tu instancia de Google SecOps, podrás usarlas para filtrar, mejorar y enriquecer tus datos con consultas YARA-L. Este documento incluye numerosos ejemplos de sintaxis YARA-L que puedes incorporar a Google SecOps.

Puedes usar tablas de datos junto con consultas YARA-L tanto en la búsqueda como en las reglas.

Las tablas de datos se pueden usar de las siguientes formas:

Filtrar datos de eventos y entidades de UDM mediante una tabla de datos

Puede filtrar eventos y entidades de UDM comparándolos con entradas de una tabla de datos. Une la tabla de datos con un evento o una entidad de UDM mediante comparaciones basadas en filas o basadas en columnas.

Comparaciones basadas en filas y columnas en tablas de datos

Tipo de comparación Lógica clave Operadores comunes Sintaxis de ejemplo Cuándo se puede utilizar
Basado en filas Todas las condiciones deben coincidir en la MISMA fila =, !=, >, >=, <, <= $e.field = %table.col_a Cuando es importante la relación entre varios valores de columna de la misma fila.
Basado en columnas El valor debe estar en CUALQUIER LUGAR de la columna IN, IN regex, IN cidr $e.field IN %table.col_b Cuando se comprueba si hay un valor en un conjunto de valores de una sola columna.

Vincule los eventos de UDM a las tablas de datos mediante los métodos de comparación Basado en filas o Basado en columnas:

  • Para vincular eventos de UDM a tablas de datos mediante una comparación basada en filas, use operadores de igualdad (=, !=, >, >=, < y <=).

    Por ejemplo: $<udm_variable>.<field_path> = %<data_table_name>.<column_name>

    • Si usas varias instrucciones de comparación, todos los campos o condiciones deben coincidir en la misma fila de la tabla de datos.
    • Para usar operadores (como not, !=, >, >=, < y <=) en tu consulta, debes incluir al menos una condición join entre los campos de UDM y las filas de la tabla de datos.

    • Google SecOps trata cualquier regla con una tabla de datos join como una regla de varios eventos, que requiere una sección match en la definición de la regla.

  • Para filtrar datos comparando los valores de los eventos de UDM con las filas de la tabla de datos, puede usar la siguiente sintaxis de combinación:

    • Sintaxis de combinación correcta:

      La "exclusión de combinaciones" basada en filas requiere, por ejemplo, una combinación left outer y una cláusula where que compruebe nulls.

    • Sintaxis de unión incorrecta:

      No incluyas NOT en varias condiciones de igualdad basadas en filas. Esta sintaxis no consigue el efecto "excluir si se encuentra esta combinación".

      Por ejemplo, no utilices esta sintaxis: NOT (field1 = %table.col1 AND field2 = %table.col2)

      Esto se debe a que la coincidencia se sigue aplicando fila por fila. Si alguna fila no cumple la condición combinada interna, NOT hará que la evaluación de esa fila sea true, lo que puede incluir el evento en lugar de excluirlo.

  • Para usar una columna de tabla de datos de tipo CIDR o regex para una comparación basada en filas, usa la siguiente sintaxis:

    net.ip_in_range_cidr($e.principal.ip, %<data_table_name>.<column_name>)
    
      re.regex($e.principal.hostname, %<data_table_name>.<column_name>)
    
  • Para vincular eventos de UDM a tablas de datos mediante una comparación basada en columnas, use la palabra clave in.

    Por ejemplo: $<udm_variable>.<field_path> in %<data_table_name>.<column_name>

  • Para excluir los eventos en los que el valor del campo se encuentra en la columna especificada (por ejemplo, una lista de bloqueo o una lista de permitidos), utilice esta sintaxis: NOT (... IN %table.column)

    Por ejemplo: not ($evt_username in %my_data_table.username)

  • Para usar una columna de tabla de datos de tipo CIDR o regex para una comparación basada en columnas, use la siguiente sintaxis:

    $e.principal.ip in cidr %cidr_data_table.column_name
    
    $e.principal.hostname in regex %regex_data_table.column_name
    
  • Al comparar columnas de tablas de datos que tienen los tipos de datos CIDR o de expresión regular, las palabras clave cidr y regex son opcionales.

  • También puedes usar el operador not con tablas de datos.

    La siguiente consulta de ejemplo excluye las entradas en las que las direcciones IP ($e.principal.ip) no coinciden con ninguno de los intervalos CIDR que se indican en la columna benign_ip de cidr_data_table:

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

Usar una tabla de datos como lista de referencia de varias columnas

Puedes usar una tabla de datos como lista de referencia de varias columnas. Aunque una lista de referencia puede acceder a los datos de una dimensión (una columna), las tablas de datos admiten varias columnas, lo que le permite filtrar y acceder a los datos de varias dimensiones.

Puede vincular eventos de UDM a una tabla de datos mediante la palabra clave in para hacer comparaciones basadas en columnas, lo que le permite comparar valores de un campo de UDM específico con valores de una sola columna de la tabla de datos.

En el siguiente ejemplo, la tabla de datos badApps contiene dos columnas: hostname y ip. La consulta coincide con ambos valores (el valor basado en el campo de UDM y el valor basado en la tabla de datos, ambos de tipo de datos de cadena) de forma independiente.

  • Ejemplo de regla:

    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
    }
    
  • Ejemplo de búsqueda:

    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
    

Combinaciones basadas en filas entre una tabla de datos y un evento o una entidad de UDM

Puede vincular eventos de UDM a una tabla de datos mediante operadores de igualdad y comparación (=, !=, >, >=, <, <=) para realizar comparaciones basadas en filas. Este método te permite filtrar datos comparando los valores de los eventos de UDM con las filas de la tabla de datos. Si utiliza varias instrucciones de comparación, todos los campos o condiciones deben coincidir en la misma fila de la tabla de datos.

Para usar operadores (como not, !=, >, >=, <, <=) en tu consulta, debes incluir al menos una condición join entre los campos de UDM y las filas de la tabla de datos. Google SecOps trata cualquier regla con una tabla de datos join como una regla de varios eventos, que requiere una sección match correspondiente en la definición de la regla.

Cuando se produce una unión, las filas de la tabla de datos vinculada se muestran en la Búsqueda. Para obtener más información, consulta Ver filas de tablas de datos en la Búsqueda.

  • Se admiten marcadores de posición en las tablas de datos de la sección event de una consulta, pero deben estar conectados a un evento o una entidad del modelo de datos unificado.

    En el siguiente ejemplo se usa una columna de tabla de datos de tipo string.

    • En este ejemplo de consulta YARA-L se comprueba si un evento de inicio de sesión de usuario coincide con una fila de example_table.

    • Una de las condiciones es que user ID exista en example_table.

    • Ambas condiciones deben coincidir en la misma fila de la example_table para que se active la regla.

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

Ejemplo de regla:

// 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
}

Ejemplo de búsqueda:

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
  • En el siguiente ejemplo se muestra cómo funcionan conjuntamente una tabla de datos y los datos de eventos de UDM.

    Según la lógica de la consulta YARA-L anterior, un usuario con user ID 32452 aparece en la detección como hostname del usuario en el sistema y coincide con el hostname de la tabla de datos.

    Tabla de datos
    uid title nombre de host
    32452 RR. HH. host1
    64452 Finanzas host2
    46364 TI host3

    Tabla de eventos de UDM
    principal metadatos security_result principal
    32452 USER_LOGIN PERMITIR host1
    64589 USER_LOGIN PERMITIR host9
    87352 USER_LOGIN PERMITIR host4

Escribir los resultados de consultas YARA-L en tablas de datos

Puedes escribir los resultados de las consultas de YARA-L en una tabla de datos. Con esta función, puedes crear tablas de datos a partir de tus datos de Google SecOps y usarlas para filtrar y mejorar otros datos.

Puede usar la sintaxis de escritura de consultas de YARA-L para lo siguiente:

  • Define la sintaxis de YARA-L para escribir los resultados de las consultas en tablas de datos.

  • Usa tablas de datos para la inteligencia sobre amenazas, la respuesta a incidentes y otros casos prácticos de seguridad.

  • Los datos deben cumplir la sintaxis y las convenciones de YARA-L.

Escribir detecciones y alertas en tablas de datos con YARA-L

Puedes usar una consulta YARA-L para enviar detecciones y alertas a tablas de datos.

Con la función write_row, puedes sobrescribir una fila de una tabla de datos con la clave correspondiente de la tabla de datos usando los resultados de una regla. Si la clave no se encuentra en la tabla, añade una fila.

Especifica la función write_row en la sección de exportación de una consulta YARA-L. La escritura de datos en la tabla de datos debe ser la acción final de la consulta. De este modo, las variables de resultado se escriben en la tabla de datos.

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

Modificar una tabla de datos con YARA-L

A continuación, se muestra cómo modificar una tabla de datos con YARA-L:

TableName: ip_user_domain_table (las columnas clave de la clave principal se definen durante la creación)

Dirección 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 clave principal.

La siguiente consulta recoge combinaciones únicas de principal.ip, principal.user.employee_id y target.domain. Filtra los resultados en función de la prevalencia de la 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

Resultados de la consulta:

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

Ejemplo: usar write_row para escribir el resultado de una consulta en una tabla de datos

Ejemplo de regla:

  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
    )
  }
  • Ejemplo de búsqueda:

    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
      )
    

Ejemplo: Información sobre write_row

En el siguiente ejemplo, se usan user y ip como claves principales. Cada detección que se mantiene en la tabla de detecciones da como resultado una evaluación de la llamada a la función en la sección de exportación de la consulta.

Ejemplo de regla:

  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)
  }
  • Ejemplo de búsqueda:

    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)
    

    Estos son los datos del 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
    }
    
  • Cuando se ejecuta esta consulta como regla, se devuelven las siguientes detecciones:

    ID de detección Coincidir con $user Match $ip
    0 charlie 192.0.2.135
    1 charlie 192.0.2.136

    La tabla de datos contiene lo siguiente:

    user ip
    charlie 192.0.2.135
    charlie 192.0.2.136
  • La siguiente consulta de búsqueda muestra la asistencia que ofrece la Búsqueda para escribir valores escalares en tablas de datos.

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

Enriquecer el gráfico de entidades con una tabla de datos

Puede usar tablas de datos para añadir, quitar o sustituir las entidades que se presentan en un gráfico de entidades de las reglas. Use funciones en la sección setup de la regla para indicar cómo se debe combinar, añadir o usar la tabla de datos para eliminar entidades de los eventos de entidad a los que se hace referencia en la sección events.

Puede usar la siguiente plantilla de regla para modificar un gráfico de entidad:

rule entity_graph_template {

  meta:
    ...

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

  events:
    ...

  match:
    ...

  condition:
    ...
}

Puedes usar las siguientes funciones de YARA-L 2.0 para mejorar el gráfico de entidades con una tabla de datos:

  • graph_override: sobrescribe las filas del gráfico de entidad que coincidan con la condición de unión con los datos de la tabla de datos.

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

  • graph_append: añade las filas de la tabla de datos a las filas del gráfico de entidades. La operación graph_append requiere una matriz que incluya una variable de tabla de datos y una variable de evento de entidad, en lugar de una condición de unión.

    En el ejemplo siguiente, $g1 es la variable de gráfico de entidad y example_table es la tabla de datos: graph_append [$g1, %example_table]

    En el caso de la función append, las tablas de datos deben incluir las siguientes columnas para validar la entidad:

    • start_time (mapeado a metadata.interval.start_time.seconds)

    • end_time (mapeado a metadata.interval.end_time.seconds)

    Las columnas de las tablas de datos no se pueden asignar a campos de metadatos mediante la interfaz web. En los casos prácticos de append, las tablas de datos se deben crear con la API de Chronicle (https://cloud.google.com/chronicle/docs/reference/rest/v1alpha/projects.locations.instances.dataTables/create).

  • graph_exclude: elimina las filas del gráfico de entidades que coincidan con la condición join.

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

La condición de unión debe ser una expresión de igualdad entre la columna de la tabla de datos y el campo del gráfico de entidad. En el caso de las funciones graph_override y graph_exclude, la sintaxis para acceder a una tabla de datos es la siguiente:

<data_table_name>.<column_name>

Los filtros especificados para <entity_variable> en la sección de eventos se aplican después de que se haya mejorado con la tabla de datos.

Una vez que la entidad del gráfico de entidades se ha enriquecido con la entidad de la tabla de datos, la variable de entidad del gráfico de entidades debe combinarse con la entidad del UDM.

Sustituir el gráfico de entidades con datos de una tabla de datos

Con la función graph_override, los campos presentes tanto en el gráfico de entidad como en la tabla de datos se sustituyen por los campos de la tabla de datos. Los campos presentes en el gráfico de entidades y no en la tabla de datos no cambian. Se incluyen los campos que no están presentes en el gráfico de entidades, pero sí en la tabla de datos.

Solo las columnas de la tabla de datos que se asignan sobrescriben las columnas del gráfico de entidad. Las columnas que no se han asignado se añaden al campo additional del gráfico de entidad al que se une la tabla de datos.

Ejemplo: coincidencia en una sola combinación

En el siguiente ejemplo, la tabla de datos anula las filas del gráfico de entidades que coinciden con la condición de unión entre la columna de la tabla de datos y el campo del gráfico de entidades ($g1.graph.entity.ip = %example_table.my_ip).

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
}

Para usar una columna sin asignar (por ejemplo, "Propietario") de la tabla de datos, usa una instrucción equivalente para $g1.graph.entity.owner = "alice" is $g1.graph.additional.fields["Owner"] = "alice". Esto se debe a que todas las columnas sin asignar de la tabla de datos se incluyen en el campo additional del gráfico de entidades ($g1).

En las siguientes tablas se muestra una operación de anulación en la que se enriquecen las filas del gráfico de entidades cuando el campo IP de la tabla de datos coincide con el campo IP del gráfico de entidades.

Gráfico de entidades actual
Hostname (Nombre de host) IP MAC
ftp01 10.1.1.4 …:01
www01 10.1.1.5 …:02
Tabla de datos
Hostname (Nombre de host) IP MAC Propietario
ftp01 10.1.1.4 …:bb alice
h1 10.1.1.6 …:cc bob
h2 10.1.1.7 …:dd chris
h3 10.1.1.4 …:ee doug

Gráfico de entidades enriquecido
Hostname (Nombre de host) IP MAC Propietario
ftp01 10.1.1.4 …:bb alice
www01 10.1.1.5 …:02
h3 10.1.1.4 …:ee doug

Ejemplo: Coincidencia en varias uniones

En el ejemplo siguiente, las filas del gráfico de entidades que coinciden con las múltiples condiciones de unión ($g1.graph.entity.ip = %example_table.my_ip y $g1.graph.entity.hostname = %example_table.my_hostname) se sustituyen por la tabla de datos.

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
}

En las siguientes tablas se muestra una operación de sustitución en la que se enriquecen las filas del gráfico de entidades cuando tanto el campo IP como el campo de nombre de host de la tabla de datos coinciden con el campo IP y el campo de nombre de host del gráfico de entidades.

Gráfico de entidades actual
Hostname (Nombre de host) IP MAC
ftp01 10.1.1.4 …:01
www01 10.1.1.5 …:02
Tabla de datos
Hostname (Nombre de host) IP MAC Propietario
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
Gráfico de entidades enriquecido
Hostname (Nombre de host) IP MAC Propietario
ftp01 10.1.1.4 …:bb alice
www01 10.1.1.5 …:02

Añadir datos de la tabla de datos al gráfico de entidad

Con la función graph_append, no es necesario especificar ninguna condición de unión.

En el ejemplo siguiente, todas las filas de la tabla de datos se añaden a las filas del gráfico de entidad.

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
}

En la siguiente tabla de ejemplo se muestra una operación de anexión en la que las filas de la tabla de datos se añaden a las filas del gráfico de entidades:

Gráfico de entidades actual
Hostname (Nombre de host) IP MAC
ftp01 10.1.1.4 …:01
www01 10.1.1.5 …:02
Tabla de datos
IP MAC Propietario
10.1.1.4 …:01 alice
10.1.1.6 …:cc bob
10.1.1.7 …:dd chris
10.1.1.4 …:ee doug
Gráfico de entidades enriquecido
Hostname (Nombre de host) IP MAC Propietario
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 …:dd chris
10.1.1.4 …:ee doug

Usa graph_exclude para quitar filas del gráfico de entidades

Con la función graph_exclude, las filas del gráfico de entidades que coinciden con la condición de unión se eliminan del gráfico de entidades.

En el siguiente ejemplo, se eliminan todas las filas del gráfico de entidad que coinciden con la condición de unión dada (entre la columna de la tabla de datos y el campo del gráfico de entidad). No se añade ninguna fila de la tabla de datos al gráfico de entidad.

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
}

En las siguientes tablas se muestra una operación de exclusión en la que se eliminan las filas del gráfico de entidades que coinciden con el campo IP de la tabla de datos:

Gráfico de entidades
Hostname (Nombre de host) IP MAC
ftp01 10.1.1.4 …:01
www01 10.1.1.5 …:02
Tabla de datos
IP MAC Propietario
10.1.1.4 …:bb alice
10.1.1.6 …:cc bob
10.1.1.7 …:dd chris
Gráfico de entidades enriquecido
Hostname (Nombre de host) IP MAC
www01 10.1.1.5 …:02

Limitaciones

  • Número máximo de tablas de datos por cuenta de Google SecOps: 1000.

  • Las tablas de datos solo admiten datos CSV. Las tablas de datos solo admiten valores separados por tabulaciones cuando se añade una tabla de datos nueva y se importa un archivo de valores separados por tabulaciones (TSV).

  • Los campos de la tabla de datos no admiten comas (,).

  • Los límites del número de instrucciones in al hacer referencia a una lista de referencia en una consulta también se aplican a las instrucciones in de una tabla de datos.

  • Número máximo de instrucciones in en una consulta para columnas de tipo de datos String y Number: 7.

  • Número máximo de instrucciones in con operadores de expresiones regulares: 4.

  • Número máximo de instrucciones in con operadores CIDR: 2.

  • Número máximo de columnas por tabla de datos: 1000.

  • Número máximo de filas por tabla de datos: 10 millones.

  • Límite agregado máximo del volumen de datos en todas las tablas de datos de una cuenta: 1 TB.

  • Límite máximo de visualización en la página web de las filas de la tabla de datos en la vista de editor de texto y de tabla: 10.000 filas.

  • Límite de tamaño máximo de archivo para crear tablas de datos: 10 GB.

  • No se pueden usar marcadores de posición en la sección de configuración.

  • Las columnas sin asignar de una tabla de datos cuyo tipo de datos sea string solo se pueden combinar con campos de cadena de eventos o entidades de UDM.

  • Utiliza solo columnas sin asignar en una tabla de datos con el tipo de datos cidr o regex para CIDR o expresiones regulares.

  • Búsquedas en tablas de datos: no se admiten comodines de expresiones regulares y los términos de búsqueda tienen un límite de 100 caracteres.

Limitaciones de las combinaciones de tablas de datos en las reglas

Se aplican las siguientes limitaciones a las combinaciones de tablas de datos en las reglas.

  • No se admite la obtención de todas las muestras de eventos para las detecciones cuando se usan combinaciones de tablas de datos con eventos.

  • A diferencia de las entidades y los metadatos definidos por el usuario, las tablas de datos no admiten marcadores de posición. Esto conlleva las siguientes limitaciones:

    • No puedes aplicar un conjunto de filtros a una tabla de datos y combinarla con una entidad de UDM.

    • No puedes aplicar un conjunto de filtros diferente a la misma tabla de datos mientras la unes con otro marcador de posición de UDM.

    Por ejemplo, una tabla de datos llamada dt con tres columnas: my_hostname, org y my_email, y con la siguiente regla:

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

Primero se aplican todos los filtros de una tabla de datos y, a continuación, las filas filtradas de la tabla de datos se combinan con el modelo de datos unificado. En este caso, los filtros contradictorios (%dt.org ="hr" and %dt.org !="hr") de la tabla dt dan como resultado una tabla de datos vacía, que se combina con e1 y e2.

Limitaciones al usar tablas de datos con reglas

Se aplican las siguientes limitaciones a las tablas de datos cuando se usan con reglas.

Limitaciones de la frecuencia de ejecución

No se admite la frecuencia de ejecución en tiempo real en las reglas con tablas de datos.

Limitaciones de la salida a tablas de datos

  • Los modificadores any y all no se admiten en las columnas de campos repetidos de las tablas de datos.

  • No se admite la indexación de matrices en las columnas de campos repetidos de las tablas de datos.

  • Solo puede exportar variables de resultados a una tabla de datos. No puede exportar directamente las rutas de eventos ni las columnas de la tabla de datos.

  • Las listas de columnas deben incluir las columnas de clave principal de las tablas de datos.

  • Puedes tener un máximo de 20 resultados.

  • Si no existe ninguna tabla de datos, se crea una con el tipo de datos string predeterminado para todas las columnas, siguiendo el orden especificado.

  • Solo una regla puede escribir en una tabla de datos a la vez. Si una regla intenta escribir en una tabla de datos en la que ya está escribiendo otra regla, la compilación de la regla falla.

  • No hay ninguna garantía de que una regla de productor pueda añadir filas a una tabla de datos antes de que empiece una regla de consumidor para esa tabla de datos.

  • Una sola regla tiene un límite en el número de filas de resultados. Se aplica un límite de 10.000 filas como máximo a los resultados,los datos persistentes y las tablas de datos.

  • Cuando actualizas una fila, los nuevos valores de todas las columnas que no son clave sustituyen a los antiguos. Las actualizaciones, como la adición de una nueva fila, tardan aproximadamente cinco minutos en estar disponibles para las consultas.

Limitaciones de la función de enriquecimiento de entidades a partir de tablas de datos

  • Solo puedes aplicar una operación de enriquecimiento (override, append o exclude) a una variable de gráfico de entidad.

  • Cada operación de enriquecimiento solo puede usar una tabla de datos.

  • Puede definir un máximo de dos operaciones de enriquecimiento de cualquier tipo en la sección setup de una regla de YARA-L.

En el siguiente ejemplo, se aplica una operación override a la variable $g1 del gráfico de entidades y una operación append a la variable $g2 del gráfico de entidades.

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

En el ejemplo anterior, se usa la misma tabla de datos (table1) para mejorar diferentes gráficos de entidades. También puede usar diferentes tablas de datos para mejorar los distintos gráficos de entidades, como se indica a continuación:

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

Limitaciones al usar tablas de datos con la Búsqueda

Se aplican las siguientes limitaciones a las tablas de datos cuando se usan con la Búsqueda:

  • No puedes ejecutar consultas de búsqueda en tablas de datos con la API de Chronicle. Las consultas solo se admiten a través de la interfaz web.

  • Una sola ejecución de una consulta puede generar un máximo de 1 millón de filas en una tabla de datos o 1 GB, lo que se alcance primero.

  • La búsqueda de resultados en una tabla de datos omite las filas de eventos si superan los 5 MB.

  • La función de enriquecimiento de entidades no está disponible en la Búsqueda.

  • Las tablas de datos no son compatibles con los usuarios de claves de cifrado gestionadas por el cliente (CMEK).

  • Las escrituras están limitadas a 6 por minuto por cliente.

  • La asistencia de API no está disponible para las operaciones de tabla de datos relacionadas con la búsqueda.

  • Las consultas de estadísticas no se admiten con combinaciones de tablas de datos.

  • Las tablas de datos y las combinaciones de tablas de datos solo se admiten con eventos de UDM, no con entidades.

    Compatible: %datatable1.column1 = %datatable2.column1

    No admitido: graph.entity.hostname = %sample.test

  • No puedes incluir una variable match en la sección export de una consulta de estadísticas.

    Por ejemplo, no se admite lo siguiente:

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

¿Necesitas más ayuda? Recibe respuestas de los miembros de la comunidad y de los profesionales de Google SecOps.