Table of Contents

WAF (Web Application Firewall)

Parte 1: Teoría Básica

1. ¿Qué es AWS WAF?

2. Conceptos Clave

3. Notas de Uso Básico

1. Ir a AWS WAF & Shield en la consola.

  2. Asociar a un recurso (ALB, CloudFront).  
  3. Agregar reglas con acciones definidas.  
* **Reglas Comunes**:  
  * Bloquear IPs: Usar **IP match conditions**.  
  * Detectar SQLi: Regex en el body (ej: `(?i)(\bunion\b)`).  
* **Monitoreo**: Habilitar [[https://docs.aws.amazon.com/waf/latest/developerguide/logging.html|AWS WAF Logs]] en S3/CloudWatch.  

4. Documentación Oficial

Parte 2: Ejercicios Prácticos

Challenge AWS WAF

Contexto del Problema

La empresa Troncoso Software requiere proteger su aplicación web contra ataques de SQL Injection y XSS. Como administrador, debes implementar un WAF desde cero siguiendo esta guía.

Prerrequisitos

Solución:

Paso 1: Crear un Application Load Balancer(ALB)

En caso de ya haberlo creado,saltar al Paso 2.

1. Acceder a la consola de AWS:

  1. Ingresa a AWS Console > Inicia sesión como root.

2. Crear el ALB:

  1. Ve a EC2 > Load Balancers > Create Load Balancer.
  2. Selecciona Application Load Balancer.
  3. Configuración básica:
  1. Security Group: Crea uno nuevo permitiendo tráfico HTTP (0.0.0.0/0).
  2. Target Group: Crea uno nuevo (`tg-troncoso`) con instancias ficticias si no hay servidores.

3. Finalizar: Haz clic en Create. #Lo mismo pero desde la CLI aws elbv2 create-load-balancer \

  1. -name alb-troncoseco \
  2. -subnets subnet-XXXXXXXX subnet-YYYYYYYY \
  3. -security-groups sg-XXXXXXXX \
  4. -scheme internet-facing \
  5. -type application \
  6. -ip-address-type ipv4

Paso 2: Crear un Web ACL en AWS WAF

1. Acceder a AWS WAF:

  1. Busca WAF & Shield en la barra de servicios.

2. Crear Web ACL:

  1. Nombre: `waf-troncoso`.
  2. Recurso asociado: Selecciona el ALB `alb-troncoso`.
  3. Región: Asegúrate de que coincida con la del ALB.

Paso 3: Añadir Reglas Personalizadas

Regla 1: Bloquear SQL Injection

1. **Crear regla**:  
   - En **Web ACLs** > `waf-troncoso` > **Add rules** > **Add my own rules**.  
   - **Nombre**: `block-sqli`.  
   - **Condición**:  
     * **Field to inspect**: Body.  
     * **Match type**: Regex.  
     * **Patrón**: <code>(?i)(\b(union|select|insert|delete|update|drop|exec)\b)</code>.  
   - **Acción**: Block.  

Regla 2: Bloquear XSS

1. **Crear regla**:  
   - **Nombre**: `block-xss`.  
   - **Condición**:  
     * **Field to inspect**: Headers > User-Agent.  
     * **Match type**: Regex.  
     * **Patrón**: <code>(<script>|javascript:|onerror=)</code>.  
   - **Acción**: Block.  

Paso 4: Priorizar Reglas

1. **Orden de evaluación**:  
   - Arrastra las reglas en este orden:  
     1. `block-sqli`.  
     2. `block-xss`.  
2. **Guardar**: Haz clic en **Create web ACL**.  

Paso 5: Probar el WAF

1. **Obtener DNS del ALB**:  
   - Ve a **EC2** > **Load Balancers** > Copia el **DNS Name** de `alb-troncoso`.  
2. **Prueba SQLi**:  
   <code>  
   curl "http://[DNS-ALB]/?param=' OR 1=1 --"  
   </code>  
   * **Resultado esperado**: HTTP 403.  
3. **Prueba XSS**:  
   <code>  
   curl -A "<script>alert('XSS')</script>" http://[DNS-ALB]/  
   </code>  
   * **Resultado esperado**: HTTP 403.  

Paso 6: Habilitar Logs para Monitoreo

1. **Configurar logs en S3**:  
   - En **Web ACLs** > `waf-troncoso` > **Logging and metrics** > **Enable logging**.  
   - Selecciona un bucket S3 ([[https://docs.aws.amazon.com/AmazonS3/latest/userguide/create-bucket-overview.html|crea uno si es necesario]]).  
2. **Ver logs en CloudWatch**:  
   - Ve a **CloudWatch** > **Logs** > Busca `/aws/waf/webacl/waf-troncoso`.  

Paso 7: Limpiar Recursos (Opcional)

1. **Eliminar Web ACL**:  
   - **WAF & Shield** > **Web ACLs** > Eliminar `waf-troncoso`.  
2. **Eliminar ALB**:  
   - **EC2** > **Load Balancers** > Eliminar `alb-troncoso`.  

Notas Importantes

Solución de Problemas Comunes

Ejercicio 1 (Custom): Bloquear SQLi y XSS

Objetivo: Crear reglas personalizadas para ataques SQL Injection y Cross-Site Scripting.

Pasos:

  1. Crear Web ACL:

1. En AWS WAF, ir a “Web ACLs” > “Create web ACL”.

  2. Asociar a un ALB/CloudFront.  
    
- **Regla SQLi**:  
  * **Field to inspect**: Body.  
  * **Regex**: `(?i)(\b(union|select|insert)\b)`.  
- **Regla XSS**:  
  * **Field to inspect**: URI o Headers.  
  * **Regex**: `(<script>|javascript:)`.  

Prueba:

<code>  
curl "http://tu-endpoint?param=<script>alert('xss')</script>"  
</code>  
* **Resultado esperado**: HTTP 403 Forbidden.  

Ejercicio 2 (Oficial AWS): Reglas Administradas

Objetivo: Usar AWS Managed Rules para bloquear tráfico malicioso.

Pasos:

1. En **Web ACL**, agregar un **Rule Group** > **AWSManagedRulesCommonRuleSet**.  
2. Configurar acción **Block**.  
3. Probar con User-Agent: `BadBot`.  

Documentación:

Ejercicio 3 (Challenge Extra): Rate Limiting

Objetivo: Limitar solicitudes a 1000/IP en 5 minutos.

Configuración:

<code>  
1. En Web ACL, crear "Rate-based rule".  
2. Límite: 1000 solicitudes.  
3. Acción: Block.  
</code>  

Prueba:

<code>  
ab -n 2000 -c 10 http://tu-endpoint/  
</code>  

Recursos Adicionales

Notas Finales

Documentación y Soporte oficial