Cómo usar tablas de datos

Compatible con:

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:

  1. Haz clic en Crear en la parte superior derecha de la barra lateral.

  2. 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.

  3. 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:

  1. Haz clic en Import Data (Importar datos).

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

  3. 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 en true.

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:

  1. En la pestaña Detalles, haz clic con el botón derecho en una fila existente y selecciona Agregar fila arriba.

  2. Ingresa datos para una fila nueva, en la que la primera fila se trata como un encabezado de tabla:

    1. Separa los campos de datos con comas o tabulaciones.
    2. Asegúrate de hacer coincidir cada elemento de datos con la columna de datos correspondiente.
    3. 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:

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

  2. 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:

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

  2. 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:

  1. 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.

  2. 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.

  3. 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.

  4. 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:

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

  2. 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:

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ón graph_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 y example_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 a metadata.interval.start_time.seconds)

    • end_time (mapeado a metadata.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ón join.

    Por ejemplo:

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

La condición de unión debe ser una expresión de igualdad entre la columna de la tabla de datos y el campo del gráfico de entidades. 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 declaraciones in en una tabla de datos.

  • Cantidad máxima de declaraciones in en una consulta: 10

  • Cantidad máxima de instrucciones in en una consulta para columnas de tipo de datos String y Number: 7

  • Cantidad máxima de sentencias in con operadores de expresiones regulares: 4

  • Cantidad máxima de declaraciones in con 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

  • 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 o regex 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 y my_email, y con la siguiente regla:

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

Primero, se aplican todos los filtros 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 y all 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 o exclude) 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]

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ón export.

    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.