====== 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]].