Cómo usar tablas de datos
Las tablas de datos son estructuras de datos de varias columnas que te permiten ingresar 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 con la interfaz web de Google SecOps, la API de tablas de datos o una consulta de Descripción general de YARA-L 2.0.
Asigna permisos a las tablas de datos con el RBAC de datos
Para usar tablas de datos, debes asignar permisos a las tablas de datos con el control de acceso basado en roles de datos (RBAC de datos). Si asignas permisos a una tabla de datos, puedes controlar qué usuarios y recursos pueden acceder a ella y utilizarla. Para obtener más información, consulta Configura el RBAC de datos para tablas de datos.
Administra tablas de datos con la interfaz web de Google SecOps
En las siguientes secciones, se describe cómo administrar tablas de datos con la interfaz web, incluido cómo acceder a las tablas de datos, agregar una tabla de datos nueva, editar su contenido, agregar filas y quitar una tabla de datos de tu cuenta.
Accede a tus tablas de datos
Para acceder a la página Tablas de datos, haz lo siguiente:
- En la barra lateral, selecciona Investigación > Tablas de datos.
Para encontrar una tabla de datos específica, ingresa su nombre en el campo Buscar, ubicado en la parte superior de la barra lateral Tablas de datos.
Agrega una tabla de datos nueva
Cuando agregas una tabla de datos nueva, puedes ingresar datos CSV de forma manual, pegarlos o importar un archivo CSV o TSV a la tabla de datos.
Los siguientes parámetros de configuración son permanentes y no se pueden cambiar después de guardar una tabla de datos nueva:
- Encabezados de columna
- Asignación de datos
- Claves primarias
- Campos repetidos
- Asignación de nombres de columnas a campos de entidades
Para agregar una tabla de datos nueva a Google SecOps, haz lo siguiente:
En la barra lateral, selecciona Investigación > Tablas de datos.
En la parte superior de la barra lateral Tablas de datos, haz clic en Crear.
En el diálogo Create New Data Table, asígnale un nombre a la tabla y, de manera opcional, agrega una descripción.
Realiza una de las siguientes acciones:
- Ingresa los datos CSV de forma manual 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, haz lo siguiente:
- Haz clic en Import File.
- Ve al archivo y haz clic en Abrir. Se abrirá el diálogo Importar archivo.
- Si seleccionaste un archivo TSV en el paso anterior, haz lo siguiente:
- En la lista Tipo de separador, selecciona Detectar automáticamente o Tab.
- En la lista Iniciar la importación en la siguiente fila, especifica la fila del archivo desde la que se importarán los datos.
- Haz clic en Import Data (Importar datos).
Selecciona el modo de edición Tabla y configura lo siguiente según sea necesario:
Haz clic en Guardar. La nueva tabla de datos se muestra en la barra lateral Tablas de datos y está lista para aceptar datos adicionales.
Asigna tipos de datos a columnas de tablas de datos
Cuando agregas una tabla de datos nueva, puedes asignar tipos de datos (cadena, expresión regular, CIDR o número) a las columnas de la tabla de datos.
Puedes asignar campos de datos únicos a una columna de datos y asignar campos de datos repetidos a una columna de datos con la interfaz web o la API, de la siguiente manera:
Tanto en la interfaz web como en la API, separa los valores de los campos de datos con una barra vertical (
|). En la interfaz web, si algún valor incluye una barra vertical (|), se trata como un valor repetido de forma predeterminada.Para las solicitudes a la API, configura
repeated_valuescomotrue.
Para obtener más información, consulta Campos repetidos.
En el siguiente ejemplo, la columna de la tabla de datos Field_value 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 que se pueda usar para cualquiera de los casos de uso de la tabla de datos que se presentan en este documento.
| FQDN | IP | Userid | Nombre de host |
| altostrat.com | 192.0.2.135 | charlie | ejemplo |
| … | … | … | … |
Cómo designar columnas clave
Cuando agregas una tabla de datos nueva, puedes designar columnas específicas como columnas clave.
Marcar una columna como columna clave identifica de forma única los valores de esa columna, evita la duplicación de datos y mejora la detección de datos para las reglas y las búsquedas.
Designa columnas para admitir campos repetidos
Cuando agregas una tabla de datos nueva, puedes designar columnas específicas para admitir campos repetidos.
Las columnas destinadas a almacenar campos de varios valores o campos repetidos deben designarse explícitamente como repetidas cuando se crea la tabla de datos.
Asigna nombres de columnas a campos de entidades (opcional)
Cuando agregas una tabla de datos nueva, 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) |
| conector | jack123@gmail.com | administrador |
| Tony | tony123@gmail.com | ingeniero |
Puedes asignar una columna de la tabla de datos a un campo .proto de la entidad con 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.
Puedes incluir columnas asignadas y sin asignar en una tabla de datos si especificas una condición join.
Las columnas sin asignar se almacenan en el campo additional de la entidad a la que se une la tabla. Estos se agregan como pares clave-valor, en los que key es el nombre de la columna y value es el valor de la fila correspondiente.
Agregar una fila nueva a una tabla de datos
Para agregar una fila nueva, haz lo siguiente:
- En la pestaña Detalles, selecciona el modo de edición Tabla.
- Haz clic con el botón derecho en una fila existente y selecciona Agregar fila arriba.
- Ingresa datos para una fila nueva. La primera fila se trata como un encabezado de tabla. Asegúrate de hacer coincidir cada elemento de datos con la columna y el tipo de datos correspondientes.
- Haz clic en Guardar.
Cómo editar una fila en una tabla de datos
Para editar una fila, haz lo siguiente:
- Haz clic en el campo que quieras cambiar. El campo se vuelve editable.
- Realiza tus cambios.
- Haz clic en Guardar.
Cómo buscar filas en la tabla de datos
Puedes buscar información específica en una tabla de datos con la interfaz web. En la pestaña Detalles, ingresa una cadena de búsqueda en el campo de búsqueda y haz clic en Buscar. Se muestran las filas que contienen tu cadena de búsqueda.
Administra el TTL de la fila de la tabla
Para administrar el valor del tiempo de actividad (TTL) de las filas de la tabla, haz lo siguiente:
Haz clic en Mostrar TTL por fila. Aparecerá una columna de TTL que indica si venció cada fila. Si no caducó, se muestra el tiempo restante antes de que caduque.
Haz clic en el tiempo de Vencimiento predeterminado de las filas para mostrar el diálogo Actualizar el vencimiento predeterminado de las filas y ajustar el TTL de la fila de la tabla.
Ingresa un nuevo valor de TTL en Horas o Días. El valor mínimo es de 24 horas. El valor máximo es de 365 días.
Haz clic en Guardar.
Borra una fila de la tabla
Para borrar una fila, haz clic con el botón derecho en ella y selecciona Borrar filas.
Para borrar varias filas, selecciona cada una de las que quieras quitar. Luego, haz clic con el botón derecho en cualquier fila seleccionada y elige Borrar filas.
Cómo quitar una tabla de datos
Para quitar una tabla de datos, haz lo siguiente:
Selecciona una tabla de datos de la lista Tablas de datos en la barra lateral.
Haz clic en Borrar.
Administra tablas de datos con la API de Chronicle
También puedes usar los recursos de REST disponibles en la API de Chronicle para administrar tablas de datos en Google SecOps. La API puede replicar todas las funciones disponibles en la interfaz web y, además, incluye algunas funciones adicionales que te permiten administrar tablas de datos con mayor rendimiento y escala.
Estos son los recursos de REST de la tabla de datos:
Ejemplo: Sintaxis del filtro
En el siguiente ejemplo de la API de Chronicle, se muestra cómo usar la sintaxis de filter para buscar google.com en las filas de la 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"
Usa tablas de datos en Google SecOps
Una vez que hayas agregado 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 en la sintaxis de YARA-L que puedes incorporar a Google SecOps.
Puedes usar tablas de datos junto con consultas YARA-L en la Búsqueda y en las reglas.
Las tablas de datos se pueden usar de las siguientes maneras:
Cómo filtrar datos de eventos o entidades del UDM con una tabla de datos
Puedes filtrar los eventos y las entidades de telemetría del UDM comparándolos con las entradas de una tabla de datos.
Cómo usar una tabla de datos como lista de referencia de varias columnas
Puedes usar una tabla de datos como una lista de referencia de varias columnas. Si bien una lista de referencia puede acceder a los datos en una sola dimensión, las tablas de datos te permiten acceder a los datos en varias dimensiones, lo que habilita el filtrado de datos.
Cómo unir una tabla de datos con un evento o una entidad
Puedes vincular eventos del UDM a una tabla de datos con el operador de igualdad (
=) para las comparaciones basadas en filas. Esta comparación te permite filtrar los datos. Una comparación basada en filas se evalúa comotruesolo si todas las condiciones de la instrucción coinciden con una sola fila de la tabla de datos.
Cómo filtrar datos de eventos y entidades del UDM con una tabla de datos
Puedes filtrar eventos y entidades del UDM comparándolos con las entradas de una tabla de datos. Une la tabla de datos con un evento o una entidad del UDM usando 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 | Ejemplo de sintaxis | Cuándo usar |
|---|---|---|---|---|
| Basado en filas | Todas las condiciones deben coincidir en la MISMA fila. | =, !=, >, >=, <, <= |
$e.field = %table.col_a |
Cuando importa la relación entre varios valores de columna en la misma fila |
| Basado en columnas | El valor debe existir EN CUALQUIER LUGAR de la columna. | IN, IN regex, IN cidr |
$e.field IN %table.col_b |
Cuando se verifica la presencia de un valor dentro de un conjunto de valores en una sola columna |
Vincula los eventos del UDM a las tablas de datos con los métodos de comparación Basado en filas o Basado en columnas:
Comparación basada en filas para vincular eventos del UDM a tablas de datos
Para vincular eventos del UDM a tablas de datos con una comparación basada en filas, usa operadores de igualdad (
=,!=,>,>=,<,<=).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,!=,>,>=,<,<=) en tu consulta, debes incluir al menos una condiciónjoinentre los campos del UDM y las filas de la tabla de datos.Google SecOps trata cualquier regla con una tabla de datos
joincomo una regla de varios eventos, lo que requiere una secciónmatchen la definición de la regla.
Para filtrar los datos según los valores coincidentes de los eventos del UDM con las filas de la tabla de datos, considera la siguiente sintaxis de unión:
Sintaxis de combinación correcta:
La "exclusión de combinación" basada en filas requiere, por ejemplo, una unión
left outery una cláusulawhereque verifiquenulls.Sintaxis de unión incorrecta:
No envuelvas
NOTalrededor de varias condiciones de igualdad basadas en filas. Esta sintaxis no logra un efecto de "excluir si se encuentra esta combinación".Por ejemplo, no uses 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, el
NOThace que la evaluación de esa fila seatrue, lo que podría incluir el evento en lugar de excluirlo.
Para usar una columna de tabla de datos del tipo
CIDRoregexpara la 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>)
Comparación basada en columnas para vincular eventos del UDM a tablas de datos
Para vincular eventos del UDM a tablas de datos con una comparación basada en columnas, usa la palabra clave
in.Por ejemplo:
$<udm_variable>.<field_path> in %<data_table_name>.<column_name>.Para filtrar los eventos en los que el valor del campo existe en la columna especificada (por ejemplo, una lista de bloqueo o una lista de entidades permitidas), usa esta sintaxis:
NOT (... IN %table.column)Por ejemplo:
not ($evt_username in %my_data_table.username).Para usar una columna de tabla de datos del tipo
CIDRoregexpara la comparación basada 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_nameCuando comparas columnas en tablas de datos que son tipos de datos de CIDR o de expresiones regulares, las palabras clave
cidryregexson opcionales.También puedes usar el operador
notcon tablas de datos.La siguiente consulta de ejemplo filtra las entradas en las que las direcciones IP (
$e.principal.ip) no coinciden con ninguno de los rangos de CIDR que se indican en la columnabenign_ipdecidr_data_table:not $e.principal.ip in %data_table.benign_ip
Usa una tabla de datos como lista de referencia de varias columnas
Puedes usar una tabla de datos como una lista de referencia de varias columnas. Si bien una lista de referencia puede acceder a los datos en una sola dimensión (una columna), las tablas de datos admiten varias columnas, lo que te permite filtrar y acceder a los datos en varias dimensiones.
Puedes vincular eventos del UDM a una tabla de datos con la palabra clave in para la comparación basada en columnas, lo que te permite hacer coincidir los valores de un campo específico del UDM con los 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 tipos 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
Uniones basadas en filas entre una tabla de datos y un evento o una entidad del UDM
Puedes vincular eventos del UDM a una tabla de datos con operadores de igualdad y comparación (=, !=, >, >=,
<, <=) para realizar comparaciones basadas en filas. Este enfoque te permite filtrar los datos comparando los valores coincidentes de los eventos del 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.
Debes incluir al menos una condición join entre los campos del UDM y las filas de la tabla de datos para usar operadores (como not, !=, >, >=, <, <=) en tu consulta.
Google SecOps trata cualquier regla con una tabla de datos join como una regla de varios eventos, lo 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 vinculados son visibles en la Búsqueda. Para obtener más información, consulta Cómo ver las filas de la tabla de datos en la Búsqueda.
Se admiten marcadores de posición para las tablas de datos en la sección
eventde una consulta, pero deben estar conectados a un evento o una entidad del UDM.En el siguiente ejemplo, se usa una columna de tabla de datos de tipo
string.En este ejemplo de consulta de YARA-L, se verifica si un evento de acceso del usuario coincide con una fila en
example_table.Una condición es que el
user IDexista en elexample_table.Ambas condiciones deben coincidir en la misma fila de
example_tablepara 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 ilustra cómo funcionan en conjunto una tabla de datos y los datos de eventos del UDM.
Según la lógica de la consulta en YARA-L anterior, un usuario con
user ID 32452aparece en la detección como elhostnamedel usuario del sistema y coincide con elhostnamede la tabla de datos.Tabla de datos uid title hostname 32452 RR.HH. host1 64452 Finanzas host2 46364 TI host3 Tabla de eventos de UDM principal metadata security_result principal 32452 USER_LOGIN PERMITIR host1 64589 USER_LOGIN PERMITIR host9 87352 USER_LOGIN PERMITIR host4
Escribe 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 sobre amenazas, la respuesta ante incidentes y otros casos de uso de seguridad.
Los datos deben cumplir con la sintaxis y las convenciones de YARA-L.
Escribe detecciones y alertas en tablas de datos con YARA-L
Puedes usar una consulta en YARA-L para enviar detecciones y alertas a las tablas de datos.
Con la función write_row, puedes reemplazar una fila de la tabla de datos con la clave coincidente en la tabla de datos usando los resultados de una regla. Si no se encuentra la clave en la tabla, agrega una fila nueva.
Especifica la función write_row en la sección de exportación de una consulta de YARA-L. Escribir datos en la tabla de datos debe ser la acción final de la consulta. Esto hace que las variables de resultado se escriban 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
Modifica 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 para la clave primaria se definen en 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 |
El asterisco (*) indica la clave primaria.
La siguiente consulta captura combinaciones únicas de principal.ip, principal.user.employee_id y target.domain. Filtra los resultados según la prevalencia de 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: Usa write_row para escribir el resultado de la 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: Cómo comprender write_row
En el siguiente ejemplo, user y ip se usan como claves primarias. Cada detección que persiste en la tabla de detecciones genera 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 esta búsqueda se ejecuta como regla, se devuelven las siguientes detecciones:
ID de detección Coincide 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 búsqueda ilustra la compatibilidad 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)
Enriquece el gráfico de entidades con una tabla de datos
Puedes usar tablas de datos para agregar, quitar o reemplazar las entidades que se presentan en un gráfico de entidades a partir de reglas. Usa funciones en la sección de reglas setup para indicar cómo se debe combinar, agregar o usar la tabla de datos para quitar entidades de los eventos de entidades a los que se hace referencia en la sección events.
Puedes usar la siguiente plantilla de regla para modificar un gráfico de entidades:
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 entidades que coinciden con la condición de unión con datos de la tabla de datos.Por ejemplo:
[graph_override](?tab=t.0#heading=h.v0fps7eke1if).graph_append: Agrega las filas de la tabla de datos a las filas del gráfico de entidades. La operacióngraph_appendrequiere un array 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 siguiente ejemplo,
$g1es la variable del gráfico de entidades yexample_tablees la tabla de datos:graph_append [$g1, %example_table]Para la función
append, las tablas de datos deben incluir las siguientes columnas para validar la entidad:start_time(asignado ametadata.interval.start_time.seconds)end_time(asignado ametadata.interval.end_time.seconds)
Las columnas de la tabla de datos no se pueden asignar a los campos de metadatos con la interfaz web. En el caso de los casos de uso de
append, las tablas de datos deben crearse 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 coinciden con la condiciónjoin.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>
Cualquier filtro especificado para <entity_variable> en la sección de eventos se aplica después de su mejora con la tabla de datos.
Después de que la entidad del gráfico de entidades se enriquece con la entidad de la tabla de datos, la variable de entidad del gráfico de entidades debe unirse a la entidad del UDM.
Anula el gráfico de entidades con datos de la tabla de datos
Con la función graph_override, los campos presentes tanto en el gráfico de entidades como en la tabla de datos se reemplazan por campos de la tabla de datos. Los campos presentes en el gráfico de entidades y no en la tabla de datos permanecen iguales. 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 anulan las columnas del gráfico de entidades. Las columnas que no se asignan se agregan al campo additional del gráfico de entidades en el 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, se debe usar una sentencia 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 ilustra 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 existente | ||
| Nombre de host | IP | MAC |
| ftp01 | 10.1.1.4 | …:01 |
| www01 | 10.1.1.5 | …:02 |
| Tabla de datos | |||
| Nombre de host | IP | MAC | Propietario |
| ftp01 | 10.1.1.4 | …:bb | alice |
| h1 | 10.1.1.6 | …:cc | cabecear |
| h2 | 10.1.1.7 | …:dd | chris |
| h3 | 10.1.1.4 | …:ee | doug |
| Gráfico de entidades enriquecido | |||
| 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 siguiente ejemplo, la tabla de datos anula 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).
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 ilustra una operación de anulación en la que se enriquecen las filas del gráfico de entidades cuando tanto el campo de IP como el campo de nombre de host de la tabla de datos coinciden con el campo de IP y el campo de nombre de host del gráfico de entidades.
| Gráfico de entidades existente | ||
| Nombre de host | IP | MAC |
| ftp01 | 10.1.1.4 | …:01 |
| www01 | 10.1.1.5 | …:02 |
| Tabla de datos | |||
| Nombre de host | IP | MAC | Propietario |
| ftp01 | 10.1.1.4 | …:bb | alice |
| h1 | 10.1.1.5 | …:cc | cabecear |
| h2 | 10.1.1.6 | …:dd | chris |
| h3 | 10.1.1.4 | …:ee | doug |
| Gráfico de entidades enriquecido | |||
| Nombre de host | IP | MAC | Propietario |
| ftp01 | 10.1.1.4 | …:bb | alice |
| www01 | 10.1.1.5 | …:02 | |
Agrega datos de la tabla de datos al gráfico de entidades
Con la función graph_append, no se requiere ninguna condición de unión.
En el siguiente ejemplo, todas las filas de la tabla de datos se agregan a las filas del gráfico de entidades.
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 ilustra una operación de anexión en la que las filas de la tabla de datos se anexan a las filas del gráfico de entidades:
| Gráfico de entidades existente | ||
| 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 | cabecear |
| 10.1.1.7 | …:dd | chris |
| 10.1.1.4 | …:ee | doug |
| Gráfico de entidades enriquecido | |||
| 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 | cabecear | |
| 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, se quitan del gráfico de entidades las filas que coinciden con la condición de unión.
En el siguiente ejemplo, se quitan todas las filas del gráfico de entidades que coinciden con la condición de unión determinada (entre la columna de la tabla de datos y el campo del gráfico de entidades). No se agregan filas de la tabla de datos al gráfico de entidades.
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 ilustra una operación de exclusión en la que se quitan las filas del gráfico de entidades que coinciden con el campo IP de la tabla de datos:
| Gráfico de entidades existente | ||
| 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 | cabecear |
| 10.1.1.7 | …:dd | chris |
| Gráfico de entidades enriquecido | ||
| Nombre de host | IP | MAC |
| www01 | 10.1.1.5 | …:02 |
Limitaciones
Cantidad máxima de tablas de datos para una cuenta de Google SecOps: 1,000
Las tablas de datos solo admiten datos CSV. Las tablas de datos admiten valores separados por tabulaciones solo cuando se agrega 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 caracteres de coma (
,).Los límites en la cantidad de declaraciones
incuando se hace referencia a una lista de referencia en una consulta también se aplican a las declaracionesinen una tabla de datos.Cantidad máxima de instrucciones
inen una consulta para columnas de tipo de datosStringyNumber: 7.Cantidad máxima de declaraciones
incon operadores de expresiones regulares: 4.Cantidad máxima de instrucciones
incon operadores CIDR: 2.Cantidad máxima de columnas por tabla de datos: 1,000
Cantidad máxima 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 para las filas de la tabla de datos en la vista del editor de texto y de tablas: 10,000 filas.
El límite máximo de tamaño de carga de archivos para la creación de tablas de datos es de 10 GB.
No se permiten los marcadores de posición en la sección de configuración.
Las columnas sin asignar de una tabla de datos con el tipo de datos establecido en
stringsolo se pueden unir con campos de cadena del evento del UDM o la entidad del UDM.Usa solo columnas sin asignar en una tabla de datos con un tipo de datos establecido en
cidroregexpara CIDR o expresión regular.Búsquedas en tablas de datos: No se admiten comodines de expresiones regulares, y los términos de búsqueda están limitados a 100 caracteres.
Limitaciones para las uniones de tablas de datos en las reglas
Se aplican las siguientes limitaciones a las uniones de tablas de datos en las reglas.
No se admite la recuperació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 el UDM, las tablas de datos no admiten marcadores de posición. Esto genera las siguientes limitaciones:
No puedes aplicar un conjunto de filtros a una tabla de datos y unirla con una entidad del UDM.
No puedes aplicar un conjunto diferente de filtros a la misma tabla de datos mientras la unes con otro marcador de posición del UDM.
Por ejemplo, una tabla de datos llamada
dtcon tres columnas:my_hostname,orgymy_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 en una tabla de datos y, luego, las filas filtradas de la tabla de datos se unen con el UDM. En este caso, los filtros contradictorios (%dt.org ="hr" and %dt.org !="hr") en la tabla dt generan una tabla de datos vacía, que luego se une con e1 y e2.
Limitaciones del uso de tablas de datos con reglas
Las siguientes limitaciones se aplican a las tablas de datos cuando se usan con reglas.
Limitaciones de la frecuencia de ejecución
La frecuencia de ejecución en tiempo real no es compatible con las reglas que incluyen tablas de datos.
Limitaciones para la salida a tablas de datos
Los modificadores
anyyallno son compatibles con las columnas de campos repetidos en las tablas de datos.La indexación de arrays no es compatible con las columnas de campos repetidos en las tablas de datos.
Solo puedes exportar variables de resultado a una tabla de datos. No puedes exportar directamente las rutas de eventos ni las columnas de la tabla de datos.
Las listas de columnas deben incluir las columnas de clave primaria para las tablas de datos.
Puedes tener un máximo de 20 resultados.
Si no existe una tabla de datos, se crea una nueva con el tipo de datos
stringpredeterminado para todas las columnas, según 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, falla la compilación de la regla.
No hay garantía de que una regla de productor pueda agregar filas a una tabla de datos antes de que comience una regla de consumidor para esa tabla de datos.
Una sola regla tiene un límite en la cantidad de filas de resultados. Se aplica un límite máximo de 10,000 filas a los datos persistentes y de resultados, y a las tablas de datos.
Cuando actualizas una fila, los valores nuevos de todas las columnas que no son clave reemplazan los valores anteriores. Todas las actualizaciones, incluida la adición de una fila nueva, tardan aproximadamente cinco minutos en estar disponibles para las consultas.
Limitaciones para el enriquecimiento de entidades a partir de tablas de datos
Solo puedes aplicar una operación de enriquecimiento (
override,appendoexclude) a una sola variable de gráfico de entidades.Cada operación de enriquecimiento solo puede usar una tabla de datos.
Puedes definir un máximo de dos operaciones de enriquecimiento de cualquier tipo en la sección
setupde una regla de YARA-L.
En el siguiente ejemplo, se aplica una operación override a la variable $g1 del grafo de entidades y una operación append a la variable $g2 del grafo 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 puedes usar diferentes tablas de datos para mejorar los diferentes gráficos de entidades, de la siguiente manera:
setup:
graph_override($g1.graph.entity.user.userid = %table1.myids)
graph_append [$g2, %table2]
Limitaciones del uso de 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 búsquedas 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 consulta puede generar un máximo de 1 millón de filas en una tabla de datos o 1 GB, lo que ocurra primero.
La salida de la búsqueda a una tabla de datos omite las filas de eventos si superan los 5 MB.
El enriquecimiento de entidades no es compatible con la Búsqueda.
Las tablas de datos no son compatibles con los usuarios de claves de encriptación administradas por el cliente (CMEK).
Las escrituras están limitadas a 6 por minuto por cliente.
La compatibilidad con la API no está disponible para las operaciones de tablas de datos relacionadas con la Búsqueda.
Las consultas de estadísticas no son compatibles con las uniones de tablas de datos.
Las tablas de datos y las uniones de tablas de datos solo se admiten con eventos del UDM, no con entidades.
Compatible:
%datatable1.column1 = %datatable2.column1No compatible:
graph.entity.hostname = %sample.testNo puedes incluir una variable
matchen la secciónexportde 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? Obtén respuestas de miembros de la comunidad y profesionales de Google SecOps.