Recopilar registros de Cloudflare
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
- Ve a Configuración de SIEM > Feeds.
- Haz clic en Añadir nuevo.
- En el campo Nombre del feed, introduce un nombre para el feed (por ejemplo,
Cloudflare Webhook
). - Selecciona Webhook como Tipo de fuente.
- Seleccione Cloudflare como Tipo de registro.
- Haz clic en Siguiente.
- 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.
- Delimitador de división:
- Haz clic en Siguiente.
- Revise la configuración de la nueva fuente en la pantalla Finalizar y, a continuación, haga clic en Enviar.
- Haz clic en Generar clave secreta para generar una clave secreta que autentique este feed.
- Copia y guarda la clave secreta, ya que no podrás volver a verla.
- Ve a la pestaña Detalles.
- Copia la URL del endpoint del feed del campo Endpoint Information (Información del endpoint).
- Haz clic en Listo.
Crear una clave de API para el feed de webhook
- Ve a la consola > APIs y servicios > Credenciales.Google Cloud
- Haz clic en Crear credenciales y, a continuación, selecciona Clave de API.
- Haz clic en Editar clave de API.
- En Restricciones de API, selecciona Restringir clave.
- Selecciona API Google SecOps en la lista.
- Haz clic en Guardar.
- Copia el valor de la clave de API.
Configurar el destino HTTP de Logpush de Cloudflare
- Inicia sesión en el panel de control de Cloudflare.
- Selecciona la cuenta de empresa o el dominio que quieras usar con LogPush.
- Ve a Analíticas y registros > Logpush.
- Haga clic en Create a Logpush job (Crear un trabajo de Logpush).
- En Seleccionar un destino, elige Destino HTTP.
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).
Haz clic en Continuar.
Selecciona el conjunto de datos que quieras enviar (por ejemplo, Solicitudes HTTP, DNS, Auditoría, Confianza cero o CASB).
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.
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:
- Ve a Investigación > Búsqueda en SIEM.
- Busca registros con la etiqueta de ingestión que hayas configurado.
- 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
- Inicia sesión en la consolaGoogle Cloud .
- Ve a la página Segmentos de Cloud Storage.
- Haz clic en Crear.
- 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.
- Nombre: introduzca un nombre único que cumpla los requisitos de los nombres de los contenedores (por ejemplo,
- Haz clic en Crear.
Concede permisos al segmento
- En la consola de Cloud Storage, selecciona el segmento que has creado anteriormente.
- Haz clic en la pestaña Permisos.
- Haz clic en Conceder acceso.
- Añade la cuenta
logpush@cloudflare-data.iam.gserviceaccount.com
con el permiso Administrador de objetos de Storage. - Haz clic en Guardar.
Configurar Logpush de Cloudflare en Google Cloud Storage
- Inicia sesión en el panel de control de Cloudflare.
- Selecciona la cuenta de empresa o el dominio que quieras usar con LogPush.
- Ve a Analíticas y registros > Logpush.
- Haga clic en Create a Logpush job (Crear un trabajo de Logpush).
- En Seleccionar un destino, elige Google Cloud Storage.
- Introduce la ruta del segmento de Google Cloud Storage (por ejemplo,
gs://cloudflare-data/logs/
). Haz clic en Continuar.
Introduce el token de propiedad y haz clic en Continuar.
Selecciona el conjunto de datos que quieras enviar al almacenamiento.
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.
Haz clic en Enviar.
Configurar un feed en Google SecOps para ingerir registros de Cloudflare desde Google Cloud Storage
- Ve a Configuración de SIEM > Feeds.
- Haz clic en Añadir nuevo.
- En el campo Nombre del feed, introduce un nombre para el feed (por ejemplo,
Cloudflare GCS Logs
). - Selecciona Google Cloud Storage V2 como Tipo de origen.
- Seleccione Cloudflare como Tipo de registro.
- Haz clic en Obtener cuenta de servicio.
- Haz clic en Siguiente.
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.
- URI de segmento de almacenamiento: Google Cloud URL del segmento en formato
Haz clic en Siguiente.
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.