Recopilar registros de Cloudflare

Disponible en:

En este documento se explica cómo ingerir registros de Cloudflare en Google Security Operations mediante un webhook (destino HTTP) o Google Cloud Storage. Cloudflare genera datos operativos en forma de registros de DNS, HTTP, auditoría, Zero Trust y CASB. Esta integración te permite enviar estos registros a Google SecOps para analizarlos y monitorizarlos. El analizador primero inicializa un conjunto de campos vacíos y, a continuación, analiza los registros de Cloudflare con formato JSON y descarta los mensajes que no sean JSON válidos. A continuación, el código usa una lógica condicional basada en la presencia y los valores de campos específicos para determinar el producto y el tipo de evento de Cloudflare, rellenando los campos del modelo de datos unificado (UDM) en consecuencia.

Antes de empezar

Asegúrate de que cumples los siguientes requisitos previos:

  • Instancia de Google SecOps.
  • Cuenta de Cloudflare Enterprise con LogPush habilitado.
  • En el caso del método Webhook, se necesita acceso privilegiado a la consola Google Cloud .
  • Método de Google Cloud Storage: acceso privilegiado a Google Cloud Storage.

Método 1: Configurar la exportación de registros de Cloudflare mediante Webhook (destino HTTP)

Este método te permite transmitir registros de Cloudflare directamente a Google SecOps sin almacenamiento intermedio.

Configurar un feed de webhook en Google SecOps

  1. Ve a Configuración de SIEM > Feeds.
  2. Haz clic en Añadir nuevo.
  3. En el campo Nombre del feed, introduce un nombre para el feed (por ejemplo, Cloudflare Webhook).
  4. Selecciona Webhook como Tipo de fuente.
  5. Seleccione Cloudflare como Tipo de registro.
  6. Haz clic en Siguiente.
  7. Especifique los valores de los siguientes parámetros de entrada:
    • Delimitador de división: \n.
    • Espacio de nombres de recursos: el espacio de nombres de recursos.
    • Etiquetas de ingestión: etiqueta que se aplicará a los eventos de este feed.
  8. Haz clic en Siguiente.
  9. Revise la configuración de la nueva fuente en la pantalla Finalizar y, a continuación, haga clic en Enviar.
  10. Haz clic en Generar clave secreta para generar una clave secreta que autentique este feed.
  11. Copia y guarda la clave secreta, ya que no podrás volver a verla.
  12. Ve a la pestaña Detalles.
  13. Copia la URL del endpoint del feed del campo Endpoint Information (Información del endpoint).
  14. Haz clic en Listo.

Crear una clave de API para el feed de webhook

  1. Ve a la consola > APIs y servicios > Credenciales.Google Cloud
  2. Haz clic en Crear credenciales y, a continuación, selecciona Clave de API.
  3. Haz clic en Editar clave de API.
  4. En Restricciones de API, selecciona Restringir clave.
  5. Selecciona API Google SecOps en la lista.
  6. Haz clic en Guardar.
  7. Copia el valor de la clave de API.

Configurar el destino HTTP de Logpush de Cloudflare

  1. Inicia sesión en el panel de control de Cloudflare.
  2. Selecciona la cuenta de empresa o el dominio que quieras usar con LogPush.
  3. Ve a Analíticas y registros > Logpush.
  4. Haga clic en Create a Logpush job (Crear un trabajo de Logpush).
  5. En Seleccionar un destino, elige Destino HTTP.
  6. Introduce la URL del endpoint HTTP con los parámetros de autenticación:

    <ENDPOINT_URL>?header_X-goog-api-key=<API_KEY>&header_X-Webhook-Access-Key=<SECRET_KEY>
    

    Haz los cambios siguientes:

    • <ENDPOINT_URL>: URL del endpoint del feed de Google SecOps.
    • <API_KEY>: la clave de API de la consola Google Cloud (codificada como URL si contiene caracteres especiales).
    • <SECRET_KEY>: la clave secreta del feed de webhook (codificada como URL si contiene caracteres especiales).
  7. Haz clic en Continuar.

  8. Selecciona el conjunto de datos que quieras enviar (por ejemplo, Solicitudes HTTP, DNS, Auditoría, Confianza cero o CASB).

  9. Configura tu trabajo de envío de registros:

    • Escribe el nombre del trabajo.
    • Opcional: En Si los registros coinciden, configura los filtros.
    • En Enviar los siguientes campos, selecciona los campos que quieras incluir.
    • Elige el formato de marca de tiempo (te recomendamos RFC3339).
    • Configura la frecuencia de muestreo si es necesario.
  10. Haz clic en Enviar para crear el trabajo de envío de registros.

