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

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

Para usar tablas de datos, debes asignar permisos a las tablas de datos 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 secciones siguientes se describe cómo gestionar las tablas de datos mediante la interfaz web, incluido cómo acceder a ellas, añadir una nueva y editar su contenido, importar datos a una tabla, añadir filas, separar datos con comas o tabulaciones, y eliminar una tabla de datos de su cuenta.

Acceder a tus tablas de datos

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

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

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

Añadir una tabla de datos

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

  1. En la parte superior derecha de la barra lateral, haz clic en Crear.

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

  3. Haz clic en Crear. La nueva tabla de datos aparece en la ventana principal y está lista para recibir datos.

Importar datos a una tabla de datos

Para añadir datos a tu tabla de datos, puedes importarlos directamente a Google SecOps de la siguiente manera:

  1. Haga clic en Importar datos.

  2. Selecciona un archivo CSV estándar (solo se pueden importar archivos CSV a Google SecOps).

  3. Cuando quieras importar los datos a tu tabla de datos, haz clic en Abrir.

Asignar tipos de datos a columnas de tablas de datos

Puedes 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, separe los valores de los campos de datos con el carácter |. En la interfaz web, si un valor incluye el carácter |, 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 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 específicas para admitir 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 creas una tabla de datos, puedes asignar los nombres de las columnas de la tabla de datos 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 sin asignar 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, sigue estos pasos:

  1. En la pestaña Detalles, haz clic con el botón derecho en una fila y selecciona Añadir fila encima.

  2. Introduce los datos de una nueva fila, donde la primera fila se trata como un encabezado de tabla:

    1. Separa los campos de datos con comas o tabulaciones.
    2. Asegúrate de que cada elemento de datos coincida con la columna de datos adecuada.
    3. Cuando introduces datos de una fila en la pestaña Detalles, se rellenan en el Editor de tabla.

Editar una fila de una tabla de datos

Para editar una fila, haz lo siguiente:

  1. Haz clic en el campo que quieras cambiar. El campo se podrá editar.

  2. Cuando hayas hecho los cambios, haz clic en Guardar.

Especifica si quieres usar comas o tabulaciones para separar los datos

Para separar los datos con comas o tabulaciones, siga estos pasos:

  1. Haga clic en Editar tipo de separador junto a Importar datos.

  2. En el cuadro de diálogo Editar tipo de separador, selecciona Coma o Tabulación en el menú Separador.

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, sigue estos pasos:

  1. Selecciona una tabla de datos de la lista Tablas de datos de la izquierda.

  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 le 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 importado 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 las entradas de una tabla de datos.

Vincule los eventos de UDM a las tablas de datos de una de las siguientes formas:

  • Usar un operador de igualdad (=, !=, >, >=, <, <=) para la comparación basada en filas. Por ejemplo, $<udm_variable>.<field_path> = %<data_table_name>.<column_name>.

  • Usa la palabra clave in para hacer comparaciones basadas en columnas. Por ejemplo, $<udm_variable>.<field_path> in %<data_table_name>.<column_name>.`

Al igual que con las listas de referencia, los tipos de datos admitidos para cada columna de la tabla de datos pueden ser number, string, regex o CIDR.

Para usar una columna de tabla de datos de tipo number en comparaciones y combinaciones basadas en columnas, usa la siguiente sintaxis. En este ejemplo se buscan eventos que incluyan target.port 8080.

%table.number_field = target.port
%table.number_field = 8080
target.port in %table.number_field

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 usar una columna de tabla de datos de tipo CIDR o regex para hacer comparaciones basadas en columnas, usa 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 sola 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 gestión de datos unificada 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 gestión de datos unificada 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

Unir una tabla de datos con 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 hacer 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 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, !=, >, >=, <, <=) 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, lo que requiere que también incluyas una sección match 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 el artículo Ver filas de tablas de datos en la Búsqueda.

En el siguiente ejemplo se usa una columna de tabla de datos de tipo string. Esta consulta de YARA-L comprueba si un evento de inicio de sesión de usuario coincide con una fila de example_table confirmando que user ID existe en la tabla. Ambas condiciones deben coincidir en la misma fila de la tabla de datos 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:

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 table where the uid in the table
// row is the userid on the event and the active date in the same 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 table where the uid in the table
// row is the userid on the event and the active date in the same 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 el 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 las consultas de 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.

Puedes 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 frente a 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 nueva.

Especifica la función write_row en la sección de exportación de una consulta de 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)

ip_address 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: Entender 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:

usuario 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 presentadas en el 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 quitar 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:
    ...
}

Puede 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 entidades 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 del gráfico de entidades 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: quita 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 entidades. 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 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 hayan asignado sobrescribirán 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 unió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
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
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
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.

  • Solo se admite el tipo de archivo CSV para las subidas.

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

  • 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 máximo de filas al subir un archivo a una tabla de datos nueva en la página web: 10.000 filas.

  • El límite de tamaño máximo de archivo de subida para crear tablas de datos a partir de una API es de 1 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.

Uniones

  • 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 significa que no puedes hacer lo siguiente:

    • Aplica un conjunto de filtros a una tabla de datos y combínala con una entidad de UDM.

    • Aplicar un conjunto de filtros diferente a la misma tabla de datos mientras se une a 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.

Usar tablas de datos con reglas

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

Frecuencia de ejecución

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

Resultados en 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 columnas de ruta de evento ni de 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, se produce un error en la compilación de la regla.

  • 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 añadir una fila, tardan aproximadamente cinco minutos en estar disponibles para las consultas.

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]

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 se admite 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 para APIs no está disponible para las operaciones de tablas 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 compatible: graph.entity.hostname = %sample.test

  • No puedes incluir una variable match en una consulta de estadísticas 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.