Recopila registros de AWS WAF
En este documento, se explica cómo configurar un feed de Operaciones de seguridad de Google para recopilar los registros del firewall de aplicaciones web (WAF) de AWS. El analizador transforma los registros sin procesar en formato JSON en un formato estructurado que cumple con el UDM de SecOps de Google. Extrae campos como direcciones IP, URLs, usuarios-agentes y detalles de reglas de seguridad, y los asigna a los campos de la UDM correspondientes para obtener una representación y un análisis coherentes.
Antes de comenzar
- Asegúrate de tener una instancia de Google SecOps.
- Asegúrate de tener acceso con privilegios a AWS.
Configura el bucket de Amazon S3
- Crea un bucket de Amazon S3 siguiendo esta guía del usuario: Cómo crear un bucket
- Guarda el Nombre y la Región del bucket para usarlos más adelante.
- Crea un usuario siguiendo esta guía: Cómo crear un usuario de IAM.
- Selecciona el Usuario creado.
- Selecciona la pestaña Credenciales de seguridad.
- Haz clic en Crear clave de acceso en la sección Claves de acceso.
- Selecciona Servicio de terceros como Caso de uso.
- Haz clic en Siguiente.
- Opcional: Agrega una etiqueta de descripción.
- Haz clic en Crear clave de acceso.
- Haz clic en Descargar archivo CSV para guardar la Clave de acceso y la Clave de acceso secreta para usarlas más tarde.
- Haz clic en Listo.
- Selecciona la pestaña Permisos.
- Haz clic en Agregar permisos en la sección Políticas de permisos.
- Selecciona Agregar permisos.
- Selecciona Adjuntar políticas directamente.
- Busca y selecciona la política AmazonS3FullAccess.
- Haz clic en Siguiente.
- Haz clic en Agregar permisos.
Crea una LCA (lista de control de acceso) web de WAF
Si aún no configuraste AWS WAF, deberás crear una LCA (lista de control de acceso) web de WAF. En el caso de las configuraciones existentes, puedes omitir el siguiente procedimiento.
- En la consola de AWS, busca y selecciona AWS WAF y Shield.
- Haz clic en Crear ACL web.
- Proporciona la siguiente configuración:
- Nombre: Asigna un nombre a la LCA (por ejemplo,
my-waf-web-acl
). - Región: Elige la región en la que deseas aplicar el WAF.
- Métricas de CloudWatch: Habilita la recopilación de métricas para hacer un seguimiento de la actividad y las reglas activadas.
- Nombre: Asigna un nombre a la LCA (por ejemplo,
- Una vez creada, selecciona la LCA web para la que deseas habilitar el registro.
Configura el registro de AWS WAF
- En la consola de AWS WAF, ve a la pestaña Registros de tu ACL web.
- Haz clic en Habilitar registro.
- Selecciona Amazon S3 como destino de tus registros.
- Elige el bucket de S3 que creaste antes para almacenar los registros.
- Opcional: Configura un prefijo de registro para organizar los registros (por ejemplo,
waf-logs/
). - Haz clic en Guardar.
Verifica los permisos del bucket de S3
Asegúrate de que el bucket de S3 tenga los permisos adecuados para que AWS WAF escriba registros.
- Ve a la consola de S3.
- Selecciona el bucket en el que se almacenarán los registros.
En la pestaña Permissions, agrega la siguiente política de bucket para permitir que AWS WAF escriba registros:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "wafv2.amazonaws.com" }, "Action": "s3:PutObject", "Resource": "arn:aws:s3:::your-log-bucket-name/*" } ] }
- Haz clic en Guardar.
Configura un feed en Google SecOps para transferir los registros de AWS WAF
- Ve a Configuración de SIEM > Feeds.
- Haz clic en Agregar nueva.
- En el campo Nombre del feed, ingresa un nombre para el feed (por ejemplo, Registros de AWS WAF).
- Selecciona Amazon S3 como el Tipo de fuente.
- Selecciona AWS WAF como el Tipo de registro.
- Haz clic en Siguiente.
Especifica valores para los siguientes parámetros de entrada:
- Región: Es la región en la que se encuentra el bucket de Amazon S3.
- URI de S3: Es el URI del bucket.
s3://your-log-bucket-name/waf-logs/
- Reemplaza lo siguiente:
your-log-bucket-name
: Es el nombre real del bucket.
- Reemplaza lo siguiente:
- El URI es un: Selecciona Directorio o Directorio que incluye subdirectorios.
- Opciones de eliminación de fuentes: Selecciona la opción de eliminación según tus preferencias.
- ID de clave de acceso: Es la clave de acceso del usuario con acceso al bucket de S3.
- Clave de acceso secreta: Es la clave secreta del usuario con acceso al bucket de S3.
- 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.
Haz clic en Siguiente.
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 |
---|---|---|
acción | security_result.action | Si la acción es ALLOW, establece security_result.action en ALLOW y security_result.severity en INFORMATIONAL. Si la acción es BLOCK, establece security_result.action en BLOCK. Si action es CAPTCHA y captchaResponse.responseCode es 405, establece security_result.action en BLOCK y security_result.action_details en "CAPTCHA {captchaResponse.failureReason}". |
captchaResponse.failureReason | security_result.action_details | Se usa junto con action y captchaResponse.responseCode para determinar security_result.action_details. |
captchaResponse.responseCode | security_result.action_details | Se usa junto con action y captchaResponse.failureReason para determinar security_result.action_details. |
httpRequest.clientIp | principal.ip, principal.asset.ip | Se asigna directamente a principal.ip y principal.asset.ip. |
httpRequest.headers | target.hostname, target.asset.hostname, network.http.user_agent, network.http.parsed_user_agent, network.http.referral_url, target.location.country_or_region, target.resource.attribute.labels, target.user.userid | Itera a través de cada encabezado en httpRequest.headers. Si el nombre del encabezado es "host" o "Host", el valor se asigna a target.hostname y target.asset.hostname. Si el nombre del encabezado es "User-Agent" o "user-agent", el valor se asigna a network.http.user_agent y se analiza en network.http.parsed_user_agent. Si el nombre del encabezado es "Referer" o "referer", el valor se asigna a network.http.referral_url. Si el nombre del encabezado es "(?i)time-zone", el valor se asigna a target.location.country_or_region. Si el nombre del encabezado es "authorization", se decodifica el valor, se extrae el nombre de usuario y se asigna a target.user.userid. Todos los demás encabezados se agregan como pares clave-valor a target.resource.attribute.labels. |
httpRequest.httpMethod | network.http.method | Se asigna directamente a network.http.method. |
httpRequest.requestId | network.session_id | Se asigna directamente a network.session_id. |
httpRequest.uri | target.url | Se asigna directamente a target.url. |
httpSourceId | target.resource.name | Se asigna directamente a target.resource.name. |
httpSourceName | metadata.product_event_type | Se asigna directamente a metadata.product_event_type. |
etiquetas | security_result.rule_labels | Itera por cada etiqueta en etiquetas. Si el nombre de la etiqueta no está vacío, se agrega como un par clave-valor a security_result.rule_labels. |
nonTerminatingMatchingRules | security_result.action_details, security_result.rule_labels | Itera por cada regla en nonTerminatingMatchingRules. Si la acción es PERMITIR y la acción de la regla es CAPTCHA, establece security_result.action_details en "CAPTCHA SUCCESSFUL" y agrega el ID de la regla a security_result.rule_labels con la clave "nonTerminatingCaptchaRuleName". Si la acción es BLOQUEAR o PERMITIR y la acción de la regla es CONTAR, establece security_result.action_details en "REGLA DE CONTAR" y agrega el ID de la regla a security_result.rule_labels con la clave "nonTerminatingCountRuleName". Si la acción es BLOQUEAR o PERMITIR y la acción de la regla es RETAR, establece security_result.action_details en "COUNT RULE" y agrega el ID de la regla a security_result.rule_labels con la clave "nonTerminatingChallengeRuleName". |
rateBasedRuleList | security_result.rule_id, security_result.rule_name, security_result.description | Si terminatingRuleType es "RATE_BASED", itera por cada regla en rateBasedRuleList. Si terminatingRuleId coincide con el nombre de la regla, el ID, el nombre y la descripción de la regla se asignan a security_result.rule_id, security_result.rule_name y security_result.description, respectivamente. |
responseCodeSent | network.http.response_code | Se asigna directamente a network.http.response_code y se convierte en un número entero. |
ruleGroupList | intermediary.labels, security_result.rule_id, security_result.rule_name, security_result.description, security_result.detection_fields | Itera por cada grupo de reglas en ruleGroupList. El ID del grupo de reglas se agrega como un par clave-valor a intermediary.labels. Si terminatingRuleType es "MANAGED_RULE_GROUP" y terminatingRuleId coincide con el ID del grupo de reglas, el ID, el nombre y la descripción de la regla se asignan a security_result.rule_id, security_result.rule_name y security_result.description, respectivamente. Si terminatingRuleType es "GROUP", el ID de la regla de terminación se extrae y se asigna a security_result.rule_name y security_result.description. El ID del grupo de reglas de terminación se agrega a security_result.rule_labels con la clave "terminatingRuleGroupName". Si terminatingRuleType es "REGULAR", la acción de la regla de finalización se extrae y se agrega a los campos security_result.detectioncon la clave "terminatingRuleAction{index}". |
terminatingRuleId | security_result.rule_id, security_result.rule_name, security_result.description | Si terminatingRuleType es "RATE_BASED", "MANAGED_RULE_GROUP" o "REGULAR", terminatingRuleId se asigna a security_result.rule_id, security_result.rule_name y se usa para construir security_result.description. |
terminatingRuleMatchDetails | security_result.description, security_result.category_details, security_result.detection_fields | Itera por cada coincidencia en terminatingRuleMatchDetails. Establece security_result.description en "Terminating Rule". Si el tipo de condición no está vacío, se agrega a security_result.category_details. Si la ubicación no está vacía, se agrega a security_result.detection_fields con la clave "location". Para cada elemento de datos coincidente, se agrega a security_result.detection_fields con la clave "matchedData". |
terminatingRuleType | security_result.rule_type | Se asigna directamente a security_result.rule_type. |
timestamp | metadata.event_timestamp | Se convierte en una marca de tiempo y se asigna a metadata.event_timestamp. |
webaclId | intermediary.resource.name | Se asigna directamente a intermediary.resource.name. |
metadata.vendor_name | Se establece en "AMAZON". | |
metadata.product_name | Establece la opción en “Firewall de aplicación web de AWS”. | |
metadata.log_type | Establece el valor en "AWS_WAF". | |
network.application_protocol | Establece el valor en “HTTP”. | |
metadata.event_type | Establece el valor en "NETWORK_HTTP" si httpRequest.headers contiene un encabezado "host" o "Host". De lo contrario, configúralo como "STATUS_UPDATE". |
Cambios
2024-03-14
- Se mejoró el manejo de caracteres de escape no válidos en los mensajes de registro para garantizar un formato JSON correcto.
2023-12-29
- Se estandarizó la asignación de la información del "usuario-agente" al campo de la AUA correspondiente.
- Se extrajeron los IDs de usuario del encabezado "authorization" en las solicitudes HTTP.
2023-12-08
- Se corrigieron varios errores relacionados con la asignación de nombres de host, la extracción de URLs de destino y el procesamiento de reglas.
- Se mejoró el manejo de errores en secciones específicas del analizador.
2023-12-11
- Se agregó compatibilidad con un nuevo formato de registro mediante la introducción de un nuevo patrón de Grok.
2023-08-16
- Se mejoró la asignación de acciones de reglas de seguridad al campo de la AUA para los campos de detección.
2022-12-16
- Se optimizó la lógica de filtrado de fecha y se mejoró el manejo de datos JSON no válidos.
- Información del usuario-agente asignada de los encabezados HTTP a un campo de UDM exclusivo
2022-12-11
- Se quitó la lógica innecesaria para controlar los registros de mensajes CSV y SYSLOG.
2022-07-22
- Esto marcó la creación inicial del analizador.
¿Necesitas más ayuda? Obtén respuestas de miembros de la comunidad y profesionales de Google SecOps.