Recoger registros de AWS WAF

Disponible en:

En este documento se explica cómo recoger los registros del cortafuegos de aplicaciones web (WAF) de AWS configurando un feed de Google Security Operations. El analizador transforma los registros sin procesar en formato JSON en un formato estructurado que se ajusta al UDM de Google SecOps. Extrae campos como direcciones IP, URLs, agentes de usuario y detalles de reglas de seguridad, y los asigna a los campos de UDM correspondientes para que la representación y el análisis sean coherentes.

Antes de empezar

*Asegúrate de que cumples los siguientes requisitos previos:

  • Instancia de Google SecOps
  • Acceso privilegiado a AWS

Configurar un segmento de Amazon S3

  1. Crea un segmento de Amazon S3 siguiendo esta guía de usuario: Crear un segmento.
  2. Guarda el nombre y la región del bucket para usarlos más adelante.
  3. Crea un usuario siguiendo esta guía: Crear un usuario de gestión de identidades y accesos.
  4. Selecciona el Usuario creado.
  5. Selecciona la pestaña Credenciales de seguridad.
  6. En la sección Claves de acceso, haz clic en Crear clave de acceso.
  7. Selecciona Servicio de terceros como Caso práctico.
  8. Haz clic en Siguiente.
  9. Opcional: añade 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 adelante.
  12. Haz clic en Listo.
  13. Selecciona la pestaña Permisos.
  14. En la sección Políticas de permisos, haz clic en Añadir permisos.
  15. Selecciona Añadir permisos.
  16. Seleccione Adjuntar políticas directamente.
  17. Busca y selecciona la política AmazonS3FullAccess.
  18. Haz clic en Siguiente.
  19. Haz clic en Añadir permisos.

Crear una ACL web de WAF (lista de control de acceso)

Si aún no ha configurado AWS WAF, deberá crear una ACL web de WAF (lista de control de acceso). Si ya tienes una configuración, puedes ir al siguiente procedimiento.

  1. En la consola de AWS, busca y selecciona AWS WAF & Shield.
  2. Haga clic en Crear ACL web.
  3. Configure estos ajustes:
    • Nombre: asigna un nombre a la LCA (por ejemplo, my-waf-web-acl).
    • Región: elija la región en la que quiera aplicar el WAF.
    • Métricas de CloudWatch: habilita la recogida de métricas para monitorizar la actividad y las reglas activadas.
  4. Una vez creada, selecciona la LCA web para la que quieras habilitar el registro.

Cómo configurar el registro de AWS WAF

  1. En la consola de AWS WAF, ve a la pestaña Registro de tu ACL web.
  2. Haz clic en Habilitar registro.
  3. Selecciona Amazon S3 como destino de los registros.
  4. Elige el segmento de S3 que has creado 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.

Verificar los permisos del segmento 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 segmento en el que se almacenarán los registros.
  3. En la pestaña Permissions (Permisos), añada la siguiente política de segmento 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.

Configurar feeds

Hay dos puntos de entrada diferentes para configurar feeds en la plataforma Google SecOps:

  • Configuración de SIEM > Feeds > Añadir nuevo feed
  • Centro de contenido > Paquetes de contenido > Empezar

Cómo configurar el feed de AWS WAF

  1. Haz clic en el paquete Amazon Cloud Platform.
  2. Busca el tipo de registro AWS WAF.
  3. Especifique los valores en los campos siguientes.

    • Tipo de fuente: Amazon SQS V2
    • Nombre de la cola: el nombre de la cola de SQS de la que se va a leer.
    • URI de S3: el URI del segmento.
      • s3://your-log-bucket-name/
        • Sustituye your-log-bucket-name por el nombre real de tu segmento de S3.
    • Opciones de eliminación de la fuente: selecciona la opción de eliminación que prefieras según tus preferencias de ingesta.

    • Antigüedad máxima del archivo: incluye los archivos modificados en los últimos días. El valor predeterminado es 180 días.

    • ID de clave de acceso a la cola de SQS: una clave de acceso de cuenta que es una cadena alfanumérica de 20 caracteres.

    • Clave de acceso secreta de la cola de SQS: una clave de acceso de cuenta que es una cadena alfanumérica de 40 caracteres.

    Opciones avanzadas

    • Nombre del feed: un valor rellenado automáticamente que identifica el feed.
    • Espacio de nombres del recurso: espacio de nombres asociado al feed.
    • Etiquetas de ingestión: etiquetas aplicadas a todos los eventos de este feed.
  4. 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
acción security_result.action Si el valor de action es ALLOW, asigna el valor ALLOW a security_result.action y el valor INFORMATIONAL a security_result.severity. Si la acción es BLOCK, asigna el valor BLOCK a security_result.action. Si la acción es CAPTCHA y captchaResponse.responseCode es 405, asigna a security_result.action el valor BLOCK y a security_result.action_details el valor "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 por cada encabezado de 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", el valor se decodifica, se extrae el nombre de usuario y se asigna a target.user.userid. El resto de los encabezados se añaden 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 de labels. Si el nombre de la etiqueta no está vacío, se añade como un par clave-valor a security_result.rule_labels.
nonTerminatingMatchingRules security_result.action_details, security_result.rule_labels Itera por cada regla de nonTerminatingMatchingRules. Si la acción es ALLOW y la acción de la regla es CAPTCHA, asigna el valor "CAPTCHA SUCCESSFUL" a security_result.action_details y añade el ID de la regla a security_result.rule_labels con la clave "nonTerminatingCaptchaRuleName". Si la acción es BLOCK o ALLOW y la acción de la regla es COUNT, asigna a security_result.action_details el valor "COUNT RULE" y añade el ID de la regla a security_result.rule_labels con la clave "nonTerminatingCountRuleName". Si la acción es BLOCK o ALLOW y la acción de la regla es CHALLENGE, asigna a security_result.action_details el valor "COUNT RULE" y añade 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", se itera por cada regla de 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 de ruleGroupList. El ID del grupo de reglas se añade como 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", se extrae el ID de la regla de finalización y se asigna a security_result.rule_name y security_result.description. El ID del grupo de reglas de finalización se añade 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 añade a security_result.detectionfields con 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 y security_result.rule_name, y se usa para crear security_result.description.
terminatingRuleMatchDetails security_result.description, security_result.category_details, security_result.detection_fields Itera por cada coincidencia de terminatingRuleMatchDetails. Asigna el valor "Terminating Rule" a security_result.description. Si el tipo de condición no está vacío, se añade a security_result.category_details. Si la ubicación no está vacía, se añade a security_result.detection_fields con la clave "location". Cada elemento de datos coincidente se añade 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 ha convertido en una marca de tiempo y se ha asignado a metadata.event_timestamp.
webaclId intermediary.resource.name Se asigna directamente a intermediary.resource.name.
metadata.vendor_name Selecciona "AMAZON".
metadata.product_name Selecciona "AWS Web Application Firewall".
metadata.log_type Asigna el valor "AWS_WAF".
network.application_protocol Selecciona "HTTP".
metadata.event_type Se asigna el valor "NETWORK_HTTP" si httpRequest.headers contiene un encabezado "host" o "Host". De lo contrario, se asigna el valor "STATUS_UPDATE".

¿Necesitas más ayuda? Recibe respuestas de los miembros de la comunidad y de los profesionales de Google SecOps.