Recopila registros de Cloudflare
En este documento, se explica cómo transferir registros de Cloudflare a Google Security Operations con Webhook (destino HTTP) o Google Cloud Storage. Cloudflare genera datos operativos en forma de registros para DNS, HTTP, auditoría, Zero Trust y CASB. Esta integración te permite enviar estos registros a Google SecOps para su análisis y supervisión. Primero, el analizador inicializa un conjunto de campos vacíos y, luego, analiza los registros de Cloudflare con formato JSON, descartando los mensajes que no sean JSON válidos. Luego, el código usa 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, y completa los campos del modelo de datos unificado (UDM) según corresponda.
Antes de comenzar
Asegúrate de cumplir con los siguientes requisitos previos:
- Instancia de Google SecOps.
- Cuenta de Cloudflare Enterprise con LogPush habilitado
- Para el método de webhook, se requiere acceso privilegiado a la consola de Google Cloud .
- Para el método de Google Cloud Storage: Acceso privilegiado a Google Cloud Storage.
Método 1: Configura la exportación de registros de Cloudflare con Webhook (destino HTTP)
Este método te permite transmitir registros de Cloudflare directamente a Google SecOps sin almacenamiento intermedio.
Configura un feed de webhook en Google SecOps
- 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,
Cloudflare Webhook
). - Selecciona Webhook como el Tipo de origen.
- Selecciona Cloudflare como el Tipo de registro.
- Haz clic en Siguiente.
- Especifica valores para los siguientes parámetros de entrada:
- Delimitador de división:
\n
. - Espacio de nombres del recurso: Es el espacio de nombres del recurso.
- Etiquetas de transmisión: Es la etiqueta que se aplicará a los eventos de este feed.
- Delimitador de división:
- Haz clic en Siguiente.
- Revisa la nueva configuración del feed en la pantalla Finalizar y, luego, haz 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 extremo del feed desde el campo Información del extremo.
- Haz clic en Listo.
Crea una clave de API para el feed de webhook
- Ve a Google Cloud consola > APIs y servicios > Credenciales.
- Haz clic en Crear credenciales y selecciona Clave de API.
- Haz clic en Editar clave de API.
- En Restricciones de API, selecciona Restringir clave.
- Selecciona Google SecOps API en la lista.
- Haz clic en Guardar.
- Copia el valor de la clave de API.
Configura el destino HTTP de Cloudflare LogPush
- Accede al panel de Cloudflare.
- Selecciona la cuenta de Enterprise o el dominio que deseas usar con LogPush.
- Ve a Analytics & Logs > Logpush.
- Haz clic en Crear un trabajo de Logpush.
- En Selecciona un destino, elige Destino HTTP.
Ingresa la URL del extremo HTTP con parámetros de autenticación:
<ENDPOINT_URL>?header_X-goog-api-key=<API_KEY>&header_X-Webhook-Access-Key=<SECRET_KEY>
Reemplaza lo siguiente:
<ENDPOINT_URL>
: Es la URL del extremo del feed de Google SecOps.<API_KEY>
: Es la clave de API de la consola de Google Cloud (con codificación URL si contiene caracteres especiales).<SECRET_KEY>
: Es la clave secreta del feed de webhook (codificada en URL si contiene caracteres especiales).
Haz clic en Continuar.
Selecciona el conjunto de datos que deseas enviar (por ejemplo, Solicitudes HTTP, DNS, Auditoría, Confianza cero, CASB).
Configura tu trabajo de logpush:
- Ingresa el Nombre del trabajo.
- Opcional: En Si los registros coinciden, configura los filtros.
- En Send the following fields, selecciona los campos que deseas incluir.
- Elige el formato de marca de tiempo (se recomienda RFC3339).
- Configura la tasa de muestreo si es necesario.
Haz clic en Enviar para crear el trabajo de envío de registros.
Verifica la integración del webhook
Después de la configuración, los registros deberían aparecer en Google SecOps en cuestión de minutos. Para verificar, haz lo siguiente:
- Ve a Investigación > Búsqueda en SIEM.
- Busca registros con la etiqueta de transferencia configurada.
- Confirma que los registros de Cloudflare se analicen correctamente.
Método 2: Configura la exportación de registros de Cloudflare con Google Cloud Storage
Configura Cloudflare para que envíe registros, lo que implica otorgarle los permisos necesarios.
Crea un bucket Google Cloud
- Accede a la consola deGoogle Cloud .
- Ve a la página Buckets de Cloud Storage.
- Haz clic en Crear.
- En la página Crear un bucket, ingresa la información de tu bucket:
- Nombre: Ingresa un nombre único que cumpla con los requisitos de nomenclatura de bucket (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 de expansión para expandir Optimizar las cargas de trabajo orientadas a archivos y con uso intensivo de datos y, luego, selecciona Habilitar el espacio de nombres jerárquico en este bucket.
- Nombre: Ingresa un nombre único que cumpla con los requisitos de nomenclatura de bucket (por ejemplo,
- Haz clic en Crear.
Otorga permisos al bucket
- En la consola de Cloud Storage, selecciona el bucket que creaste anteriormente.
- Haz clic en la pestaña Permisos.
- Haz clic en Otorgar acceso.
- Agrega la cuenta
logpush@cloudflare-data.iam.gserviceaccount.com
con permiso de administrador de objetos de almacenamiento. - Haz clic en Guardar.
Configura Cloudflare LogPush en Google Cloud Storage
- Accede al panel de Cloudflare.
- Selecciona la cuenta de Enterprise o el dominio que deseas usar con LogPush.
- Ve a Analytics & Logs > Logpush.
- Haz clic en Crear un trabajo de Logpush.
- En Selecciona un destino, elige Google Cloud Storage.
- Ingresa la ruta de acceso a tu bucket de Google Cloud Storage (por ejemplo,
gs://cloudflare-data/logs/
). Haz clic en Continuar.
Ingresa el token de propiedad y haz clic en Continuar.
Selecciona el conjunto de datos que se enviará al almacenamiento.
Configura tu trabajo de logpush:
- Ingresa el Nombre del trabajo.
- En Si los registros coinciden, puedes seleccionar los eventos que deseas incluir o quitar de tus registros.
- En Send the following fields, elige qué registros enviar.
- Elige el formato de marca de tiempo (se recomienda RFC 339).
- Configura la tasa de muestreo si es necesario.
Haz clic en Enviar.
Configura un feed en Google SecOps para transferir registros de Cloudflare desde Google Cloud Storage
- 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,
Cloudflare GCS Logs
). - Selecciona Google Cloud Storage V2 como el Tipo de fuente.
- Selecciona Cloudflare como el Tipo de registro.
- Haz clic en Obtener cuenta de servicio.
- Haz clic en Siguiente.
Especifica valores para los siguientes parámetros de entrada:
- URI del bucket de almacenamiento:URL del bucket en formato
gs://my-bucket/<value>/
. Google Cloud Esta URL debe terminar con una barra diagonal final (/). - Opciones de borrado de la fuente: Selecciona la opción de borrado según tu preferencia.
- Antigüedad máxima del archivo: Incluye los archivos modificados en la cantidad de días más reciente. El valor predeterminado es de 180 días.
- Espacio de nombres del recurso: Es el espacio de nombres del recurso.
- Etiquetas de transmisión: Es la etiqueta que se aplicará a los eventos de este feed.
- URI del bucket de almacenamiento:URL del bucket en formato
Haz clic en Siguiente.
Revisa la nueva configuración del 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 |
---|---|---|
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 tiene 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 Correo electrónico. |
FirewallMatchesActions | read_only_udm.security_result.action | El valor se establece en "ALLOW" si el campo FirewallMatchesAction es "allow", "Allow", "ALLOW", "skip", "SKIP" o "Skip"; en "ALLOW_WITH_MODIFICATION" si el campo FirewallMatchesAction es "challengeSolved" o "jschallengeSolved"; en "BLOCK" si el campo FirewallMatchesAction es "drop" o "block"; y en "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 reemplaza 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. |
ID del propietario | 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 Protocolo 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 registros 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 número 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 se establece en "ALLOW" si el campo SecurityAction está vacío o si el campo sec_action está vacío, en "ALLOW_WITH_MODIFICATION" si el campo SecurityAction es "challengeSolved" o "jschallengeSolved", y en "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. |
Transporte | 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 se establece en "CLOUDFLARE". | |
read_only_udm.metadata.product_name | El valor se establece en "DNS de Cloudflare Gateway" si el registro es un registro de DNS, "HTTP de Cloudflare Gateway" si el registro es un registro de HTTP de Gateway, "Auditoría de Cloudflare" si el registro es un registro de auditoría o "Firewall de aplicaciones web" en otros casos. | |
read_only_udm.metadata.vendor_name | El valor se establece en "Cloudflare". | |
read_only_udm.network.application_protocol | El valor se establece en "DNS" si el registro es un registro de DNS, en "HTTP" si el campo HTTPVersion contiene "HTTP" o en 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 establece en "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 con el filtro parseduseragent. | |
read_only_udm.extensions.auth.type | El valor se establece en "MACHINE" si el campo Acción es "login" o "logout". | |
read_only_udm.metadata.event_type | El valor se establece en "NETWORK_DNS" si el registro es un registro de DNS, "NETWORK_CONNECTION" si el registro es un registro HTTP de Gateway, "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? Obtén respuestas de miembros de la comunidad y profesionales de Google SecOps.