Recopila registros del WAF de Azure
En este documento, se explica cómo exportar los 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 registros iterando cada registro y asignando campos específicos a propiedades de UDM. Si el array records no está presente, el analizador controla el registro como un solo evento, y extrae y asigna los campos según corresponda.
Antes de comenzar
Asegúrate de cumplir con los siguientes requisitos previos:
- Instancia de Google SecOps
- Un inquilino de Azure activo
- Acceso con privilegios a Azure
Configura la cuenta de Azure Storage
- En la consola de Azure, busca Cuentas de almacenamiento.
- Haz clic en Crear.
- Especifica 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: Ingresa un nombre para la nueva cuenta de almacenamiento.
- Haz clic en Revisar + crear.
- Revisa el resumen de la cuenta y haz clic en Crear.
- En la página Información general de la cuenta de almacenamiento, selecciona el submenú Claves de acceso en Seguridad y redes.
- Haz clic en Mostrar junto a key1 o key2.
- Haz clic en Copiar en el portapapeles para copiar la clave.
- Guarda la llave en un lugar seguro para usarla más adelante.
- En la página Información general de la cuenta de almacenamiento, selecciona el submenú Endpoints en Configuración.
- Haz clic en Copiar al portapapeles para copiar la URL del extremo del servicio Blob, por ejemplo,
https://<storageaccountname>.blob.core.windows.net
. - Guarda la URL del extremo en una ubicación segura para usarla más adelante.
Cómo configurar la exportación de registros para los registros del WAF de Azure
- Accede al portal de Azure con tu cuenta con privilegios.
- Ve a Reglas de firewall de aplicaciones web (WAF) y selecciona un WAF para supervisar.
- Selecciona Supervisión > Configuración de diagnóstico.
- 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.
- Selecciona allLogs.
- Selecciona la casilla de verificación Archivar en una cuenta de almacenamiento como destino.
- Especifica la Suscripción y la Cuenta de almacenamiento.
- Haz clic en Guardar.
Configura feeds
Existen dos puntos de entrada diferentes para configurar feeds en la plataforma de Google SecOps:
- Configuración de SIEM > Feeds
- Centro de contenido > Paquetes de contenido
Configura feeds desde Configuración del SIEM > Feeds
Para configurar varios feeds para diferentes tipos de registros dentro de esta familia de productos, consulta Cómo configurar feeds por producto.
Para configurar un solo feed, sigue estos pasos:
- Ve a SIEM Settings > Feeds.
- Haz clic en Agregar feed nuevo.
- En la siguiente página, haz clic en Configurar un solo feed.
- En el campo Nombre del feed, ingresa un nombre para el feed, por ejemplo, Registros del WAF de Azure.
- Selecciona Microsoft Azure Blob Storage como el Tipo de fuente.
- Selecciona WAF de Azure como el Tipo de registro.
- Haz clic en Siguiente.
Especifica valores para los siguientes parámetros de entrada:
- URI de Azure: Es la URL del extremo del blob.
ENDPOINT_URL/BLOB_NAME
- Reemplaza lo siguiente:
ENDPOINT_URL
: URL del extremo del blob (https://<storageaccountname>.blob.core.windows.net
)BLOB_NAME
: Es el nombre del blob (por ejemplo,<logname>-logs
).
- Reemplaza lo siguiente:
- El URI es un: Selecciona el TIPO de URI según la configuración del flujo de registros (Archivo único | Directorio | Directorio que incluye subdirectorios).
Opciones de eliminación de la fuente: Selecciona la opción de eliminación según tus preferencias de transferencia.
Clave compartida: Es la clave de acceso a Azure Blob Storage.
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.
- URI de Azure: Es la URL del extremo del blob.
Haz clic en Siguiente.
Revisa la nueva configuración del feed en la pantalla Finalizar y, luego, haz clic en Enviar.
Configura feeds desde el Centro de contenido
Especifica valores para los siguientes campos:
- URI de Azure: Es la URL del extremo del blob.
ENDPOINT_URL/BLOB_NAME
- Reemplaza lo siguiente:
ENDPOINT_URL
: URL del extremo del blob (https://<storageaccountname>.blob.core.windows.net
)BLOB_NAME
: Es el nombre del blob (por ejemplo,<logname>-logs
).
- Reemplaza lo siguiente:
- El URI es un: Selecciona el TIPO de URI según la configuración del flujo de registros (Archivo único | Directorio | Directorio que incluye subdirectorios).
- Opciones de eliminación de la fuente: Selecciona la opción de eliminación según tus preferencias de transferencia.
- Clave compartida: Es la clave de acceso a Azure Blob Storage.
Opciones avanzadas
- Nombre del feed: Es un valor completado previamente que identifica el feed.
- Tipo de fuente: Es el método que se usa para recopilar registros en Google SecOps.
- Espacio de nombres del recurso: Espacio de nombres asociado al feed.
- Etiquetas de transferencia: Son las etiquetas que se aplican a todos los eventos de este feed.
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 del registro sin procesar, y se prioriza 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 el 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 inversas 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 los valores properties.originalHost , properties.host o properties.hostname , y se priorizan 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 tanto la entidad principal (nombre de host o IP del cliente) como la IP de destino. Se establece en STATUS_UPDATE si hay una 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 como AZURE_WAF . |
N/A | metadata.product_name |
El valor está codificado como Azure WAF Logs . |
N/A | metadata.vendor_name |
El valor está codificado como Microsoft . |
N/A | security_result.action |
El valor se establece en ALLOW si properties.action es Matched y en BLOCK si properties.action es Block . |
¿Necesitas más ayuda? Obtén respuestas de miembros de la comunidad y profesionales de Google SecOps.