====== WAF (Web Application Firewall) ======
===== Parte 1: Teoría Básica =====
=== 1. ¿Qué es AWS WAF? ===
* **Definición**: Servicio de firewall de **capa 7** (aplicación) que protege aplicaciones web de ataques dirigidos al tráfico HTTP/HTTPS.
* **Capa 7**: Opera en el nivel de aplicación del modelo OSI, analizando solicitudes HTTP(S) (headers, body, URI, etc.).
* **Diferencia con firewalls tradicionales**:
- Los firewalls de red (capa 3/4) filtran por IPs/puertos.
- AWS WAF inspecciona contenido (ej: parámetros GET/POST, cookies).
* **Casos de uso**:
- Bloquear SQL Injection en formularios web.
- Detectar XSS en headers personalizados.
- Mitigar ataques DDoS aplicativos.
* **Integración**: Funciona con **CloudFront**, **API Gateway** y **Application Load Balancer (ALB)**.
* **Modelo de Costo**: Pago por reglas creadas y solicitudes procesadas.
* [[https://aws.amazon.com/es/waf/pricing/|Precios de AWS WAF]].
=== 2. Conceptos Clave ===
* **Web ACL (Access Control List)**: Conjunto de reglas para filtrar tráfico.
* **Reglas (Rules)**: Acciones (**Allow**, **Block**, **Count**) basadas en condiciones (IPs, headers, etc.).
* **Rule Groups**: Grupos de reglas reutilizables ([[https://docs.aws.amazon.com/waf/latest/developerguide/aws-managed-rule-groups-list.html|Managed por AWS]] o custom).
=== 3. Notas de Uso Básico ===
* **Crear un Web ACL**:
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 ===
* [[https://docs.aws.amazon.com/waf/latest/developerguide/waf-chapter.html|Guía Oficial de AWS WAF]].
* [[https://docs.aws.amazon.com/waf/latest/developerguide/aws-managed-rule-groups-list.html|Reglas Administradas por AWS]].
===== 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 =====
* Cuenta de AWS con acceso **root**.
* (Opcional) Aplicación web existente. Si no, se creará un ALB de ejemplo.
===== 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**:
- Ingresa a [[https://aws.amazon.com|AWS Console]] > Inicia sesión como root.
2. **Crear el ALB**:
- Ve a **EC2** > **Load Balancers** > **Create Load Balancer**.
- Selecciona **Application Load Balancer**.
- **Configuración básica**:
* Nombre: `alb-troncoso`.
* Esquema: **Internet-facing**.
* Listener: Puerto **80 (HTTP)**.
- **Security Group**: Crea uno nuevo permitiendo tráfico HTTP (0.0.0.0/0).
- **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 \
--name alb-troncoseco \
--subnets subnet-XXXXXXXX subnet-YYYYYYYY \
--security-groups sg-XXXXXXXX \
--scheme internet-facing \
--type application \
--ip-address-type ipv4
=== Paso 2: Crear un Web ACL en AWS WAF ===
1. **Acceder a AWS WAF**:
- Busca **WAF & Shield** en la barra de servicios.
2. **Crear Web ACL**:
- **Nombre**: `waf-troncoso`.
- **Recurso asociado**: Selecciona el ALB `alb-troncoso`.
- **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**: (?i)(\b(union|select|insert|delete|update|drop|exec)\b).
- **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**: (" http://[DNS-ALB]/
* **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 =====
* **Costos**: La capa gratuita incluye 1 Web ACL, 10 reglas, y 1M solicitudes/mes.
* **Seguridad**: Nunca uses el usuario root para operaciones diarias. Usa [[https://docs.aws.amazon.com/IAM/latest/UserGuide/getting-started_create-admin-group.html|usuarios IAM]].
* **Pruebas**: Valida en staging antes de producción.
===== Solución de Problemas Comunes =====
* **Reglas no bloquean**:
- Verifica que el Web ACL esté asociado al ALB/CloudFront.
- Usa la acción **Count** para probar sin bloquear.
* **Error 403 inesperado**:
- Revisa los patrones de las reglas (ej: regex demasiado amplia).
=== Ejercicio 1 (Custom): Bloquear SQLi y XSS ===
**Objetivo**: Crear reglas personalizadas para ataques SQL Injection y Cross-Site Scripting.
**Pasos**:
- **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**: `("
* **Resultado esperado**: HTTP 403 Forbidden.
=== Ejercicio 2 (Oficial AWS): Reglas Administradas ===
**Objetivo**: Usar [[https://docs.aws.amazon.com/waf/latest/developerguide/tutorials-common-attacks.html|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**:
* [[https://docs.aws.amazon.com/waf/latest/developerguide/tutorials-common-attacks.html|Tutorial Oficial AWS]].
=== Ejercicio 3 (Challenge Extra): Rate Limiting ===
**Objetivo**: Limitar solicitudes a 1000/IP en 5 minutos.
**Configuración**:
1. En Web ACL, crear "Rate-based rule".
2. Límite: 1000 solicitudes.
3. Acción: Block.
**Prueba**:
ab -n 2000 -c 10 http://tu-endpoint/
===== Recursos Adicionales =====
* [[https://catalog.workshops.aws/complete-aws-waf/en-US|AWS Workshop Studio: WAFv2]].
* [[https://wellarchitectedlabs.com/security/|AWS Well-Architected Labs]].
===== Notas Finales =====
* **Capa Gratuita**: 1 Web ACL, 10 reglas, 1M solicitudes/mes.
* **Pruebas**: Siempre en staging antes de producción.
* **Mantenimiento**: Actualizar reglas managed cada 3-6 meses.
*
====== Documentación y Soporte oficial ======
* [[https://docs.aws.amazon.com/waf/latest/developerguide/tutorials-create-web-acl.html|Tutorial Oficial: Crear un Web ACL]].
* [[https://docs.aws.amazon.com/waf/latest/developerguide/web-acl-testing.html|Pruebas de Reglas WAF]].