Recoger registros de Azure WAF
En este documento se explica cómo exportar los registros del cortafuegos de aplicaciones web (WAF) de Azure a Google Security Operations mediante una cuenta de almacenamiento de Azure. El analizador gestiona los registros en formato JSON y los transforma en UDM. Procesa los registros que contienen una matriz records. Para ello, itera por cada registro y asigna campos específicos a propiedades de UDM. Si falta la matriz records, el analizador trata el registro como un solo evento, extrayendo y asignando los campos correspondientes.
Antes de empezar
Asegúrate de que cumples los siguientes requisitos previos:
- Instancia de Google SecOps
- Un cliente de Azure activo
- Acceso privilegiado a Azure
Configurar la cuenta de Azure Storage
- En la consola de Azure, busca Cuentas de almacenamiento.
- Haz clic en Crear.
- Especifique valores para los siguientes parámetros de entrada:
- Suscripción: 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: escribe un nombre para la nueva cuenta de almacenamiento.
- Haz clic en Revisar y crear.
- Revisa el resumen de la cuenta y haz clic en Crear.
- En la página Storage Account Overview (Resumen de la cuenta de almacenamiento), seleccione el submenú Access keys (Claves de acceso) en Security + networking (Seguridad y redes).
- Haz clic en Mostrar junto a clave1 o clave2.
- Haz clic en Copiar en el portapapeles para copiar la clave.
- Guarda la clave en un lugar seguro para usarla más adelante.
- En la página Resumen de la cuenta de almacenamiento, seleccione el submenú Endpoints (Endpoints) en Settings (Configuración).
- Haz clic en Copiar en el portapapeles para copiar la URL del endpoint del servicio Blob. Por ejemplo,
https://<storageaccountname>.blob.core.windows.net
. - Guarda la URL del endpoint en una ubicación segura para usarla más adelante.
Cómo configurar la exportación de registros de Azure WAF
- Inicia sesión en el portal de Azure con tu cuenta con privilegios.
- Ve a Reglas de cortafuegos de aplicación web (WAF) y selecciona un WAF para monitorizarlo.
- Selecciona Monitorización > Configuración de diagnóstico.
- Haga clic en + Añadir ajuste de diagnóstico.
- Escribe un nombre descriptivo para el ajuste de diagnóstico.
- Selecciona allLogs.
- Seleccione la casilla Archivar en una cuenta de almacenamiento como destino.
- Especifica la Suscripción y la Cuenta de almacenamiento.
- Haz clic en Guardar.
Configurar feeds
Hay dos puntos de entrada diferentes para configurar feeds en la plataforma Google SecOps:
- Configuración de SIEM > Feeds > Añadir nuevo
- Centro de contenido > Paquetes de contenido > Empezar
Cómo configurar el feed de Azure WAF
- Haz clic en el paquete Plataforma de Azure.
- Busca el tipo de registro Azure WAF y haz clic en Añadir nuevo feed.
Especifique los valores de los siguientes campos:
- Tipo de fuente: Microsoft Azure Blob Storage V2.
- URI de Azure: la URL del endpoint del blob.
ENDPOINT_URL/BLOB_NAME
- Sustituye lo siguiente:
ENDPOINT_URL
: URL del endpoint de blob (https://<storageaccountname>.blob.core.windows.net
)BLOB_NAME
: el nombre del blob (por ejemplo,<logname>-logs
)
- Sustituye lo siguiente:
- Opciones de eliminación de la fuente: selecciona la opción de eliminación que prefieras según tus preferencias de ingesta.
Nota: Si seleccionas la opción
Delete transferred files
oDelete transferred files and empty directories
, asegúrate de haber concedido los permisos adecuados a la cuenta de servicio. - Antigüedad máxima del archivo: incluye los archivos modificados en los últimos días. El valor predeterminado es de 180 días.
Clave compartida: la clave de acceso a Azure Blob Storage. Opciones avanzadas
Nombre del feed: valor rellenado automáticamente que identifica el feed.
Espacio de nombres de recursos: espacio de nombres asociado al feed.
Etiquetas de ingestión: etiquetas aplicadas a todos los eventos de este feed.
Haga clic en Crear feed.
Para obtener más información sobre cómo configurar varios feeds para diferentes tipos de registros en esta familia de productos, consulta el artículo Configurar feeds por producto.
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 del registro sin procesar. |
backendSettingName |
additional.fields[?key=='backendSettingName'].value.string_value |
El valor se toma del campo backendSettingName del registro sin procesar. |
category |
metadata.product_event_type |
El valor se toma del campo category del registro sin procesar. |
EventEnqueuedUtcTime |
additional.fields[?key=='EventEnqueuedUtcTime'].value.string_value |
El valor se toma del campo EventEnqueuedUtcTime del registro sin procesar cuando existe el campo records . |
EventProcessedUtcTime |
additional.fields[?key=='EventProcessedUtcTime'].value.string_value |
El valor se toma del campo EventProcessedUtcTime del registro sin procesar cuando existe el campo records . |
operationName |
additional.fields[?key=='operationName'].value.string_value |
El valor se toma del campo operationName del registro sin procesar. |
properties.action |
additional.fields[?key=='action'].value.string_value |
El valor se toma del campo properties.action del registro sin procesar cuando existe el campo records . |
properties.action |
security_result.action_details |
El valor se toma del campo properties.action del 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 del registro sin procesar, y se da prioridad a clientIP . |
properties.clientPort |
principal.port |
El valor se toma del campo properties.clientPort del registro sin procesar. |
properties.clientResponseTime |
principal.resource.attribute.labels[?key=='Client Response Time'].value |
El valor se toma del campo properties.clientResponseTime del 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 del 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 del 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 de la matriz properties.details.matches del registro sin procesar. El key del UDM se crea usando 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 del registro sin procesar después de eliminar las barras invertidas y las comillas. |
properties.details.msg |
metadata.description |
El valor se toma del campo properties.details.msg del registro sin procesar cuando existe el campo records . |
properties.httpMethod |
network.http.method |
El valor se toma del campo properties.httpMethod del registro sin procesar. |
properties.httpStatus |
network.http.response_code |
El valor se toma del campo properties.httpStatus del 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 properties.originalHost , properties.host o properties.hostname , y se les da prioridad en ese orden. |
properties.policyId |
security_result.detection_fields[?key=='policyId'].value |
El valor se toma del campo properties.policyId del registro sin procesar. |
properties.policyMode |
security_result.detection_fields[?key=='policyMode'].value |
El valor se toma del campo properties.policyMode del 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 del registro sin procesar cuando existe el campo records . |
properties.receivedBytes |
network.received_bytes |
El valor se toma del campo properties.receivedBytes del registro sin procesar. |
properties.requestUri |
target.url |
El valor se toma del campo properties.requestUri del registro sin procesar. |
properties.ruleId |
security_result.rule_id |
El valor se toma del campo properties.ruleId del registro sin procesar. |
properties.ruleName |
security_result.rule_name |
El valor se toma del campo properties.ruleName del 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 del 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 del registro sin procesar. |
properties.sentBytes |
network.sent_bytes |
El valor se toma del campo properties.sentBytes del registro sin procesar. |
properties.serverResponseLatency |
additional.fields[?key=='Server Response Latency'].value.string_value |
El valor se toma del campo properties.serverResponseLatency del 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 del registro sin procesar. |
properties.sslClientCertificateIssuerName |
network.tls.server.certificate.issuer |
El valor se toma del campo properties.sslClientCertificateIssuerName del registro sin procesar. |
properties.sslProtocol |
network.tls.version |
El valor se toma del campo properties.sslProtocol del registro sin procesar. |
properties.timeTaken |
additional.fields[?key=='Properties Timetaken'].value.string_value |
El valor se toma del campo properties.timeTaken del 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 del registro sin procesar cuando existe el campo records . |
properties.transactionId |
network.session_id |
El valor se toma del campo properties.transactionId del registro sin procesar. |
properties.userAgent |
network.http.user_agent |
El valor se toma del campo properties.userAgent del registro sin procesar. |
properties.WAFEvaluationTime |
additional.fields[?key=='Properties WAFEvaluationTime'].value.string_value |
El valor se toma del campo properties.WAFEvaluationTime del 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 del registro sin procesar cuando no existe el campo records . |
rec.category |
metadata.product_event_type |
El valor se toma del campo rec.category del 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 del 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 del campo rec.properties.clientIp del registro sin procesar, y se da prioridad a clientIP cuando existe el campo records . |
rec.properties.clientPort |
principal.port |
El valor se toma del campo rec.properties.clientPort del 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 del 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 del registro sin procesar cuando existe el campo records . |
rec.properties.requestUri |
target.url |
El valor se toma del campo rec.properties.requestUri del registro sin procesar cuando existe el campo records . |
rec.properties.ruleName |
security_result.rule_name |
El valor se toma del campo rec.properties.ruleName del 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 del registro sin procesar cuando existe el campo records . |
rec.resourceId |
target.resource.id |
El valor se toma del campo rec.resourceId del registro sin procesar cuando existe el campo records . |
rec.time |
metadata.event_timestamp |
El valor se toma del campo rec.time del registro sin procesar cuando existe el campo records . |
resourceId |
target.resource.id |
El valor se toma del campo resourceId del registro sin procesar cuando no existe el campo records . |
timeStamp |
metadata.event_timestamp |
El valor se toma del campo timeStamp del registro sin procesar cuando no existe el campo records . |
N/A | metadata.event_type |
El valor es NETWORK_CONNECTION si están presentes tanto el principal (nombre de host o IP del cliente) como la IP de destino. Se define como STATUS_UPDATE si hay un principal, pero falta la IP de destino. De lo contrario, se utiliza GENERIC_EVENT o el valor del campo event_type de forma predeterminada. |
N/A | metadata.log_type |
El valor se ha codificado como AZURE_WAF . |
N/A | metadata.product_name |
El valor se ha codificado como Azure WAF Logs . |
N/A | metadata.vendor_name |
El valor se ha codificado como Microsoft . |
N/A | security_result.action |
El valor se define como ALLOW si properties.action es Matched y como BLOCK si properties.action es Block . |
¿Necesitas más ayuda? Recibe respuestas de los miembros de la comunidad y de los profesionales de Google SecOps.