Recopila registros de DNS de Cisco Umbrella

Compatible con:

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

  1. Accede al panel de Cisco Umbrella.
  2. Ve a Administrador > Administración de registros.
  3. Selecciona la opción Usar un bucket de Amazon S3 administrado por Cisco.
  4. 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.
  5. Haz clic en Guardar.
  6. 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.
  7. Copia los valores de Clave de acceso y Clave secreta. Si pierdes estas claves, debes volver a generarlas.
  8. Haz clic en Entendido > Continuar.
  9. 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

  1. Accede a la consola de administración de AWS.
  2. Crea un usuario siguiendo esta guía del usuario: Cómo crear un usuario de IAM.
  3. Selecciona el Usuario creado.
  4. Selecciona la pestaña Credenciales de seguridad.
  5. Haz clic en Crear clave de acceso en la sección Claves de acceso.
  6. Selecciona Servicio de terceros como Caso de uso.
  7. Haz clic en Siguiente.
  8. Opcional: Agrega una etiqueta de descripción.
  9. Haz clic en Crear clave de acceso.
  10. Haz clic en Descargar archivo CSV para guardar la clave de acceso y la clave de acceso secreta para usarlas más tarde.
  11. Haz clic en Listo.
  12. Selecciona la pestaña Permisos.
  13. Haz clic en Agregar permisos en la sección Políticas de permisos.
  14. Selecciona Agregar permisos.
  15. Selecciona Adjuntar políticas directamente.
  16. Busca y selecciona la política AmazonS3FullAccess.
  17. Haz clic en Siguiente.
  18. Haz clic en Agregar permisos.

Opcional: Configura un bucket de Amazon S3 autoadministrado

  1. Accede a la consola de administración de AWS.

  2. Ve a S3.

  3. Haz clic en Crear bucket.

  4. 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.
  5. Haz clic en Crear.

Opcional: Configura una política de bucket para el bucket de AWS S3 administrado por ti

  1. Haz clic en el bucket recién creado para abrirlo.
  2. Selecciona Propiedades > Permisos.
  3. En la lista Permisos, haz clic en Agregar política de bucket.
  4. 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.
  5. Haz clic en Guardar.

Opcional: Verificación obligatoria para el bucket de Amazon S3 administrado por el cliente

  1. En el panel de Cisco Umbrella, selecciona Administrador > Administración de registros > Amazon S3.
  2. En el campo Nombre del bucket, especifica el nombre exacto del bucket de Amazon S3 y, luego, haz clic en Verificar.
  3. 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.
  4. Descarga el archivo README_FROM_UMBRELLA.txt y ábrelo con un editor de texto.
  5. Copia y guarda el token único de Cisco Umbrella del archivo.
  6. Ve al panel de Cisco Umbrella.
  7. En el campo Número de token, especifica el token y haz clic en Guardar.
  8. 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

  1. Ve a Configuración de SIEM > Feeds.
  2. Haz clic en Agregar nueva.
  3. En el campo Nombre del feed, ingresa un nombre para el feed, por ejemplo, Registros de DNS de Cisco Umbrella.
  4. Selecciona Amazon S3 como el Tipo de fuente.
  5. Selecciona DNS de Cisco Umbrella como el Tipo de registro.
  6. Haz clic en Siguiente.
  7. 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.
    • 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.
  8. Haz clic en Siguiente.

  9. 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 y internalip.

2024-05-28

Mejora:

  • Se asignó dns_record_type a additional.fields.

2024-03-05

Corrección de errores:

  • Se agregó un nuevo patrón de Grok para verificar si column3 tiene internal_ip y internal_port.
  • Se agregó compatibilidad con los registros de CSV de túnel de red.
  • Se asignó rule_id a security_result.rule_id.
  • Se asignó dstport a target.port.
  • Se asignó srcPort a principal.port.
  • Se asignó _internalip a principal.ip.
  • Se asignó dstip a target.ip.
  • Se asignó direction a network.direction.
  • Se asignó tunnel_name a additional.fields.
  • Se asignó tunnel_type a metadata.product_event_type.
  • Se asignó origin_id a metadata.product_log_id.
  • Se asignó received_bytes a network.received_bytes.
  • Asignaciones alineadas para principal.ip y principal.asset.ip.
  • Asignaciones alineadas para target.ip y target.asset.ip.

2023-11-07

Mejora:

  • Se asignó first_name a principal.user.first_name cuando identityType es AD Users.
  • Se asignó last_name a principal.user.last_name cuando identityType es AD Users.
  • Se agregó la asignación de JSON para identity_types para admitir el nuevo patrón de valor identity en los registros.

2023-09-29

Mejora:

  • Se asignó returncode a network.dns.response_code.
  • Se asignó querytype a network.dns.question.type.
  • Se asignó type a additional.fields.
  • Se asignó categories a security_result.category_details.
  • Se asignó verdict a security_result.action y security_result.action_details.
  • Se asignó amp.disposition a security_result.detection_fields.
  • Se asignó amp.malware a security_result.detection_fields.
  • Se asignó amp.score a security_result.detection_fields.
  • Se asignó policy.rulesetid a security_result.detection_fields.
  • Se asignó requestsize a network.sent_bytes.
  • Se asignó responsesize a network.received_bytes.
  • Se asignó fileName a target.file.names.
  • Se asignó responsefilename a network.http.method.
  • Se asignó statuscode a network.http.response_code
  • Se asignaron tenantcontrols, securityoverridden y forwardingmethod a additional.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.