Recopila registros de DNS de Cisco Umbrella
En este documento, se explica cómo recopilar registros de DNS de Cisco Umbrella en un feed de Google Security Operations con el bucket de S3 de AWS. El analizador controla los registros con formato JSON y CSV. Extrae campos, les cambia el nombre para que coincidan con la UDM, controla diferentes versiones y formatos de registro (incluidos los registros de proxy y IP) y realiza una lógica específica para las identidades, las categorías de seguridad y los eventos de red, y, en última instancia, combina los datos extraídos en el esquema de la UDM.
Antes de comenzar
- Asegúrate de tener una instancia de Google SecOps.
- Asegúrate de tener acceso de administrador a AWS IAM y S3.
- Asegúrate de tener acceso con privilegios a Cisco Umbrella.
Configura un bucket de Amazon S3 administrado por Cisco
- Accede al panel de Cisco Umbrella.
- Ve a Administrador > Administración de registros.
- Selecciona la opción Usar un bucket de Amazon S3 administrado por Cisco.
- Proporciona los siguientes detalles de configuración:
- Seleccionar una región: Selecciona una región más cercana a tu ubicación para reducir la latencia.
- Selecciona una duración de retención: Selecciona el período. La duración de la retención es de 7, 14 o 30 días. Después del período seleccionado, los datos se borran y no se pueden recuperar. Si tu ciclo de transferencia es regular, usa un período más corto. Puedes cambiar la duración de la retención más adelante.
- Haz clic en Guardar.
- Haz clic en Continuar para confirmar tus selecciones y recibir la notificación de activación.
En la ventana Activation complete que aparece, se muestran los valores de Access key y Secret key. - Copia los valores de Clave de acceso y Clave secreta. Si pierdes estas claves, debes volver a generarlas.
- Haz clic en Entendido > Continuar.
- En una página de resumen, se muestra la configuración y el nombre de tu bucket. Puedes activar o desactivar el registro según lo requiera tu organización. Sin embargo, los registros se borran según la duración de la retención, independientemente de los datos nuevos que se agreguen.
Opcional: Configura claves de acceso de usuario para el bucket de AWS S3 autoadministrado
- Accede a la consola de administración de AWS.
- Crea un usuario siguiendo esta guía del usuario: Cómo crear un usuario de IAM.
- Selecciona el Usuario creado.
- Selecciona la pestaña Credenciales de seguridad.
- Haz clic en Crear clave de acceso en la sección Claves de acceso.
- Selecciona Servicio de terceros como Caso de uso.
- Haz clic en Siguiente.
- Opcional: Agrega una etiqueta de descripción.
- Haz clic en Crear clave de acceso.
- Haz clic en Descargar archivo CSV para guardar la clave de acceso y la clave de acceso secreta para usarlas más tarde.
- Haz clic en Listo.
- Selecciona la pestaña Permisos.
- Haz clic en Agregar permisos en la sección Políticas de permisos.
- Selecciona Agregar permisos.
- Selecciona Adjuntar políticas directamente.
- Busca y selecciona la política AmazonS3FullAccess.
- Haz clic en Siguiente.
- Haz clic en Agregar permisos.
Opcional: Configura un bucket de Amazon S3 autoadministrado
Accede a la consola de administración de AWS.
Ve a S3.
Haz clic en Crear bucket.
Proporciona los siguientes detalles de configuración:
- Nombre del bucket: Proporciona un nombre para el bucket de Amazon S3.
- Región: Selecciona una región.
Haz clic en Crear.
Opcional: Configura una política de bucket para el bucket de AWS S3 administrado por ti
- Haz clic en el bucket recién creado para abrirlo.
- Selecciona Propiedades > Permisos.
- En la lista Permisos, haz clic en Agregar política de bucket.
Ingresa la política de bucket preconfigurada de la siguiente manera:
{ "Version": "2008-10-17", "Statement": [ { "Sid": "", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::568526795995:user/logs" }, "Action": "s3:PutObject", "Resource": "arn:aws:s3:::BUCKET_NAME/*" }, { "Sid": "", "Effect": "Deny", "Principal": { "AWS": "arn:aws:iam::568526795995:user/logs" }, "Action": "s3:GetObject", "Resource": "arn:aws:s3:::BUCKET_NAME/*"}, { "Sid": "", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::568526795995:user/logs" }, "Action": "s3:GetBucketLocation", "Resource": "arn:aws:s3:::BUCKET_NAME" }, { "Sid": "", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::568526795995:user/logs" }, "Action": "s3:ListBucket", "Resource": "arn:aws:s3:::BUCKET_NAME" } ] }
- Reemplaza
BUCKET_NAME
por el nombre del bucket de Amazon S3 que proporcionaste.
- Reemplaza
Haz clic en Guardar.
Opcional: Verificación obligatoria para el bucket de Amazon S3 administrado por el cliente
- En el panel de Cisco Umbrella, selecciona Administrador > Administración de registros > Amazon S3.
- En el campo Nombre del bucket, especifica el nombre exacto del bucket de Amazon S3 y, luego, haz clic en Verificar.
- Como parte del proceso de verificación, se sube un archivo llamado
README_FROM_UMBRELLA.txt
desde Cisco Umbrella a tu bucket de Amazon S3. Es posible que debas actualizar el navegador para ver el archivo readme cuando se suba. - Descarga el archivo
README_FROM_UMBRELLA.txt
y ábrelo con un editor de texto. - Copia y guarda el token único de Cisco Umbrella del archivo.
- Ve al panel de Cisco Umbrella.
- En el campo Número de token, especifica el token y haz clic en Guardar.
- Si se realiza correctamente, recibirás un mensaje de confirmación en tu panel que indicará que el bucket se verificó correctamente. Si recibes un error que indica que no se puede verificar tu bucket, vuelve a verificar la sintaxis del nombre del bucket y revisa la configuración.
Configura un feed en Google SecOps para transferir los registros de DNS de Cisco Umbrella
- Ve a Configuración de SIEM > Feeds.
- Haz clic en Agregar nueva.
- En el campo Nombre del feed, ingresa un nombre para el feed, por ejemplo, Registros de DNS de Cisco Umbrella.
- Selecciona Amazon S3 como el Tipo de fuente.
- Selecciona DNS de Cisco Umbrella como el Tipo de registro.
- Haz clic en Siguiente.
Especifica valores para los siguientes parámetros de entrada:
- Región: Ingresa la región en la que se encuentra el bucket de Amazon S3.
- URI de S3: Es el URI del bucket.
s3:/BUCKET_NAME
- Reemplaza
BUCKET_NAME
por el nombre real del bucket.
- Reemplaza
- El URI es un: selecciona Directorio que incluye subdirectorios, Archivo único o Directorio, según la configuración de la transmisión de registros.
- Opciones de eliminación de fuentes: Selecciona la opción de eliminación según tus preferencias.
- ID de clave de acceso: Ingresa la clave de acceso del usuario con acceso al bucket de S3.
- Clave de acceso secreta: Ingresa la clave secreta del usuario con acceso al bucket de S3.
- Opcional: Espacio de nombres del activo: Proporciona el espacio de nombres del activo.
- Opcional: Etiquetas de transferencia: Proporciona la etiqueta que se aplicará a los eventos de este feed.
Haz clic en Siguiente.
Revisa la configuración de tu nuevo feed en la pantalla Finalizar y, luego, haz clic en Enviar.
Tabla de asignación de UDM
Campo de registro | Asignación de UDM | Lógica |
---|---|---|
action |
security_result.action_details |
El valor se toma del campo action si existe en los registros JSON, o de column6 o column7 en los registros CSV, y se convierte a mayúsculas (ALLOW o BLOCK). |
amp.disposition |
security_result.detection_fields[].key |
El valor es ampDisposition . |
amp.disposition |
security_result.detection_fields[].value |
El valor se toma del campo amp.disposition . |
amp.malware |
security_result.detection_fields[].key |
El valor es ampMalware . |
amp.malware |
security_result.detection_fields[].value |
El valor se toma del campo amp.malware . |
amp.score |
security_result.detection_fields[].key |
El valor es ampScore . |
amp.score |
security_result.detection_fields[].value |
El valor se toma del campo amp.score . |
blocked_categories |
security_result.category_details |
El valor se toma del campo blocked_categories . |
blockedfiletype |
security_result.detection_fields[].key |
El valor es egress type . |
blockedfiletype |
security_result.detection_fields[].value |
El valor se toma del campo blockedfiletype . |
bundleid |
additional.fields[].key |
El valor es bundleid . |
bundleid |
additional.fields[].value.string_value |
El valor se toma del campo bundleid . |
categories[] |
security_result.category_details |
El valor se toma del campo categories[].label . |
column1 |
metadata.event_timestamp.seconds |
El valor se analiza del campo column1 como una marca de tiempo. En el caso de los registros de proxy, si existen los campos date y time , se combinan y se analizan como una marca de tiempo. |
column10 |
network.http.user_agent |
El valor se toma del campo column10 . |
column10 |
additional.fields[].value.string_value |
El valor se toma del campo column10 . |
column11 |
target.port |
El valor se toma del campo column11 . |
column12 |
principal.resource.name |
El valor se toma del campo column12 . |
column13 |
security_result.rule_id |
El valor se toma del campo column13 . |
column14 |
security_result.action_details |
El valor se toma del campo column14 . |
column2 |
principal.user.user_display_name |
El valor se toma del campo column2 . |
column2 |
principal.user.userid |
El valor se toma del campo column2 . |
column2 |
principal.location.name |
El valor se toma del campo column2 . |
column3 |
principal.hostname |
El valor se toma del campo column3 . |
column3 |
principal.user.product_object_id |
El valor se toma del campo column3 . |
column3 |
principal.location.city |
El valor se toma del campo column3 . |
column3 |
additional.fields[].value.string_value |
El valor se toma del campo column3 . |
column4 |
principal.asset.ip |
El valor se toma del campo column4 . |
column4 |
principal.ip |
El valor se toma del campo column4 . |
column4 |
principal.port |
El valor se toma del campo column4 . |
column5 |
principal.asset.ip |
El valor se toma del campo column5 . |
column5 |
principal.ip |
El valor se toma del campo column5 . |
column5 |
target.asset.ip |
El valor se toma del campo column5 . |
column5 |
target.ip |
El valor se toma del campo column5 . |
column6 |
security_result.action_details |
El valor se toma del campo column6 . |
column6 |
target.port |
El valor se toma del campo column6 . |
column7 |
network.received_bytes |
El valor se toma del campo column7 . |
column7 |
additional.fields[].value.string_value |
El valor se toma del campo column7 . |
column8 |
principal.asset.ip |
El valor se toma del campo column8 . |
column8 |
principal.ip |
El valor se toma del campo column8 . |
column8 |
target.url |
El valor se toma del campo column8 . |
column9 |
principal.port |
El valor se toma del campo column9 . |
column9 |
network.http.referral_url |
El valor se toma del campo column9 . |
data_center_name |
principal.resource.name |
El valor se toma del campo data_center_name . |
datacenter.label |
security_result.detection_fields[].key |
El valor es datacenter label . |
datacenter.label |
security_result.detection_fields[].value |
El valor se toma del campo datacenter.label . |
destinationip |
target.asset.ip |
El valor se toma del campo destinationip . |
destinationip |
target.ip |
El valor se toma del campo destinationip . |
direction |
network.direction |
El valor se toma del campo direction y se convierte en mayúsculas. |
domain |
network.dns.questions[].name |
El valor se toma del campo domain , y se quita el punto final si está presente. |
dstPort |
target.port |
El valor se toma del campo dstPort . |
dstip |
target.asset.ip |
El valor se toma del campo dstip . |
dstip |
target.ip |
El valor se toma del campo dstip . |
egress.ip |
security_result.detection_fields[].key |
El valor es egress ip . |
egress.ip |
security_result.detection_fields[].value |
El valor se toma del campo egress.ip . |
egress.type |
security_result.detection_fields[].key |
El valor es egress type . |
egress.type |
security_result.detection_fields[].value |
El valor se toma del campo egress.type . |
externalip |
principal.asset.ip |
El valor se toma del campo externalip . |
externalip |
principal.ip |
El valor se toma del campo externalip . |
forwardingmethod |
additional.fields[].key |
El valor es forwardingmethod . |
forwardingmethod |
additional.fields[].value.string_value |
El valor se toma del campo forwardingmethod . |
granular_identity |
principal.user.user_display_name |
El valor se toma del campo granular_identity si están presentes granular_identity y most_granular_identity . De lo contrario, se deriva del campo _policy_identity y se analiza más en función de identityType . |
granular_identity |
principal.user.email_addresses |
El valor se extrae del campo granular_identity con una expresión regular. |
granular_identity |
principal.user.first_name |
El valor se extrae del campo granular_identity con una expresión regular. |
granular_identity |
principal.user.last_name |
El valor se extrae del campo granular_identity con una expresión regular. |
granular_identity |
principal.user.userid |
El valor se extrae del campo granular_identity con una expresión regular. |
granular_identity |
principal.hostname |
El valor se toma del campo granular_identity . |
granular_identity |
principal.location.name |
El valor se toma del campo granular_identity . |
identity_types |
additional.fields[].value.string_value |
El valor se toma del campo identity_types . |
identities[] |
principal.user.product_object_id |
El valor se toma del campo identities[] . |
identities |
principal.user.product_object_id |
El valor se toma del campo identities . |
internalip |
principal.asset.ip |
El valor se toma del campo internalip . |
internalip |
principal.ip |
El valor se toma del campo internalip . |
isolated.fileaction |
security_result.detection_fields[].key |
El valor es isolated fileaction . |
isolated.fileaction |
security_result.detection_fields[].value |
El valor se toma del campo isolated.fileaction . |
isolated.state |
security_result.detection_fields[].key |
El valor es isolated state . |
isolated.state |
security_result.detection_fields[].value |
El valor se toma del campo isolated.state . |
most_granular_identity |
principal.user.identityType |
El valor se toma del campo most_granular_identity si están presentes granular_identity y most_granular_identity . De lo contrario, se toma del campo _policy_identity_type . |
nat_destination_ip |
principal.asset.ip |
El valor se toma del campo nat_destination_ip . |
nat_destination_ip |
principal.ip |
El valor se toma del campo nat_destination_ip . |
odns_categories |
security_result.category_details |
El valor se toma del campo odns_categories . |
policy.ruleid |
security_result.rule_id |
El valor se toma del campo policy.ruleid . |
policy.rulesetid |
security_result.detection_fields[].key |
El valor es rulesetid . |
policy.rulesetid |
security_result.detection_fields[].value |
El valor se toma del campo policy.rulesetid . |
policy.timebasedrule |
security_result.detection_fields[].key |
El valor es timebasedrule . |
policy.timebasedrule |
security_result.detection_fields[].value |
El valor se toma del campo policy.timebasedrule . |
port |
target.port |
El valor se toma del campo port . |
query_type_name |
network.dns.questions[].type |
La parte numérica se extrae del campo query_type_name con una expresión regular y se convierte en un número entero. |
query_type_name |
additional.fields[].value.string_value |
La parte de la cadena entre paréntesis se extrae del campo query_type_name con una expresión regular. |
querytype |
network.dns.questions[].type |
El valor se toma del campo querytype y se asigna a un valor numérico según el tipo de registro DNS. |
referer |
network.http.referral_url |
El valor se toma del campo referer . |
requestmethod |
network.http.method |
El valor se toma del campo requestmethod . |
requestsize |
network.sent_bytes |
El valor se toma del campo requestsize y se convierte en un número entero sin firma. |
response |
additional.fields[].value.string_value |
El valor se toma del campo response . |
responsecode |
network.http.response_code |
El valor se toma del campo responsecode . |
responsefilename |
target.file.names |
El valor se toma del campo responsefilename . |
responsesize |
network.received_bytes |
El valor se toma del campo responsesize y se convierte en un número entero sin firma. |
returncode |
network.dns.response_code |
El valor se toma del campo returncode y se convierte en un número entero sin firma. |
securityoverridden |
additional.fields[].key |
El valor es securityoverridden . |
securityoverridden |
additional.fields[].value.string_value |
El valor se toma del campo securityoverridden . |
sha256 |
target.file.sha256 |
El valor se toma del campo sha256 . |
source_ip |
principal.asset.ip |
El valor se toma del campo source_ip si existe en los registros JSON o de column3 en los registros CSV. |
source_ip |
principal.ip |
El valor se toma del campo source_ip si existe en los registros JSON o de column3 en los registros CSV. |
srcPort |
principal.port |
El valor se toma del campo srcPort . |
statuscode |
network.http.response_code |
El valor se toma del campo statuscode . |
tenantcontrols |
additional.fields[].key |
El valor es tenantcontrols . |
tenantcontrols |
additional.fields[].value.string_value |
El valor se toma del campo tenantcontrols . |
timestamp |
metadata.event_timestamp.seconds |
El valor se analiza del campo timestamp como una marca de tiempo. |
tunnel_name |
additional.fields[].key |
El valor es tunnel_name . |
tunnel_name |
additional.fields[].value.string_value |
El valor se toma del campo tunnel_name . |
tunnel_type |
metadata.product_event_type |
El valor se toma del campo tunnel_type . |
type |
additional.fields[].key |
El valor es type . |
type |
additional.fields[].value.string_value |
El valor se toma del campo type . |
url |
target.url |
El valor se toma del campo url . |
useragent |
network.http.user_agent |
El valor se toma del campo useragent . |
verdict |
security_result.action_details |
El valor se toma del campo verdict . |
warnstatus |
security_result.detection_fields[].key |
El valor es warnstatus . |
warnstatus |
security_result.detection_fields[].value |
El valor se toma del campo warnstatus . El valor es DNS Lookup Type . La parte de la cadena entre paréntesis se extrae del campo query_type_name con una expresión regular, o bien es una cadena vacía si el campo no está presente. El valor es DNS request and response were made. . Se determina en función de la presencia de ciertos campos: NETWORK_DNS si question.name está presente, NETWORK_CONNECTION si principal.ip y target.ip están presentes, STATUS_UPDATE si solo principal.ip está presente o GENERIC_EVENT en caso contrario. El valor es UMBRELLA_DNS . El valor es Umbrella DNS . El valor es Cisco . El valor se establece inicialmente en DNS . Si requestmethod es un método HTTP válido, se cambia a HTTP . La parte numérica se extrae del campo query_type_name con una expresión regular y se convierte en un número entero, o se deriva del campo querytype y se asigna a un valor numérico según el tipo de registro DNS. El valor se obtiene del campo useragent o column10 con el filtro parseduseragent . El valor se toma de la última parte del campo column3 después de dividirlo por comas, o es una cadena vacía si el campo no está presente. El valor se toma de la primera parte del campo column3 después de dividirlo por comas, o se toma del campo column2 si column3 no está presente. El valor se extrae del campo column2 o column3 con una expresión regular. El valor se extrae del campo column2 o column3 con una expresión regular. El valor se extrae del campo column2 o column3 con una expresión regular. El valor se extrae del campo column2 o column3 con una expresión regular. El valor se obtiene del campo action , column6 , column7 o verdict y se convierte a mayúsculas (PERMITIR o BLOQUEAR). El valor se establece en NETWORK_MALICIOUS si _categories contiene Malware o en NETWORK_SUSPICIOUS si _categories contiene Potentially Harmful . |
Cambios
2025-01-08
Mejora:
- Se agregó un nuevo patrón GROK para analizar los datos de SYSLOG.
- Se agregó un nuevo patrón de Grok para los campos
responsecode
yinternalip
.
2024-05-28
Mejora:
- Se asignó
dns_record_type
aadditional.fields
.
2024-03-05
Corrección de errores:
- Se agregó un nuevo patrón de Grok para verificar si
column3
tieneinternal_ip
yinternal_port
. - Se agregó compatibilidad con los registros de CSV de túnel de red.
- Se asignó
rule_id
asecurity_result.rule_id
. - Se asignó
dstport
atarget.port
. - Se asignó
srcPort
aprincipal.port
. - Se asignó
_internalip
aprincipal.ip
. - Se asignó
dstip
atarget.ip
. - Se asignó
direction
anetwork.direction
. - Se asignó
tunnel_name
aadditional.fields
. - Se asignó
tunnel_type
ametadata.product_event_type
. - Se asignó
origin_id
ametadata.product_log_id
. - Se asignó
received_bytes
anetwork.received_bytes
. - Asignaciones alineadas para
principal.ip
yprincipal.asset.ip
. - Asignaciones alineadas para
target.ip
ytarget.asset.ip
.
2023-11-07
Mejora:
- Se asignó
first_name
aprincipal.user.first_name
cuandoidentityType
esAD Users
. - Se asignó
last_name
aprincipal.user.last_name
cuandoidentityType
esAD Users
. - Se agregó la asignación de JSON para
identity_types
para admitir el nuevo patrón de valoridentity
en los registros.
2023-09-29
Mejora:
- Se asignó
returncode
anetwork.dns.response_code
. - Se asignó
querytype
anetwork.dns.question.type
. - Se asignó
type
aadditional.fields
. - Se asignó
categories
asecurity_result.category_details
. - Se asignó
verdict
asecurity_result.action
ysecurity_result.action_details
. - Se asignó
amp.disposition
asecurity_result.detection_fields
. - Se asignó
amp.malware
asecurity_result.detection_fields
. - Se asignó
amp.score
asecurity_result.detection_fields
. - Se asignó
policy.rulesetid
asecurity_result.detection_fields
. - Se asignó
requestsize
anetwork.sent_bytes
. - Se asignó
responsesize
anetwork.received_bytes
. - Se asignó
fileName
atarget.file.names
. - Se asignó
responsefilename
anetwork.http.method
. - Se asignó
statuscode
anetwork.http.response_code
- Se asignaron
tenantcontrols
,securityoverridden
yforwardingmethod
aadditional.fields
.
2022-05-17
Mejora:
- Se agregaron verificaciones condicionales para "security_result.action".
13-4-2022
Mejora:
- Se analizaron los registros de IP y los registros de proxy que se descartaron antes.
2022-03-23
Mejora:
- Se agregó una nueva asignación de campos.
- Tipo de búsqueda de DNS asignado a etiquetas
¿Necesitas más ayuda? Obtén respuestas de miembros de la comunidad y profesionales de Google SecOps.