Recopila registros de F5 Distributed Cloud Services
Versión del analizador: 6.0
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 múltiples nubes y ubicaciones perimetrales.
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 de receptor de registros globales en F5 Distributed Cloud
Crea 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:
Parámetro de configuración Valor Asigna un nombre a tu bucket Ingresa un nombre único a nivel global (por ejemplo, f5-dcs-logs).Tipo de ubicación Elige una en función de tus necesidades (región, birregional o 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 de tu firewall:
193.16.236.64/29185.160.8.152/29
Si tu bucket de GCS usa los 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 acceso al proyecto a esta cuenta de servicio, haz lo siguiente:
- Haz clic en Selecciona un rol.
- Busca y selecciona Administrador de objetos de Storage.
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 claves 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 del 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 Storage
- 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 la nube.
- Haz clic en Agregar credenciales de Cloud.
- 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 Tipo de credenciales de Cloud, selecciona Credenciales de GCP.
- 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 claves 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 Agregar receptor de registros global.
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 registros que quieres exportar:
- Registros de solicitudes: Registros de solicitudes y respuestas HTTP con usuario, ruta de acceso, método y códigos de respuesta
- Eventos de seguridad: eventos de WAF, DSD, protección de APIs y defensa contra bots
- Registros de auditoría: Cambios en la configuración a través de APIs públicas
- Registros de solicitudes de DNS: Registros de consultas de DNS
En el menú desplegable Selección de mensajes de registro, selecciona una de las siguientes opciones:
- Seleccionar registros del espacio de nombres actual: Envía registros solo del espacio de nombres actual.
- Seleccionar registros de todos los espacios de nombres: Envía registros de todos los espacios de nombres (se recomienda para obtener 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 Receiver Configuration, selecciona GCP Bucket Receiver.
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 la nube que creaste antes (por ejemplo,
gcp-chronicle-logs).Opcional: Expande Mostrar campos avanzados para configurar las opciones de lote:
- Opciones de tiempo de espera del lote: Selecciona Segundos de tiempo de espera y, luego, ingresa un valor (el valor predeterminado es
300segundos). - Cantidad máxima de eventos por lote: Selecciona Cantidad máxima de eventos y, luego, ingresa un valor entre 32 y 2000 (deja el campo sin configurar para que no haya límite).
- Bytes por lote: Selecciona Bytes máximos y, luego, ingresa un valor entre 4096 y 1048576 (valor predeterminado:
10485760bytes/10 MB).
- Opciones de tiempo de espera del lote: 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 Receptor de registros global, busca el receptor que creaste (por ejemplo,
chronicle-gcs-receiver). - Haz clic en los tres puntos (…) en la columna Acciones.
- Selecciona Probar conexión.
- 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 del 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 gzip comprimidos 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 descargarlo y, luego, inspecciona el formato del registro.
Recupera la cuenta de servicio de Google SecOps
Google SecOps usa 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 > Administración de datos > Feeds. Si estás en una plataforma solo de SIEM, ve a Configuración > 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 eliminación del código fuente: Selecciona la opción de eliminación 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 que se transfirieron correctamente.
Borrar los archivos transferidos y los directorios vacíos: Borra los archivos y los directorios vacíos después de que se transfirieron correctamente.
Antigüedad máxima del archivo: Incluye los archivos modificados en la última cantidad de días (el valor predeterminado es 180 días).
Espacio de nombres del recurso: Es el espacio de nombres del recurso.
Etiquetas de transferencia: Es la etiqueta que se aplicará a los eventos de este feed.
Haz clic en Siguiente.
Revisa la configuración de tu feed de noticias nuevo 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 Storage en tu bucket de GCS.
- Ve a Cloud Storage > Buckets.
- Haz clic en el nombre del 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.
- Asigna 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 | El valor se copia directamente. |
| src | principal.namespace | El valor se copia directamente. |
| kubernetes_labels_app | target.resource.attribute.labels | Combinado de app_label (derivado de kubernetes_labels_app) |
| kubernetes_host | target.hostname | El valor se copia directamente. |
| kubernetes_container_name | target.resource.product_object_id | El valor se copia directamente. |
| bot_info.classification | security_result.detection_fields | Se combinó 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 combinó de bot_info_type_label (derivado de bot_info.type) |
| timestamp | @timestamp | Se analiza con el filtro de fecha con RFC 3339, UNIX, ISO8601 |
| visitor_id | security_result.detection_fields | Se combinó de visitor_id_label (derivado de visitor_id) |
| etiqueta | security_result.detection_fields | Se combinó de tag_label (derivado de tag) |
| acción | security_result.action | Establece ALLOW si coincide con allow, BLOCK si coincide con deny |
| 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 | El valor se copia directamente. |
| api_endpoint | target.labels | Se combinó desde api_endpoint_label (derivado de api_endpoint) |
| app_firewall_name | principal.process.command_line | El valor se copia 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 | Combinado de about_pod_id (derivado de kubernetes.pod_id) |
| kubernetes.pod_name | security_result.detection_fields | Se combinó desde about_pod_name (derivado de kubernetes.pod_name) |
| latitud | principal.location.region_latitude | Se convirtió en flotante |
| longitude | principal.location.region_longitude | Se convirtió en flotante |
| req_params | additional.fields | Se combinó desde about_req_params (derivado de req_params) |
| as_number | additional.fields | Se combinó desde about_as_number (se convirtió en cadena desde 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 combinó desde x_forwarded_for_label si no es 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ó desde 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 | El valor se copia directamente. |
| policy_hit.policy_rule_description | security_result.description | El valor se copia directamente. |
| policy_hit.policy_set | target.resource.name | El valor se copia directamente. |
| policy_hit.result | additional.fields | Se combinó desde result_label (derivado de policy_hit.result) |
| vhost_id | security_result.detection_fields | Se combinó desde vhostlabel (derivado de vhost_id) |
| messageid | security_result.detection_fields | Se combinó de messageid_label (derivado de messageid) |
| sec_event_name | security_result.detection_fields | Se combinó de sec_event_name_label (derivado de sec_event_name) |
| sec_event_type | security_result.detection_fields | Se combinó desde sec_event_type_label (derivado de sec_event_type) |
| vh_name | security_result.detection_fields | Se combinó desde vhost_name_label (derivado de vh_name) |
| tls_fingerprint | security_result.detection_fields | Se combinó desde tls_fingerprint_label (derivado de tls_fingerprint) |
| hora | additional.fields | Se combinó 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 combinó desde 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 desde req_size) |
| rsp_code | additional.fields | Se combinó de rsp_code_label (se convirtió a cadena desde rsp_code) |
| rsp_code_class | additional.fields | Se combinó desde rsp_code_class_label (se convirtió en cadena desde rsp_code_class) |
| rsp_size | additional.fields | Se combinó desde rsp_size_label (se convirtió en cadena desde rsp_size) |
| original_path | additional.fields | Se combinó desde original_path_label (derivado de original_path) |
| req_path | target.url | El valor se copia directamente. |
| req_headers_size | additional.fields | Se combinó desde req_headers_size_label (derivado de req_headers_size) |
| recommended_action | additional.fields | Se combinó desde 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 no es - |
| http_version | network.application_protocol_version | El valor se copia directamente. |
| http_version | network.application_protocol | Se establece en HTTP si contiene HTTP, o 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ó en un número entero |
| src_port | principal.port | Se convirtió en un 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 combinó desde cluster_name_field (derivado de cluster_name) |
| dominio | principal.administrative_domain | El valor se copia directamente. |
| método | network.http.method | El valor se copia directamente si no está vacío o no es N/A |
| espacio de nombres | target.namespace | El valor se copia directamente. |
| ciudad | principal.location.city | El valor se copia directamente. |
| transmisión | security_result.detection_fields | Se combinó desde stream_label (derivado de stream) |
| región | principal.location.country_or_region | El valor se copia directamente. |
| usuario | principal.user.userid | Se extrajo del usuario con el patrón de grok para user_id |
| user_ip | target.ip, target.asset.ip | Combinado a partir de la user_ip extraída |
| Cookie | additional.fields | Combinada de la cookie (derivada de la cookie en req_headers) |
| X-F5-Request-Id | security_result.detection_fields | Se combinó desde 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 combinaron 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, GENERIC_EVENT |
| metadata.vendor_name | Establece el valor en "F5_DCS". | |
| metadata.product_name | Establece el valor en "F5 DCS". | |
| intermediario | intermediario | Se combinaron directamente |
rsp_size |
event.idm.read_only_udm.network.received_bytes |
Asignado desde el registro de cambios |
dst |
event.idm.read_only_udm.target.ip y event.idm.read_only_udm.target.asset.ip |
Asignado desde el registro de cambios |
has_sec_event |
event.idm.read_only_udm.additional.fields |
Asignado desde el registro de cambios |
app |
event.idm.read_only_udm.target.application |
Asignado desde el registro de cambios |
node_id |
event.idm.read_only_udm.additional.fields |
Asignado desde el registro de cambios |
sample_rate |
event.idm.read_only_udm.additional.fields |
Asignado desde el registro de cambios |
time_to_first_downstream_tx_byte |
event.idm.read_only_udm.additional.fields |
Asignado desde el registro de cambios |
time_to_first_upstream_rx_byte |
event.idm.read_only_udm.additional.fields |
Asignado desde el registro de cambios |
time_to_first_upstream_tx_byte |
event.idm.read_only_udm.additional.fields |
Asignado desde el registro de cambios |
time_to_last_downstream_tx_byte |
event.idm.read_only_udm.additional.fields |
Asignado desde el registro de cambios |
time_to_last_rx_byte |
event.idm.read_only_udm.additional.fields |
Asignado desde el registro de cambios |
time_to_last_upstream_rx_byte |
event.idm.read_only_udm.additional.fields |
Asignado desde el registro de cambios |
time_to_last_upstream_tx_byte |
event.idm.read_only_udm.additional.fields |
Asignado desde el registro de cambios |
timeseries_enabled |
event.idm.read_only_udm.additional.fields |
Asignado desde el registro de cambios |
sni |
event.idm.read_only_udm.additional.fields |
Asignado desde el registro de cambios |
terminated_time |
event.idm.read_only_udm.additional.fields |
Asignado desde el registro de cambios |
rtt_downstream_seconds |
event.idm.read_only_udm.additional.fields |
Asignado desde el registro de cambios |
rtt_upstream_seconds |
event.idm.read_only_udm.additional.fields |
Asignado desde el registro de cambios |
rsp_code_details |
event.idm.read_only_udm.additional.fields |
Asignado desde el registro de cambios |
authority |
event.idm.read_only_udm.additional.fields |
Asignado desde el registro de cambios |
connected_time |
event.idm.read_only_udm.additional.fields |
Asignado desde el registro de cambios |
req_id |
event.idm.read_only_udm.additional.fields |
Asignado desde el registro de cambios |
proxy_type |
event.idm.read_only_udm.additional.fields |
Asignado desde el registro de cambios |
vh_type |
event.idm.read_only_udm.additional.fields |
Asignado desde el registro de cambios |
dst_instance |
event.idm.read_only_udm.additional.fields |
Asignado desde el registro de cambios |
lb_port |
event.idm.read_only_udm.additional.fields |
Asignado desde el registro de cambios |
mtls |
event.idm.read_only_udm.additional.fields |
Asignado desde el registro de cambios |
ja4_tls_fingerprint |
event.idm.read_only_udm.additional.fields |
Asignado desde el registro de cambios |
duration_with_data_tx_delay |
event.idm.read_only_udm.additional.fields |
Asignado desde el registro de cambios |
dst_site |
event.idm.read_only_udm.additional.fields |
Asignado desde el registro de cambios |
protocol and scheme |
event.idm.read_only_udm.network.application_protocol |
Asignado desde el registro de cambios |
referer |
event.idm.read_only_udm.network.http.referral_url |
Asignado desde el registro de cambios |
tls_cipher_suite |
event.idm.read_only_udm.network.tls.cipher |
Asignado desde el registro de cambios |
tls_version |
event.idm.read_only_udm.network.tls.version |
Asignado desde el registro de cambios |
user_agent |
event.idm.read_only_udm.network.http.user_agent |
Asignado desde el registro de cambios |
user_agent |
event.idm.read_only_udm.network.http.parsed_user_agent |
Asignado desde el registro de cambios |
browser_type |
event.idm.read_only_udm.principal.browser.browser_type |
Asignado desde el registro de cambios |
content-type |
event.idm.read_only_udm.principal.process.file.mime_type |
Asignado desde el registro de cambios |
response_flags |
security_result.detection_fields |
Asignado desde el registro de cambios |
original_authority |
event.idm.read_only_udm.target.administrative_domain |
Asignado desde el registro de cambios |
country |
event.idm.read_only_udm.principal.location.country_or_region |
Asignado desde el registro de cambios |
Registro de cambios
Consulta el registro de cambios de este analizador
¿Necesitas más ayuda? Obtén respuestas de miembros de la comunidad y profesionales de Google SecOps.