Verificar la integración de webhook

Una vez configurados, los registros deberían aparecer en Google SecOps en cuestión de minutos. Para verificarlo, sigue estos pasos:

  1. Ve a Investigación > Búsqueda en SIEM.
  2. Busca registros con la etiqueta de ingestión que hayas configurado.
  3. Confirma que los registros de Cloudflare se están analizando correctamente.

Método 2: Configurar la exportación de registros de Cloudflare mediante Google Cloud Storage

Configura Cloudflare para que envíe los registros, lo que implica conceder a Cloudflare los permisos necesarios.

Crear un Google Cloud Bucket

  1. Inicia sesión en la consolaGoogle Cloud .
  2. Ve a la página Segmentos de Cloud Storage.
  3. Haz clic en Crear.
  4. En la página Crear un segmento, introduce la información del segmento:
    • Nombre: introduzca un nombre único que cumpla los requisitos de los nombres de los contenedores (por ejemplo, cloudflare-data).
    • Tipo de ubicación: selecciona un tipo de ubicación y una región.
    • Para habilitar el espacio de nombres jerárquico, haz clic en la flecha para desplegar Optimizar para cargas de trabajo orientadas a archivos y con gran cantidad de datos y, a continuación, selecciona Habilitar espacio de nombres jerárquico en este bucket.
  5. Haz clic en Crear.

Concede permisos al segmento

  1. En la consola de Cloud Storage, selecciona el segmento que has creado anteriormente.
  2. Haz clic en la pestaña Permisos.
  3. Haz clic en Conceder acceso.
  4. Añade la cuenta logpush@cloudflare-data.iam.gserviceaccount.com con el permiso Administrador de objetos de Storage.
  5. Haz clic en Guardar.

