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. 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 YARA-L.
Asigna permisos a las tablas de datos con el RBAC de datos
Para usar tablas de datos, debes asignarles alcances 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 tus tablas de datos, agregar una tabla de datos nueva y editar su contenido, importar datos a tu tabla, agregar filas, separar datos con comas o tabulaciones, y cómo 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 izquierda, 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.
Agrega una tabla de datos nueva
Para agregar una tabla de datos nueva a Google SecOps, completa los siguientes pasos:
Haz clic en
Crear en la parte superior derecha de la barra lateral.En el cuadro de diálogo Crear tabla de datos nueva, asígnale un nombre a la tabla nueva y, de manera opcional, agrega una descripción.
Haz clic en Crear. La nueva tabla de datos aparecerá en la ventana principal y estará lista para aceptar datos.
Importa datos a tu tabla de datos
Para agregar datos a tu tabla de datos, puedes importarlos directamente a Google SecOps de la siguiente manera:
Haz clic en Import Data (Importar datos).
Selecciona un archivo CSV estándar (solo se pueden importar archivos CSV a Google SecOps).
Haz clic en Abrir cuando esté todo listo para importar los datos a tu tabla de datos.
Asigna tipos de datos a columnas de tablas 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 el carácter
|
. En la interfaz web, si algún valor incluye el carácter|
, se lo trata como un valor repetido de forma predeterminada.Para las solicitudes a la API, establece
repeated_values
entrue
.
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 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 |
… | … | … | … |
Designa 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 el descubrimiento de datos para las reglas y las búsquedas.
Designa 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 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) |
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, sigue estos pasos:
En la pestaña Detalles, haz clic con el botón derecho en una fila existente y selecciona Agregar fila arriba.
Ingresa datos para una fila nueva, en la que la primera fila se trata como un encabezado de tabla:
- Separa los campos de datos con comas o tabulaciones.
- Asegúrate de hacer coincidir cada elemento de datos con la columna de datos correspondiente.
- A medida que ingresas datos de una fila en la pestaña Detalles, se completan en el Editor de tablas.
Cómo editar una fila en tu tabla de datos
Para editar una fila, completa los siguientes pasos:
Haz clic en el campo que quieras cambiar. El campo se podrá editar.
Después de realizar los cambios, haz clic en Guardar.
Especifica si se usarán comas o tabulaciones para separar los datos
Para separar los datos con comas o tabulaciones, haz lo siguiente:
Haz clic en
Editar tipo de separador junto a Importar datos.En el diálogo Editar tipo de separador, selecciona Coma o Tab en el menú Separador.
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 la fila para mostrar el diálogo Actualizar el vencimiento predeterminado de la fila 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 a la izquierda.
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 a mayor escala.
Estos son los recursos de 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 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 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 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:
Filtra los 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.
Usa una tabla de datos como una 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.
Une 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 comotrue
solo 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 entradas de una tabla de datos.
Vincula los eventos del UDM a las tablas de datos de una de las siguientes maneras:
Usa 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 la comparación basada 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 del tipo number
para comparaciones y uniones basadas en columnas, usa la siguiente sintaxis. En este ejemplo, se buscan eventos que incluyen 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 del tipo CIDR
o regex
para 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>)
Para usar una columna de tabla de datos del tipo CIDR
o regex
para 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_name
Cuando comparas columnas en tablas de datos que son tipos de datos de CIDR o de expresiones regulares, las palabras clave cidr
y regex
son opcionales.
También puedes usar el operador not
con 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 columna benign_ip
de cidr_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 búsqueda coincide con ambos valores (el valor basado en el campo de UDM y el valor basado en la tabla de datos, ambos con 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
Cómo unir una tabla de datos con 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.
Las SecOps de Google tratan 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 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.
En el siguiente ejemplo, se usa una columna de tabla de datos de tipo string
. Esta consulta de YARA-L verifica si un evento de acceso del usuario coincide con una fila en example_table
. Para ello, confirma 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 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 32452
aparece en la detección como el hostname
del usuario del sistema y coincide con el hostname
de 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 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)
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 |
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 consulta se ejecuta como una regla, se muestran 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:
usuario | 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 el gráfico de entidades de las 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_append
requiere 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,
$g1
es la variable del gráfico de entidades yexample_table
es 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
(mapeado ametadata.interval.start_time.seconds
)end_time
(mapeado 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. Para 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 | cabeceo |
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 | cabeceo |
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 | cabeceo |
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 | cabeceo | |
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 quitan del gráfico de entidades.
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 | cabeceo |
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
Solo se admite el tipo de archivo
CSV
para las cargas.Los límites en la cantidad de declaraciones
in
cuando se hace referencia a una lista de referencia en una consulta también se aplican a las declaracionesin
en una tabla de datos.Cantidad máxima de declaraciones
in
en una consulta: 10Cantidad máxima de instrucciones
in
en una consulta para columnas de tipo de datosString
yNumber
: 7Cantidad máxima de sentencias
in
con operadores de expresiones regulares: 4Cantidad máxima de declaraciones
in
con operadores CIDR: 2Cantidad 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
Límite máximo de filas cuando se sube un archivo a una tabla de datos nueva en la página web: 10,000 filas
Límite de tamaño máximo de carga de archivos para la creación de tablas de datos desde la API: 1 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
string
solo se pueden unir con campos de cadena de eventos o entidades del UDM.Usa solo columnas sin asignar en una tabla de datos con un tipo de datos establecido en
cidr
oregex
para 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 se limitan a 100 caracteres.
Uniones
No se admite la recuperación de todas las muestras de eventos para las detecciones cuando se usan uniones 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 significa que no puedes hacer lo siguiente:
Aplica un conjunto de filtros a una tabla de datos y únelo a una entidad del UDM.
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
dt
con 3 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 en una tabla de datos y, luego, las filas filtradas de la tabla de datos se unen con el UDM. En este caso, se une una tabla de datos vacía con e1
y e2
porque los dos filtros de la tabla de datos dt
se contradicen entre sí (%dt.org ="hr" and %dt.org !="hr"
).
Usa tablas de datos con reglas
Las siguientes limitaciones se aplican a las tablas de datos cuando se usan con reglas.
Frecuencia de ejecución
La frecuencia de ejecución en tiempo real no es compatible con las reglas que incluyen tablas de datos.
Salida a tablas de datos
Los modificadores
any
yall
no se admiten para 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 columnas de la tabla de datos ni la ruta de eventos.
Las listas de columnas deben incluir las columnas de clave primaria para las tablas de datos.
No puedes tener más de 20 resultados.
Si no existe una tabla de datos, se crea una nueva con el tipo de datos de cadena predeterminado 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, se produce un error en 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 regla tiene un límite en la cantidad de filas de resultados. Se aplica un límite de 10,000 filas a los datos persistentes y de resultados. El mismo límite se aplica a las tablas de datos: una sola ejecución de regla puede generar un máximo de 10,000 filas en una tabla de datos.
Si ya existe una fila con la misma clave primaria en la tabla de datos, las columnas que no sean de clave primaria se reemplazarán por los valores nuevos.
Enriquecimiento de entidades a partir de tablas de datos
Solo puedes aplicar una operación de enriquecimiento (
override
,append
oexclude
) a una sola variable de gráfico de entidades.Cada operación de enriquecimiento se puede realizar con una sola tabla de datos.
Puedes 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 de anulación a la variable $g1
del gráfico de entidades y se aplica 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 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]
Cómo 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 búsquedas en tablas de datos con la API de Chronicle. Solo puedes ejecutar búsquedas desde 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 clientes que usan claves de encriptación administradas por el cliente (CMEK).
Las escrituras están limitadas a 6 por minuto por cliente.
La asistencia para la API no está disponible.
Las consultas de estadísticas no son compatibles con las uniones de tablas de datos.
La tabla de datos y la unión de tablas de datos solo se admiten con eventos del UDM y no con entidades.
Compatible:
%datatable1.column1 = %datatable2.column1
No compatible:graph.entity.hostname = %sample.test
No puedes incluir una variable
match
en la consulta de estadísticas de la secciónexport
.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.