Recopila registros de Azure WAF

Compatible con:

En este documento, se explica cómo exportar registros del firewall de aplicaciones web (WAF) de Azure a Google Security Operations con una cuenta de almacenamiento de Azure. El analizador controla los registros en formato JSON y los transforma en UDM. Procesa registros que contienen un array de records iterando por cada registro y asignando campos específicos a propiedades de la UDM. Si no hay un array records, el analizador controla el registro como un solo evento y extrae y asigna campos según corresponda.

Antes de comenzar

  • Asegúrate de tener una instancia de Google SecOps.
  • Asegúrate de tener un inquilino de Azure activo.
  • Asegúrate de tener acceso con privilegios a Azure.

Configura la cuenta de Azure Storage

  1. En la consola de Azure, busca Cuentas de almacenamiento.
  2. Haz clic en Crear.
  3. Especifica valores para los siguientes parámetros de entrada:
    • Subscription: Selecciona la suscripción.
    • Grupo de recursos: Selecciona el grupo de recursos.
    • Región: Selecciona la región.
    • Rendimiento: Selecciona el rendimiento (se recomienda Estándar).
    • Redundancia: Selecciona la redundancia (se recomienda GRS o LRS).
    • Nombre de la cuenta de almacenamiento: Ingresa un nombre para la cuenta de almacenamiento nueva.
  4. Haz clic en Revisar + crear.
  5. Revisa la descripción general de la cuenta y haz clic en Crear.
  6. En la página Descripción general de la cuenta de almacenamiento, selecciona el submenú Llaves de acceso en Seguridad y herramientas de redes.
  7. Haz clic en Mostrar junto a clave1 o clave2.
  8. Haz clic en Copiar en el portapapeles para copiar la clave.
  9. Guarda la clave en una ubicación segura para usarla más adelante.
  10. En la página Descripción general de la cuenta de almacenamiento, selecciona el submenú Puntos finales en Configuración.
  11. Haz clic en Copiar en el portapapeles para copiar la URL del extremo del servicio de almacenamiento en caché; por ejemplo, https://<storageaccountname>.blob.core.windows.net.
  12. Guarda la URL del extremo en una ubicación segura para usarla más adelante.

Configura la exportación de registros para los registros de Azure WAF

  1. Accede al portal de Azure con tu cuenta con privilegios.
  2. Ve a Reglas de firewall de aplicaciones web (WAF) y selecciona un WAF para supervisar.
  3. Selecciona Supervisión > Configuración de diagnóstico.
  4. Haz clic en + Agregar parámetro de configuración de diagnóstico.
    • Ingresa un nombre descriptivo para el parámetro de configuración de diagnóstico.
  5. Selecciona allLogs.
  6. Selecciona la casilla de verificación Archivar en una cuenta de almacenamiento como destino.
    • Especifica la suscripción y la cuenta de almacenamiento.
  7. Haz clic en Guardar.