Configurar Logpush de Cloudflare en Google Cloud Storage

  1. Inicia sesión en el panel de control de Cloudflare.
  2. Selecciona la cuenta de empresa o el dominio que quieras usar con LogPush.
  3. Ve a Analíticas y registros > Logpush.
  4. Haga clic en Create a Logpush job (Crear un trabajo de Logpush).
  5. En Seleccionar un destino, elige Google Cloud Storage.
  6. Introduce la ruta del segmento de Google Cloud Storage (por ejemplo, gs://cloudflare-data/logs/).
  7. Haz clic en Continuar.

  8. Introduce el token de propiedad y haz clic en Continuar.

  9. Selecciona el conjunto de datos que quieras enviar al almacenamiento.

  10. Configura tu trabajo de envío de registros:

    • Escribe el nombre del trabajo.
    • En Si los registros coinciden, puede seleccionar los eventos que quiere incluir o quitar de sus registros.
    • En Enviar los siguientes campos, elige los registros que quieras enviar.
    • Elige el formato de marca de tiempo (te recomendamos RFC 339).
    • Configura la frecuencia de muestreo si es necesario.
  11. Haz clic en Enviar.

Configurar un feed en Google SecOps para ingerir registros de Cloudflare desde Google Cloud Storage

  1. Ve a Configuración de SIEM > Feeds.
  2. Haz clic en Añadir nuevo.
  3. En el campo Nombre del feed, introduce un nombre para el feed (por ejemplo, Cloudflare GCS Logs).
  4. Selecciona Google Cloud Storage V2 como Tipo de origen.
  5. Seleccione Cloudflare como Tipo de registro.
  6. Haz clic en Obtener cuenta de servicio.
  7. Haz clic en Siguiente.
  8. Especifique los valores de los siguientes parámetros de entrada:

    • URI de segmento de almacenamiento: Google Cloud URL del segmento en formato gs://my-bucket/<value>/. Esta URL debe terminar con una barra inclinada (/).
    • Opciones de eliminación de la fuente: selecciona la opción de eliminación que prefieras.
    • Antigüedad máxima del archivo: incluye los archivos modificados en los últimos días. El valor predeterminado es 180 días.
    • Espacio de nombres de recursos: el espacio de nombres de recursos.
    • Etiquetas de ingestión: etiqueta que se aplicará a los eventos de este feed.
  9. Haz clic en Siguiente.

  10. Revise la configuración de la nueva fuente en la pantalla Finalizar y, a continuación, haga clic en Enviar.

Tabla de asignación de UDM

Campo de registro Asignación de UDM Lógica
ClientIP read_only_udm.principal.asset.ip
read_only_udm.principal.ip
El valor se toma del campo ClientIP.
ClientRequestHost read_only_udm.target.asset.hostname
read_only_udm.target.hostname
El valor se toma del campo ClientRequestHost.
ClientRequestMethod read_only_udm.network.http.method El valor se toma del campo ClientRequestMethod.
ClientRequestURI read_only_udm.target.url El valor se toma del campo ClientRequestURI. Si el campo ClientRequestHost no está vacío, el valor se concatena con el campo ClientRequestHost.
ClientSrcPort read_only_udm.principal.port El valor se toma del campo ClientSrcPort.
ClientRequestUserAgent read_only_udm.network.http.user_agent El valor se toma del campo ClientRequestUserAgent.
ClientSSLCipher read_only_udm.network.tls.cipher El valor se toma del campo ClientSSLCipher.
ClientSSLProtocol read_only_udm.network.tls.version El valor se toma del campo ClientSSLProtocol.
País read_only_udm.target.location.country_or_region El valor se toma del campo País.
CreatedAt read_only_udm.metadata.event_timestamp El valor se toma del campo CreatedAt.
Fecha y hora read_only_udm.metadata.event_timestamp El valor se toma del campo Fecha y hora.
DestinationIP read_only_udm.target.asset.ip
read_only_udm.target.ip
El valor se toma del campo DestinationIP.
DestinationPort read_only_udm.target.port El valor se toma del campo DestinationPort.
DeviceID read_only_udm.principal.asset_id El valor se toma del campo DeviceID y se le añade el prefijo "Cloudflare:".
DeviceName read_only_udm.principal.asset.hostname
read_only_udm.principal.hostname
El valor se toma del campo DeviceName.
DstIP read_only_udm.target.asset.ip
read_only_udm.target.ip
El valor se toma del campo DstIP.
DstPort read_only_udm.target.port El valor se toma del campo DstPort.
EdgeResponseBytes read_only_udm.network.received_bytes El valor se toma del campo EdgeResponseBytes.
EdgeResponseStatus read_only_udm.network.http.response_code El valor se toma del campo EdgeResponseStatus.
EdgeServerIP read_only_udm.target.asset.ip
read_only_udm.target.ip
El valor se toma del campo EdgeServerIP.
Correo electrónico read_only_udm.principal.user.email_addresses
read_only_udm.target.user.email_addresses
El valor se toma del campo de correo electrónico.
FirewallMatchesActions read_only_udm.security_result.action El valor es "ALLOW" si el campo FirewallMatchesAction es "allow", "Allow", "ALLOW", "skip", "SKIP" o "Skip", "ALLOW_WITH_MODIFICATION" si el campo FirewallMatchesAction es "challengeSolved" o "jschallengeSolved", "BLOCK" si el campo FirewallMatchesAction es "drop" o "block", y "UNKNOWN_ACTION" si el campo FirewallMatchesAction no está vacío.
FirewallMatchesRuleIDs read_only_udm.security_result.rule_id El valor se toma del campo FirewallMatchesRuleIDs.
FirewallMatchesSources read_only_udm.security_result.rule_name El valor se toma del campo FirewallMatchesSources.
HTTPMethod read_only_udm.network.http.method El valor se toma del campo HTTPMethod.
HTTPHost read_only_udm.target.hostname El valor se toma del campo HTTPHost.
HTTPVersion read_only_udm.network.application_protocol El valor se toma del campo HTTPVersion. Si el valor contiene "HTTP", se sustituye por "HTTP".
IPAddress read_only_udm.target.asset.ip
read_only_udm.target.ip
El valor se toma del campo IPAddress.
IsIsolated read_only_udm.about.labels
read_only_udm.security_result.about.resource.attribute.labels
El valor se toma del campo IsIsolated y se convierte en una cadena.
Ubicación read_only_udm.principal.location.name El valor se toma del campo Ubicación.
OriginIP read_only_udm.intermediary.ip
read_only_udm.target.asset.ip
read_only_udm.target.ip
El valor se toma del campo OriginIP.
OriginPort read_only_udm.target.port El valor se toma del campo OriginPort.
OwnerID read_only_udm.target.user.product_object_id El valor se toma del campo OwnerID.
Política read_only_udm.security_result.rule_name El valor se toma del campo Política.
PolicyID read_only_udm.security_result.rule_id El valor se toma del campo PolicyID.
PolicyName read_only_udm.security_result.rule_name El valor se toma del campo PolicyName.
Protocolo read_only_udm.network.ip_protocol El valor se toma del campo Protocol y se convierte a mayúsculas.
QueryCategoryIDs read_only_udm.security_result.about.labels
read_only_udm.security_result.about.resource.attribute.labels
El valor se toma del campo QueryCategoryIDs.
QueryName read_only_udm.network.dns.questions.name El valor se toma del campo QueryName.
QueryNameReversed read_only_udm.network.dns.questions.name El valor se toma del campo QueryNameReversed.
QuerySize read_only_udm.network.sent_bytes El valor se toma del campo QuerySize.
QueryType read_only_udm.network.dns.questions.type El valor se toma del campo QueryType. Si el valor es uno de los tipos de registro DNS conocidos, se asigna a su valor numérico correspondiente. De lo contrario, el valor se convierte en una cadena.
RData read_only_udm.network.dns.answers El valor se toma del campo RData. El campo de tipo se convierte en un entero sin signo.
RayID read_only_udm.metadata.product_log_id El valor se toma del campo RayID.
Referencia read_only_udm.network.http.referral_url El valor se toma del campo Referer.
RequestID read_only_udm.metadata.product_log_id El valor se toma del campo RequestID.
ResolverDecision read_only_udm.security_result.summary El valor se toma del campo ResolverDecision.
ResourceID read_only_udm.target.resource.id
read_only_udm.target.resource.product_object_id
El valor se toma del campo ResourceID.
ResourceType read_only_udm.target.resource.resource_subtype El valor se toma del campo ResourceType.
SNI read_only_udm.network.tls.client.server_name El valor se toma del campo SNI.
SecurityAction read_only_udm.security_result.action El valor es "ALLOW" si el campo SecurityAction está vacío o si el campo sec_action está vacío. El valor es "ALLOW_WITH_MODIFICATION" si el campo SecurityAction es "challengeSolved" o "jschallengeSolved". El valor es "BLOCK" si el campo SecurityAction es "drop" o "block".
SecurityLevel read_only_udm.security_result.severity El valor se toma del campo SecurityLevel y se asigna a su valor de gravedad de UDM correspondiente.
SessionID read_only_udm.network.session_id El valor se toma del campo SessionID.
SessionStartTime read_only_udm.metadata.event_timestamp El valor se toma del campo SessionStartTime.
SourceIP read_only_udm.principal.asset.ip
read_only_udm.principal.ip
read_only_udm.src.asset.ip
read_only_udm.src.ip
El valor se toma del campo SourceIP.
SourcePort read_only_udm.principal.port
read_only_udm.src.port
El valor se toma del campo SourcePort.
SrcIP read_only_udm.principal.asset.ip
read_only_udm.principal.ip
El valor se toma del campo SrcIP.
SrcPort read_only_udm.principal.port El valor se toma del campo SrcPort.
TemporaryAccessDuration read_only_udm.network.session_duration.seconds El valor se toma del campo TemporaryAccessDuration.
Marca de tiempo read_only_udm.metadata.event_timestamp El valor se toma del campo Timestamp.
Transport read_only_udm.network.ip_protocol El valor se toma del campo Transporte y se convierte a mayúsculas.
URL read_only_udm.target.url El valor se toma del campo URL.
UserAgent read_only_udm.network.http.user_agent El valor se toma del campo UserAgent.
UserID read_only_udm.principal.user.product_object_id El valor se toma del campo UserID.
UserUID read_only_udm.target.user.product_object_id El valor se toma del campo UserUID.
VirtualNetworkID read_only_udm.principal.resource.product_object_id El valor se toma del campo VirtualNetworkID.
WAFAction read_only_udm.security_result.about.labels
read_only_udm.security_result.about.resource.attribute.labels
El valor se toma del campo WAFAction.
WAFAttackScore read_only_udm.security_result.about.resource.attribute.labels El valor se toma del campo WAFAttackScore.
WAFFlags read_only_udm.security_result.about.resource.attribute.labels El valor se toma del campo WAFFlags.
WAFProfile read_only_udm.security_result.about.labels
read_only_udm.security_result.about.resource.attribute.labels
El valor se toma del campo WAFProfile.
WAFRCEAttackScore read_only_udm.security_result.about.resource.attribute.labels El valor se toma del campo WAFRCEAttackScore.
WAFRuleID read_only_udm.security_result.about.labels
read_only_udm.security_result.about.resource.attribute.labels
read_only_udm.security_result.threat_id
El valor se toma del campo WAFRuleID.
WAFRuleMessage read_only_udm.security_result.rule_name
read_only_udm.security_result.threat_name
El valor se toma del campo WAFRuleMessage.
WAFSQLiAttackScore read_only_udm.security_result.about.resource.attribute.labels El valor se toma del campo WAFSQLiAttackScore.
WAFXSSAttackScore read_only_udm.security_result.about.resource.attribute.labels El valor se toma del campo WAFXSSAttackScore.
ZoneID read_only_udm.additional.fields El valor se toma del campo ZoneID.
read_only_udm.metadata.log_type El valor es "CLOUDFLARE".
read_only_udm.metadata.product_name El valor es "Cloudflare Gateway DNS" si el registro es un registro DNS, "Cloudflare Gateway HTTP" si el registro es un registro HTTP de Gateway, "Cloudflare Audit" si el registro es un registro de auditoría o "Web Application Firewall" en cualquier otro caso.
read_only_udm.metadata.vendor_name El valor es "Cloudflare".
read_only_udm.network.application_protocol El valor es "DNS" si el registro es un registro DNS, "HTTP" si el campo HTTPVersion contiene "HTTP" o el valor del campo Protocol convertido a mayúsculas si el campo Protocol no está vacío y no es "tls" ni "TLS".
read_only_udm.network.direction El valor se define como "OUTBOUND" si el campo EgressIP no está vacío.
read_only_udm.network.http.parsed_user_agent El valor se toma del campo UserAgent o ClientRequestUserAgent y se analiza mediante el filtro parseduseragent.
read_only_udm.extensions.auth.type El valor es "MACHINE" si el campo Acción es "login" o "logout".
read_only_udm.metadata.event_type El valor es "NETWORK_DNS" si el registro es un registro DNS, "NETWORK_CONNECTION" si el registro es un registro HTTP de la pasarela, "USER_RESOURCE_ACCESS" si el registro es un registro de auditoría y los campos ActorIP y ActorEmail están vacíos, "USER_RESOURCE_UPDATE_CONTENT" si el registro es un registro de auditoría y los campos ResourceType y newvalue no están vacíos, "USER_LOGIN" si el campo Action es "login", "USER_LOGOUT" si el campo Action es "logout", "USER_RESOURCE_ACCESS" si el campo Email no está vacío y coincide con el formato de dirección de correo electrónico, o "NETWORK_CONNECTION" si los campos EgressIP y SourceIP no están vacíos o si los campos OriginIP y SourceIP no están vacíos.
read_only_udm.target.file.mime_type El valor se toma del campo EdgeResponseContentType.
read_only_udm.target.location.country_or_region El valor se toma del campo País.
read_only_udm.target.resource.id El valor se toma del campo AccountID o del campo ResourceID.
read_only_udm.target.resource.product_object_id El valor se toma del campo AccountID, AppUUID o ResourceID.
read_only_udm.target.user.product_object_id El valor se toma del campo OwnerID o del campo UserUID.

¿Necesitas más ayuda? Recibe respuestas de los miembros de la comunidad y de los profesionales de Google SecOps.