Usar tablas de datos
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:
En la parte superior derecha de la barra lateral, haz clic en
Crear.En el cuadro de diálogo Crear tabla de datos, asigna un nombre a la tabla y, si quieres, añade una descripción.
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:
Haga clic en Importar datos.
Selecciona un archivo CSV estándar (solo se pueden importar archivos CSV a Google SecOps).
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
atrue
.
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:
En la pestaña Detalles, haz clic con el botón derecho en una fila y selecciona Añadir fila encima.
Introduce los datos de una nueva fila, donde la primera fila se trata como un encabezado de tabla:
- Separa los campos de datos con comas o tabulaciones.
- Asegúrate de que cada elemento de datos coincida con la columna de datos adecuada.
- 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:
Haz clic en el campo que quieras cambiar. El campo se podrá editar.
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:
Haga clic en
Editar tipo de separador junto a Importar datos.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:
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.
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.
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.
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:
Selecciona una tabla de datos de la lista Tablas de datos de la izquierda.
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:
Filtra los datos de eventos o entidades de UDM mediante una tabla de datos. Puede filtrar eventos y entidades de telemetría de UDM comparándolos con las entradas de una tabla de datos.
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. Mientras que una lista de referencias puede acceder a los datos de una sola dimensión, las tablas de datos le permiten acceder a los datos de varias dimensiones, lo que posibilita el filtrado de datos.
Unir una tabla de datos con un evento o una entidad Puede vincular eventos de gestión de datos de usuario a una tabla de datos mediante el operador de igualdad (
=
) para hacer comparaciones basadas en filas. Esta comparación le permite filtrar los datos. Una comparación basada en filas se evalúa comotrue
solo si todas las condiciones de la instrucción coinciden con una sola fila de la tabla de datos.
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óngraph_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 yexample_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 ametadata.interval.start_time.seconds
)end_time
(mapeado ametadata.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ó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>
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 instruccionesin
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 datosString
yNumber
: 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
oregex
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
ymy_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
yall
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
oexclude
) 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]
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 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ónexport
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.