Recopila registros de los servicios de F5 Distributed Cloud
En este documento, se explica cómo transferir registros de F5 Distributed Cloud Services a Google Security Operations con Google Cloud Storage V2.
F5 Distributed Cloud Services es una plataforma de seguridad, redes y administración de aplicaciones basada en SaaS que proporciona infraestructura de nube distribuida, entrega de aplicaciones, seguridad de APIs y capacidades de firewall de aplicación web en ubicaciones perimetrales y de múltiples nubes.
Antes de comenzar
Asegúrate de cumplir con los siguientes requisitos previos:
- Una instancia de Google SecOps
- Un proyecto de Google Cloud con la API de Cloud Storage habilitada
- Permisos para crear y administrar buckets de GCS
- Permisos para administrar políticas de IAM en buckets de GCS
- Acceso privilegiado a la consola de F5 Distributed Cloud
- Permisos para crear objetos Global Log Receiver en F5 Distributed Cloud
Crear un bucket de Google Cloud Storage
- Ve a la consola de Google Cloud.
- Selecciona tu proyecto o crea uno nuevo.
- En el menú de navegación, ve a Cloud Storage > Buckets.
- Haz clic en Crear bucket.
Proporciona los siguientes detalles de configuración:
Configuración Valor Asigna un nombre a tu bucket Ingresa un nombre global único (por ejemplo, f5-dcs-logs).Tipo de ubicación Elige según tus necesidades (región, birregional, multirregional) Ubicación Selecciona la ubicación (por ejemplo, us-central1).Clase de almacenamiento Estándar (recomendado para los registros a los que se accede con frecuencia) Control de acceso Uniforme (recomendado) Herramientas de protección Opcional: Habilita el control de versiones de objetos o la política de retención Haz clic en Crear.
Configura F5 Distributed Cloud para exportar a GCS
Agrega el bucket de GCS a la lista de entidades permitidas del firewall
El receptor de registros global de F5 Distributed Cloud requiere que se agreguen los siguientes rangos de direcciones IP a la lista de entidades permitidas del firewall:
193.16.236.64/29185.160.8.152/29
Si tu bucket de GCS usa Controles del servicio de VPC o reglas de firewall, agrega estos rangos de IP a tu lista de entidades permitidas.
Crea una cuenta de servicio de Google Cloud para F5 Distributed Cloud
- En la consola de Google Cloud, ve a IAM y administración > Cuentas de servicio.
- Haz clic en Crear cuenta de servicio.
Proporciona los siguientes detalles de configuración:
- Nombre de la cuenta de servicio: Ingresa
f5-dcs-log-writer(o un nombre descriptivo). - Descripción de la cuenta de servicio: Ingresa
Service account for F5 Distributed Cloud to write logs to GCS.
- Nombre de la cuenta de servicio: Ingresa
Haz clic en Crear y continuar.
En la sección Otorga a esta cuenta de servicio acceso al proyecto, haz lo siguiente:
- Haz clic en Selecciona un rol.
- Busca y selecciona Administrador de objetos de almacenamiento.
Haz clic en Continuar.
Haz clic en Listo.
Crea una clave de cuenta de servicio
- En la lista Cuentas de servicio, haz clic en la cuenta de servicio que creaste (por ejemplo,
f5-dcs-log-writer). - Ve a la pestaña Claves.
- Haz clic en Agregar clave > Crear clave nueva.
- Seleccione JSON como tipo de clave.
- Haz clic en Crear.
- El archivo de clave JSON se descargará en tu computadora.
- Guarda este archivo de forma segura. La necesitarás en los próximos pasos.
Otorga permisos de IAM en el bucket de GCS
- Ve a Cloud Storage > Buckets.
- Haz clic en el nombre de tu bucket (por ejemplo,
f5-dcs-logs). - Ve a la pestaña Permisos.
- Haz clic en Otorgar acceso.
- Proporciona los siguientes detalles de configuración:
- Agregar principales: Ingresa el correo electrónico de la cuenta de servicio (por ejemplo,
f5-dcs-log-writer@PROJECT_ID.iam.gserviceaccount.com). - Asignar roles: Selecciona Administrador de objetos de almacenamiento.
- Agregar principales: Ingresa el correo electrónico de la cuenta de servicio (por ejemplo,
- Haz clic en Guardar.
Crea credenciales de Google Cloud en la consola de F5 Distributed Cloud
- Accede a la consola de F5 Distributed Cloud en
https://<tenant>.console.ves.volterra.io. - Selecciona el servicio Multi-Cloud Network Connect en la página principal.
- Ve a Administrar > Administración del sitio > Credenciales de Cloud.
- Haz clic en Agregar credenciales de nube.
- En la sección Metadatos, haz lo siguiente:
- Nombre: Ingresa un nombre descriptivo (por ejemplo,
gcp-chronicle-logs). - Descripción (opcional): Ingresa
Cloud Storage credentials for Google SecOps log export.
- Nombre: Ingresa un nombre descriptivo (por ejemplo,
- En la sección Cloud Credentials Type, selecciona GCP Credentials.
- Haz clic en Configurar en el campo Credenciales de GCP.
- En el menú desplegable Tipo de credencial, selecciona Archivo de credenciales de cuenta de servicio.
- Haz clic en Subir archivo y selecciona el archivo de clave JSON que descargaste en los pasos anteriores.
- Haz clic en Aplicar.
- Haz clic en Guardar y salir.
Crea un receptor de registros global
- En la consola de F5 Distributed Cloud, asegúrate de estar en el servicio Multi-Cloud Network Connect.
- Ve a Administrar > Administración de registros > Receptor de registros global.
- Haz clic en Add Global Log Receiver.
En la sección Metadatos, haz lo siguiente:
- Nombre: Ingresa un nombre descriptivo (por ejemplo,
chronicle-gcs-receiver). - Descripción (opcional): Ingresa
Global log receiver for Google SecOps SIEM.
- Nombre: Ingresa un nombre descriptivo (por ejemplo,
En el menú desplegable Tipo de registro, selecciona los tipos de registro que deseas exportar:
- Registros de solicitudes: Registros de solicitudes y respuestas HTTP con el usuario, la ruta de acceso, el método y los códigos de respuesta
- Eventos de seguridad: Eventos de WAF, DSD, protección de API y defensa contra bots
- Registros de auditoría: Cambios de configuración a través de APIs públicas
- Registros de solicitudes de DNS: Registros de consultas de DNS
En el menú desplegable Log Message Selection, selecciona una de las siguientes opciones:
- Select logs from current namespace: Envía registros solo desde el espacio de nombres actual.
- Seleccionar registros de todos los espacios de nombres: Envía registros de todos los espacios de nombres (se recomienda para una visibilidad integral).
- Seleccionar registros en espacios de nombres específicos: Envía registros de los espacios de nombres especificados (haz clic en Agregar elemento para agregar nombres de espacios de nombres).
En el menú desplegable Configuración del receptor, selecciona Receptor de bucket de GCP.
En el campo Nombre del bucket de GCP, ingresa el nombre de tu bucket de GCS (por ejemplo,
f5-dcs-logs).En el menú desplegable GCP Cloud Credentials, selecciona las credenciales de nube que creaste antes (por ejemplo,
gcp-chronicle-logs).Opcional: Expande Mostrar campos avanzados para configurar las opciones de lotes:
- Opciones de tiempo de espera por lotes: Selecciona Segundos de tiempo de espera y, luego, ingresa un valor (el valor predeterminado es
300segundos). - Batch Max Events: Selecciona Max Events y, luego, ingresa un valor entre 32 y 2,000 (déjalo sin configurar para que no haya límite).
- Bytes por lote: Selecciona Bytes máx. y, luego, ingresa un valor entre 4,096 y 1,048,576 (el valor predeterminado es
10485760bytes / 10 MB).
- Opciones de tiempo de espera por lotes: Selecciona Segundos de tiempo de espera y, luego, ingresa un valor (el valor predeterminado es
Haz clic en Guardar y salir.
Prueba la conexión
- En la lista Global Log Receiver, busca el receptor que creaste (por ejemplo,
chronicle-gcs-receiver). - Haz clic en los tres puntos (…) de la columna Acciones.
- Selecciona Test Connection.
- Espera a que se complete la prueba.
Debería aparecer un mensaje que indique que la conexión se realizó correctamente.
Verifica los registros en el bucket de GCS
- Ve a Cloud Storage > Buckets en la consola de GCP.
- Haz clic en el nombre de tu bucket (por ejemplo,
f5-dcs-logs). - Verifica que se estén creando archivos de registro en el bucket.
F5 Distributed Cloud organiza los registros en la siguiente estructura de carpetas:
YYYY/MM/DD/HH/- Se crea una carpeta para cada día (AAAA/MM/DD)
- Dentro de cada carpeta de día, se crea una subcarpeta para cada hora (HH).
- Cada 5 minutos, se escriben nuevos archivos comprimidos con gzip en la subcarpeta por hora.
- Los archivos están en formato NDJSON (JSON delimitado por saltos de línea).
Haz clic en un archivo gzip para descargar y revisar el formato de registro.
Recupera la cuenta de servicio de Google SecOps
Las Operaciones de seguridad de Google usan una cuenta de servicio única para leer datos de tu bucket de GCS. Debes otorgar acceso a tu bucket a esta cuenta de servicio.
Obtén el correo electrónico de la cuenta de servicio
- Ve a Configuración de SIEM > Feeds.
- Haz clic en Agregar feed nuevo.
- Haz clic en Configura un feed único.
- En el campo Nombre del feed, ingresa un nombre para el feed (por ejemplo,
F5 DCS Logs). - Selecciona Google Cloud Storage V2 como el Tipo de fuente.
- Selecciona F5 Distributed Cloud Services como el Tipo de registro.
Haz clic en Obtener cuenta de servicio. Se mostrará un correo electrónico único de la cuenta de servicio, por ejemplo:
chronicle-12345678@chronicle-gcp-prod.iam.gserviceaccount.comCopia esta dirección de correo electrónico para usarla en el siguiente paso.
Haz clic en Siguiente.
Especifica valores para los siguientes parámetros de entrada:
URL del bucket de almacenamiento: Ingresa el URI del bucket de GCS:
gs://f5-dcs-logs/Reemplaza
f5-dcs-logspor el nombre de tu bucket de GCS.Opción de borrado de la fuente: Selecciona la opción de borrado según tu preferencia:
- Nunca: Nunca borra ningún archivo después de las transferencias (se recomienda para las pruebas).
- Borrar archivos transferidos: Borra los archivos después de la transferencia exitosa.
Borrar los archivos transferidos y los directorios vacíos: Borra los archivos y los directorios vacíos después de la transferencia exitosa.
Antigüedad máxima del archivo: Incluye los archivos modificados en la cantidad de días más reciente (el valor predeterminado es 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.
Haz clic en Siguiente.
Revisa la nueva configuración del feed en la pantalla Finalizar y, luego, haz clic en Enviar.
Otorga permisos de IAM a la cuenta de servicio de Google SecOps
La cuenta de servicio de Google SecOps necesita el rol de visualizador de objetos de almacenamiento en tu bucket de GCS.
- Ve a Cloud Storage > Buckets.
- Haz clic en el nombre de tu bucket (por ejemplo,
f5-dcs-logs). - Ve a la pestaña Permisos.
- Haz clic en Otorgar acceso.
Proporciona los siguientes detalles de configuración:
- Agregar principales: Pega el correo electrónico de la cuenta de servicio de Google SecOps.
- Asignar roles: Selecciona Visualizador de objetos de Storage.
Haz clic en Guardar.
Tabla de asignación de UDM
| Campo de registro | Asignación de UDM | Lógica |
|---|---|---|
| _id | metadata.product_log_id | Valor copiado directamente |
| src | principal.namespace | Valor copiado directamente |
| kubernetes_labels_app | target.resource.attribute.labels | Se fusionó de app_label (derivado de kubernetes_labels_app) |
| kubernetes_host | target.hostname | Valor copiado directamente |
| kubernetes_container_name | target.resource.product_object_id | Valor copiado directamente |
| bot_info.classification | security_result.detection_fields | Se fusionó desde bot_info_classification_label (derivado de bot_info.classification) |
| bot_info.name | security_result.detection_fields | Se combinó desde bot_info_name_label (derivado de bot_info.name) |
| bot_info.type | security_result.detection_fields | Se fusionó de bot_info_type_label (derivado de bot_info.type) |
| timestamp | @timestamp | Se analizó con el filtro de fecha con RFC3339, UNIX, ISO8601 |
| visitor_id | security_result.detection_fields | Se fusionó de visitor_id_label (derivado de visitor_id) |
| etiqueta | security_result.detection_fields | Se fusionó desde tag_label (derivado de tag) |
| acción | security_result.action | Se establece en ALLOW si las coincidencias permiten el acceso y en BLOCK si las coincidencias lo rechazan. |
| gravedad, | security_result.severity | Se establece en HIGH si hay un error o una advertencia, en CRITICAL si es crítico, en MEDIUM si es un aviso y en LOW si es información. |
| gravedad, | security_result.severity_details | Valor copiado directamente |
| api_endpoint | target.labels | Se fusionó de api_endpoint_label (derivado de api_endpoint) |
| app_firewall_name | principal.process.command_line | Valor copiado directamente |
| app_type | security_result.detection_fields | Se combinó desde about_app_type (derivado de app_type) |
| as_org | security_result.detection_fields | Se combinó desde about_as_org (derivado de as_org) |
| asn | security_result.detection_fields | Se combinó desde about_asn (derivado de asn) |
| kubernetes.pod_id | security_result.detection_fields | Se fusionó de about_pod_id (derivado de kubernetes.pod_id) |
| kubernetes.pod_name | security_result.detection_fields | Se fusionó de about_pod_name (derivado de kubernetes.pod_name) |
| latitud | principal.location.region_latitude | Se convirtió en un número de punto flotante |
| longitude | principal.location.region_longitude | Se convirtió en un número de punto flotante |
| req_params | additional.fields | Se combinó desde about_req_params (derivado de req_params) |
| as_number | additional.fields | Se fusionó de about_as_number (se convirtió en cadena de as_number) |
| x_forwarded_for | intermediary.ip | Se combina si la IP es válida |
| x_forwarded_for | security_result.about.resource.attribute.labels | Se fusionó de x_forwarded_for_label si no es una IP |
| policy_hit.malicious_user_mitigate_action | security_result.detection_fields | Se combinó desde malicious_user_label (derivado de policy_hit.malicious_user_mitigate_action) |
| policy_hit.policy | security_result.about.resource.attribute.labels | Se combinó de policy_label (derivado de policy_hit.policy) |
| policy_hit.policy_namespace | additional.fields | Se combinó desde policy_namespace_label (derivado de policy_hit.policy_namespace) |
| policy_hit.policy_rule | security_result.rule_name | Valor copiado directamente |
| policy_hit.policy_rule_description | security_result.description | Valor copiado directamente |
| policy_hit.policy_set | target.resource.name | Valor copiado directamente |
| policy_hit.result | additional.fields | Se combinó de result_label (derivado de policy_hit.result) |
| vhost_id | security_result.detection_fields | Se fusionó de vhostlabel (derivado de vhost_id) |
| messageid | security_result.detection_fields | Se fusionó de messageid_label (derivado de messageid) |
| sec_event_name | security_result.detection_fields | Se fusionó de sec_event_name_label (derivado de sec_event_name) |
| sec_event_type | security_result.detection_fields | Se combinó de sec_event_type_label (derivado de sec_event_type) |
| vh_name | security_result.detection_fields | Se fusionó de vhost_name_label (derivado de vh_name) |
| tls_fingerprint | security_result.detection_fields | Se combinó de tls_fingerprint_label (derivado de tls_fingerprint) |
| hora | additional.fields | Se fusionó de time_label (derivado de time) |
| kubernetes.namespace_name | additional.fields | Se combinó desde namespace_name_label (derivado de kubernetes.namespace_name) |
| src_instance | additional.fields | Se fusionó de src_instance_label (derivado de src_instance) |
| violation_rating | additional.fields | Se combinó de violation_rating_label (derivado de violation_rating) |
| req_size | additional.fields | Se combinó desde req_size_label (se convirtió en cadena a partir de req_size) |
| rsp_code | additional.fields | Se fusionó de rsp_code_label (se convirtió en cadena de rsp_code) |
| rsp_code_class | additional.fields | Se fusionó desde rsp_code_class_label (se convirtió en cadena desde rsp_code_class) |
| rsp_size | additional.fields | Se fusionó de rsp_size_label (se convirtió en cadena de rsp_size) |
| original_path | additional.fields | Se fusionó de original_path_label (derivado de original_path) |
| req_path | target.url | Valor copiado directamente |
| req_headers_size | additional.fields | Se combinó desde req_headers_size_label (derivado de req_headers_size) |
| recommended_action | additional.fields | Se fusionó de recommended_action_label (derivado de recommended_action) |
| enforcement_mode | additional.fields | Se combinó de enforcement_mode_label (derivado de enforcement_mode) |
| src_ip | principal.ip, principal.asset.ip | Se combina si coincide con la regex de IPv4 |
| host | principal.ip, principal.asset.ip | Se combina si coincide con la regex de IPv4 |
| Nombre de host | principal.hostname, principal.asset.hostname | El valor se copia directamente si no está vacío o si es "-". |
| http_version | network.application_protocol_version | Valor copiado directamente |
| http_version | network.application_protocol | Se establece en HTTP si contiene HTTP y en HTTPS si contiene HTTPS. |
| red | principal.nat_ip | Se combina si coincide con la regex de IPv4 |
| dst_ip | target.ip, target.asset.ip | Se combina si coincide con la regex de IPv4 |
| dst_port | target.port | Se convirtió a número entero |
| src_port | principal.port | Se convirtió a número entero |
| src_site | additional.fields | Se combinó desde src_site_field (derivado de src_site) |
| sitio | additional.fields | Se combinó desde site_field (derivado de site) |
| cluster_name | additional.fields | Se fusionó de cluster_name_field (derivado de cluster_name) |
| dominio | principal.administrative_domain | Valor copiado directamente |
| método | network.http.method | El valor se copia directamente si no está vacío o es N/A. |
| espacio de nombres | target.namespace | Valor copiado directamente |
| ciudad | principal.location.city | Valor copiado directamente |
| transmisión | security_result.detection_fields | Se fusionó de stream_label (derivado de stream) |
| región | principal.location.country_or_region | Valor copiado directamente |
| usuario | principal.user.userid | Se extrae del usuario con el patrón de grok para user_id. |
| user_ip | target.ip, target.asset.ip | Se combinó a partir de user_ip extraído |
| Cookie | additional.fields | Se combinó a partir de la cookie (derivada de la cookie en req_headers) |
| X-F5-Request-Id | security_result.detection_fields | Se combinó de x_f5_request_id (derivado de X-F5-Request-Id en req_headers) |
| X-Request-Id | security_result.detection_fields | Se combinó desde request_id (derivado de X-Request-Id en req_headers) |
| security_result | security_result | Se combinó directamente |
| has_network, has_principal, has_target | metadata.event_type | Se establece en NETWORK_CONNECTION si todo es verdadero; STATUS_UPDATE si has_principal es verdadero; de lo contrario, se establece en GENERIC_EVENT. |
| metadata.vendor_name | Se establece en "F5_DCS". | |
| metadata.product_name | Se estableció en "F5 DCS". | |
| intermediario | intermediario | Se combinó directamente |
¿Necesitas más ayuda? Obtén respuestas de miembros de la comunidad y profesionales de Google SecOps.