Configura un feed en Google SecOps para transferir los registros de Azure WAF

  1. Ve a Configuración de SIEM > Feeds.
  2. Haz clic en Agregar nueva.
  3. En el campo Nombre del feed, ingresa un nombre para el feed, por ejemplo, Registros de WAF de Azure.
  4. Selecciona Microsoft Azure Blob Storage como el Tipo de fuente.
  5. Selecciona Azure WAF como el Tipo de registro.
  6. Haz clic en Siguiente.
  7. Especifica valores para los siguientes parámetros de entrada:

    • URI de Azure: Es la URL del extremo del objeto blob.
      • ENDPOINT_URL/BLOB_NAME
        • Reemplaza lo siguiente:
          • ENDPOINT_URL: La URL del extremo de blob (https://<storageaccountname>.blob.core.windows.net)
          • BLOB_NAME: Es el nombre del blob (por ejemplo, <logname>-logs).
    • URI is a: Selecciona el TIPO DE URI según la configuración del flujo de registro (Archivo único | Directorio | Directorio que incluye subdirectorios).
    • Opciones de eliminación de fuentes: Selecciona la opción de eliminación según tus preferencias.

    • Clave compartida: Es la clave de acceso a Azure Blob Storage.

    • Espacio de nombres de recursos: Es el espacio de nombres de recursos.

    • Etiquetas de transferencia: Es la etiqueta que se aplicará a los eventos de este feed.

  8. Haz clic en Siguiente.

  9. Revisa la configuración de tu nuevo 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
backendPoolName additional.fields[?key=='backendPoolName'].value.string_value El valor se toma del campo backendPoolName en el registro sin procesar.
backendSettingName additional.fields[?key=='backendSettingName'].value.string_value El valor se toma del campo backendSettingName en el registro sin procesar.
category metadata.product_event_type El valor se toma del campo category en el registro sin procesar.
EventEnqueuedUtcTime additional.fields[?key=='EventEnqueuedUtcTime'].value.string_value El valor se toma del campo EventEnqueuedUtcTime en el registro sin procesar cuando existe el campo records.
EventProcessedUtcTime additional.fields[?key=='EventProcessedUtcTime'].value.string_value El valor se toma del campo EventProcessedUtcTime en el registro sin procesar cuando existe el campo records.
operationName additional.fields[?key=='operationName'].value.string_value El valor se toma del campo operationName en el registro sin procesar.
properties.action additional.fields[?key=='action'].value.string_value El valor se toma del campo properties.action en el registro sin procesar cuando existe el campo records.
properties.action security_result.action_details El valor se toma del campo properties.action en el registro sin procesar cuando no existe el campo records.
properties.clientIP, properties.clientIp principal.asset.ip, principal.ip El valor se toma del campo properties.clientIP o properties.clientIp en el registro sin procesar, dando prioridad a clientIP.
properties.clientPort principal.port El valor se toma del campo properties.clientPort en el registro sin procesar.
properties.clientResponseTime principal.resource.attribute.labels[?key=='Client Response Time'].value El valor se toma del campo properties.clientResponseTime en el registro sin procesar cuando no existe el campo records.
properties.details.data additional.fields[?key=='Properties data'].value.string_value El valor se toma del campo properties.details.data en el registro sin procesar cuando existe el campo records.
properties.details.file principal.process.file.full_path El valor se toma del campo properties.details.file en el registro sin procesar cuando no existe el campo records.
properties.details.matches[].matchVariableName, properties.details.matches[].matchVariableValue additional.fields[?key.startsWith('%{idx} ')].value.string_value El valor se toma del array properties.details.matches en el registro sin procesar. El key en la UDM se construye con el índice (idx) y matchVariableName. El value se toma de matchVariableValue.
properties.details.message metadata.description El valor se toma del campo properties.details.message en el registro sin procesar después de quitar las barras diagonales y las comillas.
properties.details.msg metadata.description El valor se toma del campo properties.details.msg en el registro sin procesar cuando existe el campo records.
properties.httpMethod network.http.method El valor se toma del campo properties.httpMethod en el registro sin procesar.
properties.httpStatus network.http.response_code El valor se toma del campo properties.httpStatus en el registro sin procesar.
properties.httpVersion network.application_protocol Si el campo properties.httpVersion contiene HTTP, se asigna el valor HTTP.
properties.host, properties.hostname, properties.originalHost principal.asset.hostname, principal.hostname El valor se toma de uno de properties.originalHost, properties.host o properties.hostname, y se prioriza en ese orden.
properties.policyId security_result.detection_fields[?key=='policyId'].value El valor se toma del campo properties.policyId en el registro sin procesar.
properties.policyMode security_result.detection_fields[?key=='policyMode'].value El valor se toma del campo properties.policyMode en el registro sin procesar cuando existe el campo records.
properties.policy additional.fields[?key=='Properties policy'].value.string_value El valor se toma del campo properties.policy en el registro sin procesar cuando existe el campo records.
properties.receivedBytes network.received_bytes El valor se toma del campo properties.receivedBytes en el registro sin procesar.
properties.requestUri target.url El valor se toma del campo properties.requestUri en el registro sin procesar.
properties.ruleId security_result.rule_id El valor se toma del campo properties.ruleId en el registro sin procesar.
properties.ruleName security_result.rule_name El valor se toma del campo properties.ruleName en el registro sin procesar cuando existe el campo records.
properties.ruleName, ruleSetType security_result.rule_name El valor se toma del campo properties.ruleName o, si está vacío, del campo ruleSetType en el registro sin procesar cuando no existe el campo records.
properties.ruleSetVersion security_result.detection_fields[?key=='ruleSetVersion'].value El valor se toma del campo properties.ruleSetVersion en el registro sin procesar.
properties.sentBytes network.sent_bytes El valor se toma del campo properties.sentBytes en el registro sin procesar.
properties.serverResponseLatency additional.fields[?key=='Server Response Latency'].value.string_value El valor se toma del campo properties.serverResponseLatency en el registro sin procesar cuando no existe el campo records.
properties.serverRouted target.asset.ip, target.ip, target.port La IP y el puerto se extraen del campo properties.serverRouted.
properties.sslCipher network.tls.cipher El valor se toma del campo properties.sslCipher en el registro sin procesar.
properties.sslClientCertificateIssuerName network.tls.server.certificate.issuer El valor se toma del campo properties.sslClientCertificateIssuerName en el registro sin procesar.
properties.sslProtocol network.tls.version El valor se toma del campo properties.sslProtocol en el registro sin procesar.
properties.timeTaken additional.fields[?key=='Properties Timetaken'].value.string_value El valor se toma del campo properties.timeTaken en el registro sin procesar cuando no existe el campo records.
properties.trackingReference additional.fields[?key=='trackingReference'].value.string_value El valor se toma del campo properties.trackingReference en el registro sin procesar cuando existe el campo records.
properties.transactionId network.session_id El valor se toma del campo properties.transactionId en el registro sin procesar.
properties.userAgent network.http.user_agent El valor se toma del campo properties.userAgent en el registro sin procesar.
properties.WAFEvaluationTime additional.fields[?key=='Properties WAFEvaluationTime'].value.string_value El valor se toma del campo properties.WAFEvaluationTime en el registro sin procesar cuando no existe el campo records.
properties.WAFMode additional.fields[?key=='Properties WAFMode'].value.string_value El valor se toma del campo properties.WAFMode en el registro sin procesar cuando no existe el campo records.
rec.category metadata.product_event_type El valor se toma del campo rec.category en el registro sin procesar cuando existe el campo records.
rec.operationName additional.fields[?key=='operationName'].value.string_value El valor se toma del campo rec.operationName en el registro sin procesar cuando existe el campo records.
rec.properties.clientIP, rec.properties.clientIp principal.asset.ip, principal.ip El valor se toma del campo rec.properties.clientIP o rec.properties.clientIp en el registro sin procesar, y se prioriza clientIP cuando existe el campo records.
rec.properties.clientPort principal.port El valor se toma del campo rec.properties.clientPort en el registro sin procesar cuando existe el campo records.
rec.properties.host principal.asset.hostname, principal.hostname El valor se toma del campo rec.properties.host en el registro sin procesar cuando existe el campo records.
rec.properties.policy additional.fields[?key=='Properties policy'].value.string_value El valor se toma del campo rec.properties.policy en el registro sin procesar cuando existe el campo records.
rec.properties.requestUri target.url El valor se toma del campo rec.properties.requestUri en el registro sin procesar cuando existe el campo records.
rec.properties.ruleName security_result.rule_name El valor se toma del campo rec.properties.ruleName en el registro sin procesar cuando existe el campo records.
rec.properties.trackingReference additional.fields[?key=='trackingReference'].value.string_value El valor se toma del campo rec.properties.trackingReference en el registro sin procesar cuando existe el campo records.
rec.resourceId target.resource.id El valor se toma del campo rec.resourceId en el registro sin procesar cuando existe el campo records.
rec.time metadata.event_timestamp El valor se toma del campo rec.time en el registro sin procesar cuando existe el campo records.
resourceId target.resource.id El valor se toma del campo resourceId en el registro sin procesar cuando no existe el campo records.
timeStamp metadata.event_timestamp El valor se toma del campo timeStamp en el registro sin procesar cuando no existe el campo records.
N/A metadata.event_type El valor se establece en NETWORK_CONNECTION si están presentes el principal (nombre de host o IP del cliente) y la IP de destino. Se establece en STATUS_UPDATE si hay un principal, pero falta la IP de destino. De lo contrario, se establece de forma predeterminada en GENERIC_EVENT o en el valor del campo event_type.
N/A metadata.log_type El valor está codificado en AZURE_WAF.
N/A metadata.product_name El valor está codificado en Azure WAF Logs.
N/A metadata.vendor_name El valor está codificado en Microsoft.
N/A security_result.action El valor se establece en ALLOW si properties.action es Matched, BLOCK si properties.action es Block.

Cambios

2024-04-07

Mejora:

  • Se asignó rec.properties.clientIp a principal.ip.
  • Se definieron rec_properties_trackingReference, rec_properties_host, rec_properties_policyMode, rec_properties_ruleName, rec_properties_policy, rec_properties_details_msg, rec_properties_clientIP y rec_time en los datos de estado.

2023-07-14

Mejora:

  • Se agregó un bucle for para controlar los registros JSON.

2023-02-28

Mejora:

  • Se asignó properties.ruleName a security_result.rule_name.
  • Se asignó properties.action a security_result.action.
  • Se agregó la verificación on_error para properties.clientPort, properties.httpStatus, properties.receivedBytes, properties.sentBytes, properties.clientResponseTime y properties.timeTaken.

2022-10-22

  • Analizador creado recientemente

¿Necesitas más ayuda? Obtén respuestas de miembros de la comunidad y profesionales de Google SecOps.