Recopila registros de AWS WAF

Compatible con:

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

  1. Crea un bucket de Amazon S3 siguiendo esta guía del usuario: Cómo crear un bucket
  2. Guarda el Nombre y la Región del bucket para usarlos más adelante.
  3. Crea un usuario siguiendo esta guía: Cómo crear un usuario de IAM.
  4. Selecciona el Usuario creado.
  5. Selecciona la pestaña Credenciales de seguridad.
  6. Haz clic en Crear clave de acceso en la sección Claves de acceso.
  7. Selecciona Servicio de terceros como Caso de uso.
  8. Haz clic en Siguiente.
  9. Opcional: Agrega una etiqueta de descripción.
  10. Haz clic en Crear clave de acceso.
  11. Haz clic en Descargar archivo CSV para guardar la Clave de acceso y la Clave de acceso secreta para usarlas más tarde.
  12. Haz clic en Listo.
  13. Selecciona la pestaña Permisos.
  14. Haz clic en Agregar permisos en la sección Políticas de permisos.
  15. Selecciona Agregar permisos.
  16. Selecciona Adjuntar políticas directamente.
  17. Busca y selecciona la política AmazonS3FullAccess.
  18. Haz clic en Siguiente.
  19. 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.

  1. En la consola de AWS, busca y selecciona AWS WAF y Shield.
  2. Haz clic en Crear ACL web.
  3. 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.
  4. Una vez creada, selecciona la LCA web para la que deseas habilitar el registro.

Configura el registro de AWS WAF

  1. En la consola de AWS WAF, ve a la pestaña Registros de tu ACL web.
  2. Haz clic en Habilitar registro.
  3. Selecciona Amazon S3 como destino de tus registros.
  4. Elige el bucket de S3 que creaste antes para almacenar los registros.
  5. Opcional: Configura un prefijo de registro para organizar los registros (por ejemplo, waf-logs/).
  6. 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.

  1. Ve a la consola de S3.
  2. Selecciona el bucket en el que se almacenarán los registros.
  3. 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/*"
          }
      ]
    }
    
  1. Haz clic en Guardar.

Configura un feed en Google SecOps para transferir los registros de AWS 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 AWS WAF).
  4. Selecciona Amazon S3 como el Tipo de fuente.
  5. Selecciona AWS WAF como el Tipo de registro.
  6. Haz clic en Siguiente.
  7. 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.
    • 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.
  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
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.