En 03-02, cuando una sola dirección IP empezó a hacer miles de peticiones por minuto contra la tienda,
la solución fue elegante y tardó un minuto: una regla DENY numerada 50 en la NACL de las subredes
públicas, con número bajo para que se evaluara antes que el ALLOW general. Funcionó perfectamente.
Funcionó porque era una dirección.
Si mañana las peticiones llegan desde diez mil direcciones repartidas por sesenta países, esa regla no sirve de nada. Y no es solo que haya que escribir diez mil reglas: es que no se puede. Una NACL admite 20 reglas por defecto y un máximo duro de 40. Un grupo de seguridad admite 60. La herramienta que resolvió el problema pequeño no escala al problema grande, y eso no es un defecto de la herramienta: es que son problemas distintos.
Peor aún, hay un daño colateral que casi nadie anticipa la primera vez. El grupo de Auto Scaling
asg-mercadofresco-tienda que montamos en 02-01 para resolver las caídas de los viernes hará
exactamente aquello para lo que fue diseñado: ver mucha carga y arrancar instancias. Un ataque de
denegación de servicio contra una arquitectura elástica no siempre tira el servicio; a veces
simplemente lo convierte en una factura de cinco cifras.
AWS Shield es el servicio de protección frente a ataques de denegación de servicio distribuida. En esta lección Marta entiende contra qué se está protegiendo, descubre que la mayor parte de la protección ya la tiene activada y gratis, y toma una decisión razonada —y negativa— sobre los 3.000 dólares mensuales de Shield Advanced.
Advertencia. El contenido de esta lección es estrictamente defensivo: describe cómo detectar y mitigar ataques contra tu propia infraestructura, nunca cómo ejecutarlos. Realizar pruebas de carga o de estrés contra sistemas que no son tuyos es ilegal, y contra los tuyos en AWS requiere seguir la política de pruebas de simulación de AWS. Los ejemplos son didácticos: toda configuración de seguridad, y en particular cualquier plan de respuesta a incidentes que afecte a datos de clientes bajo el RGPD, debe ser revisada por un profesional de seguridad antes de aplicarse a un entorno real.
Contenido
- Qué es un ataque de denegación de servicio distribuida
- Por qué la regla de una sola IP no sirve
- Taxonomía: capas 3/4 frente a capa 7
- Ataques volumétricos
- Ataques de capa de aplicación
- El daño económico: cuando el escalado juega en tu contra
- AWS Shield Standard: lo que ya tienes
- AWS Shield Advanced: qué añade
- Protección de costes frente al escalado
- El equipo de respuesta ante incidentes (SRT)
- Coste real y evaluación honesta para MercadoFresco
- Arquitectura resiliente: la primera línea de defensa
- Reducir la superficie expuesta
- Cachear agresivamente y sobredimensionar
- Métricas y detección
- Alarmas hacia
alertas-mercadofresco - Plan de respuesta: qué mira Marta primero
- Distinguir un ataque de un viernes muy bueno
- Qué hacer en caliente y qué documentar después
- Coste, limpieza y lo que viene
Qué es un ataque de denegación de servicio distribuida
Un ataque de denegación de servicio (DoS) busca dejar un servicio inaccesible para sus usuarios legítimos consumiendo un recurso finito: ancho de banda, conexiones, CPU, memoria o conexiones de base de datos. Distribuida (DDoS) significa que el tráfico procede de muchas fuentes simultáneas —típicamente equipos comprometidos o servicios de terceros abusados—, lo que hace inviable distinguirlas y bloquearlas una a una.
La diferencia con otros ataques importa:
| Ataque de intrusión | Ataque de denegación de servicio | |
|---|---|---|
| Objetivo | Robar o alterar datos | Que el servicio no responda |
| Sigilo | Máximo: quiere pasar desapercibido | Ninguno: quiere que se note |
| Defensa | IAM, cifrado, WAF, parches | Capacidad, filtrado, absorción |
| Duración | Meses sin detectarse | Minutos u horas |
| Daño | Brecha de datos, RGPD | Ventas perdidas, reputación, factura |
Para MercadoFresco, un ataque de dos horas un viernes por la tarde significa perder unos 1.800 pedidos —900 por hora en el pico— más el daño de que los clientes que quisieron comprar y no pudieron se acuerden de ello la semana siguiente.
Quién los lanza: extorsión («paga o seguimos»), competencia desleal, activismo, o simplemente ruido de fondo automatizado que barre internet buscando objetivos fáciles. Esta última categoría es la más frecuente y la razón de que incluso una tienda mediana necesite pensar en esto.
Por qué la regla de una sola IP no sirve
Merece la pena ver el contraste con números:
| Incidente de 03-02 | Ataque distribuido | |
|---|---|---|
| Fuentes | 1 dirección IP | 10.000-1.000.000 direcciones |
| Solución | 1 regla en la NACL | Imposible con NACL |
| Límite de la herramienta | 40 reglas por NACL | Muy insuficiente |
| Dónde se filtra | En la subred, ya dentro de tu VPC | Debe filtrarse antes, en el borde |
| Quién decide | Tú, a mano, en un minuto | Un sistema automático, en segundos |
Hay además un problema conceptual más profundo. Filtrar en la NACL significa que el paquete ya ha llegado a tu VPC: ha consumido tu ancho de banda de entrada y ha llegado hasta la puerta. Si el ataque satura el enlace, filtrar dentro no ayuda, porque el enlace ya está lleno.
De ahí el principio que organiza toda la defensa contra DDoS:
El tráfico malicioso debe filtrarse lo más lejos posible de tu infraestructura, idealmente en la red del proveedor, distribuido entre cientos de puntos de presencia, antes de que converja hacia un único destino.
Eso es exactamente lo que hace Shield, y explica por qué la protección va asociada a CloudFront y Route 53: son servicios que viven en el borde.
Taxonomía: capas 3/4 frente a capa 7
Los ataques se clasifican por la capa del modelo OSI en la que operan, y esa clasificación determina la defensa:
| Capa 3/4 (red y transporte) | Capa 7 (aplicación) | |
|---|---|---|
| Qué satura | Ancho de banda, tabla de conexiones | CPU, memoria, base de datos |
| Volumen | Muy alto: Gbps, Mpps | Bajo: parece tráfico normal |
| Aspecto | Paquetes malformados o inundación | Peticiones HTTP válidas |
| Detección | Fácil: el volumen canta | Difícil: parece tráfico legítimo |
| Defensa | Absorción en el borde, filtrado por firma | WAF, reglas por tasa, CAPTCHA |
| Servicio de AWS | Shield | WAF (04-05) |
La conclusión operativa es la que estructura este módulo: Shield para lo volumétrico, WAF para lo inteligente. Ninguno de los dos sustituye al otro, y la lección siguiente cubre el segundo.
Ataques volumétricos
Los de capa 3 y 4. Existen desde hace décadas y hoy se lanzan casi siempre desde botnets o abusando de servicios mal configurados en internet.
| Técnica | Cómo satura | Síntoma en tus métricas |
|---|---|---|
| Inundación UDP | Envía enormes cantidades de UDP a puertos aleatorios | Tráfico de entrada masivo; CPU en el filtrado |
| Reflexión y amplificación | Falsifica tu IP como origen y pide a servidores DNS/NTP/memcached mal configurados que respondan; la respuesta es cientos de veces mayor que la petición | Volumen enorme desde IP de servidores legítimos |
| Inundación SYN | Abre conexiones TCP a medias y no las completa, agotando la tabla de conexiones | Muchas conexiones en SYN_RECV; el servidor no acepta nuevas |
| Inundación ICMP | Ping masivo | Tráfico de entrada alto, poco efectivo hoy |
| Fragmentación | Paquetes fragmentados que consumen recursos al reensamblarse | CPU alta en el sistema operativo |
La amplificación por reflexión es la que produce los ataques de mayor tamaño registrados: un atacante con poco ancho de banda puede generar cientos de veces esa cantidad contra su objetivo. La mitigación es de red y ocurre antes de llegar a ti: no es algo que se resuelva en tu servidor.
La buena noticia para MercadoFresco es que casi todo esto lo absorbe AWS por defecto. La capacidad agregada de la red de AWS y de los puntos de presencia de CloudFront es de un orden de magnitud que ningún ataque volumétrico dirigido a una tienda mediana va a agotar. Contra esta familia, MercadoFresco ya está protegido sin haber hecho nada.
Ataques de capa de aplicación
Aquí es donde una empresa del tamaño de MercadoFresco tiene un problema real, porque estos ataques no necesitan volumen.
| Técnica | Cómo funciona | Por qué duele |
|---|---|---|
| Inundación HTTP GET | Miles de peticiones por segundo a páginas normales | Cada petición consume CPU y una conexión |
| Inundación HTTP POST | Peticiones que fuerzan escritura o procesamiento | Aún más caras que las GET |
| Slowloris | Abre muchas conexiones y envía las cabeceras muy despacio, sin cerrarlas | Agota las conexiones del servidor con muy poco tráfico |
| Ataque a la búsqueda | Consultas complejas y sin caché contra el buscador | Una petición puede costar segundos de base de datos |
| Relleno de credenciales | Prueba pares usuario/contraseña filtrados contra /login |
Además de carga, busca acceso |
| Abuso del carrito | Añade y elimina productos, reservando stock | Consume base de datos y bloquea inventario |
El caso concreto que más preocupa a Marta: la búsqueda de productos. Una petición a
/buscar?q=tomate&filtros=ecologico,granel&orden=precio no se sirve desde caché, ejecuta una consulta
compleja contra mercadofresco-pedidos y tarda unos 200 ms. Cincuenta peticiones por segundo desde
cincuenta direcciones distintas —un volumen ridículo, indistinguible del tráfico normal en un
gráfico de ancho de banda— pueden saturar la base de datos sin que ninguna alarma de red se inmute.
Ese es el motivo de que Shield solo no baste y de que exista la lección 04-05.
El daño económico: cuando el escalado juega en tu contra
Este apartado merece un cálculo, porque es el argumento que hace que la dirección de una empresa entienda el problema.
Supongamos un ataque de capa 7 sostenido durante 6 horas contra MercadoFresco, con 5.000 peticiones por segundo llegando al ALB:
| Efecto | Detalle | Coste |
|---|---|---|
| El ASG escala al máximo | De 2 a 20 instancias t3.medium durante 6 h |
18 × 0,0456 × 6 ≈ 4,92 USD |
| Transferencia de salida | Si el ataque pide contenido no cacheado, 500 GB | 500 × 0,085 ≈ 42,50 USD |
| Unidades de capacidad del ALB | Miles de conexiones nuevas por segundo | Decenas de USD |
| Peticiones a CloudFront | 108 millones de peticiones en 6 h | 108 × 0,0075 ≈ 0,81 USD |
| Lecturas de RDS | Puede requerir escalar la instancia | Variable |
| Ventas perdidas | 6 h de viernes × 900 pedidos/h × margen | Lo más caro, con diferencia |
El coste de infraestructura de un ataque así en MercadoFresco es de decenas o pocos cientos de dólares: molesto, no catastrófico. El daño real son las ventas perdidas y la confianza. Este cálculo es importante porque es el que evita la decisión emocional de contratar Shield Advanced a 3.000 USD al mes para protegerse de un riesgo de 200 USD.
En arquitecturas mayores el cálculo cambia radicalmente, y por eso existe la protección de costes que veremos en dos apartados.
AWS Shield Standard: lo que ya tienes
Shield Standard está activo, es gratuito y no hay que hacer nada para tenerlo. Se aplica automáticamente a todos los clientes de AWS.
Qué incluye:
- Detección y mitigación automáticas de los ataques volumétricos y de estado de conexión más comunes de capas 3 y 4, en tiempo real y de forma continua.
- Mitigación en línea, sin desviar el tráfico ni introducir latencia perceptible.
- Protección integrada en CloudFront, Route 53, Global Accelerator y Elastic Load Balancing, que son precisamente los servicios donde vive el borde de MercadoFresco.
- Defensas de red aplicadas en la infraestructura de AWS: filtrado de paquetes malformados, límites por origen, protección frente a inundaciones SYN.
Lo importante es dónde actúa:
flowchart LR
A["Trafico de internet<br/>legitimo + ataque"] --> B["Red de AWS<br/>Shield Standard"]
B -->|"paquetes malformados,<br/>inundaciones L3/L4"| X["Descartado en el borde"]
B -->|"trafico limpio"| C["CloudFront<br/>E2QWERTY123ABC"]
C --> D["ALB<br/>alb-mercadofresco-tienda"]
D --> E["ASG<br/>asg-mercadofresco-tienda"]
E --> F["RDS<br/>mercadofresco-pedidos"]
El filtrado ocurre antes de CloudFront, es decir, antes de que el tráfico llegue a nada tuyo y antes de que genere coste. Lo que Shield Standard no hace es distinguir una petición HTTP legítima de otra maliciosa: eso es capa 7 y es trabajo de WAF.
Verificación práctica: como MercadoFresco ya sirve todo su tráfico a través de CloudFront (03-04) y resuelve el DNS con Route 53 (03-05), ya está usando Shield Standard en su forma más efectiva sin haberlo decidido conscientemente. Esa es una de las razones no evidentes de poner una CDN delante, incluso cuando el ahorro de transferencia no fuera el argumento principal.
AWS Shield Advanced: qué añade
| Función | Standard | Advanced |
|---|---|---|
| Mitigación L3/L4 automática | Sí | Sí, más agresiva |
| Protecciones de capa 7 automáticas | No | Sí, crea reglas de WAF solas |
| Detección específica por recurso | No | Sí, aprende tu patrón de tráfico normal |
| Métricas y diagnóstico del ataque | No | Sí, AWS/DDoSProtection |
| Protección de costes | No | Sí, créditos por el escalado durante el ataque |
| Equipo de respuesta (SRT) | No | Sí, 24/7 |
| WAF incluido sin coste adicional | No | Sí, en los recursos protegidos |
| Firewall Manager entre cuentas | Pago aparte | Incluido |
| Panel global de eventos | No | Sí |
| Coste | 0 USD | 3.000 USD/mes + transferencia |
Las tres funciones que de verdad justifican el precio:
1. Detección específica por recurso. Shield Advanced establece una línea base del tráfico normal de tu aplicación —no de la media de AWS— y detecta desviaciones. Puede identificar un ataque de 200 Mbps contra un recurso que normalmente recibe 20 Mbps, un volumen que en términos absolutos no llamaría la atención de nadie.
2. Protecciones automáticas de capa de aplicación. Con esto activado, Shield Advanced escribe y aplica reglas de WAF por su cuenta durante un ataque, basándose en el patrón detectado, y las retira cuando pasa. Es la única forma de responder a un ataque de capa 7 en segundos y de madrugada sin que haya nadie despierto.
3. Protección de costes, que merece su propio apartado.
Protección de costes frente al escalado
Es la función menos conocida y la que más veces ha justificado la contratación.
Durante un ataque, tu infraestructura elástica reacciona: el ASG arranca instancias, CloudFront sirve peticiones, el ALB procesa conexiones, la transferencia de salida se dispara. Todo eso se factura.
Shield Advanced ofrece créditos de servicio por los cargos atribuibles a un ataque verificado en los recursos protegidos:
| Servicio | Qué se cubre |
|---|---|
| CloudFront | Transferencia de salida y peticiones del ataque |
| Route 53 | Consultas del ataque |
| ELB | Unidades de capacidad consumidas |
| EC2 | Instancias arrancadas por el escalado durante el ataque |
| Global Accelerator | Transferencia |
Cómo funciona en la práctica: se abre un caso de soporte durante o después del ataque, AWS verifica que hubo un evento de DDoS en ese recurso y en esa ventana, y aplica un crédito en la factura. No es automático: hay que solicitarlo.
Para una empresa cuya factura durante un ataque puede pasar de 5.000 a 80.000 dólares en una noche, esta función sola paga el servicio. Para MercadoFresco, cuyo ataque más caro imaginable cuesta unos 200 dólares, no.
El equipo de respuesta ante incidentes (SRT)
El Shield Response Team es un equipo de ingenieros de AWS especializados en DDoS, disponible 24/7 para clientes de Shield Advanced con plan de soporte Business o Enterprise.
Qué hace:
- Durante un ataque: investiga contigo, escribe mitigaciones a medida, aplica reglas de WAF en tus Web ACL si le has dado permiso.
- Proactivamente: si le autorizas, puede intervenir sin esperar a que llames, en cuanto sus alarmas se disparen. Esto es lo que se conoce como proactive engagement y hay que activarlo y configurar los contactos.
- Antes: revisa tu arquitectura y recomienda cambios.
La parte a valorar es que darle acceso a tus Web ACL significa autorizar a un tercero a modificar tus reglas de filtrado en producción sin tu intervención previa. Para muchas organizaciones eso es exactamente lo que quieren a las cuatro de la mañana; para otras es un problema de gobierno que hay que documentar.
Coste real y evaluación honesta para MercadoFresco
| Concepto | Precio |
|---|---|
| Shield Standard | 0 USD |
| Shield Advanced | 3.000 USD al mes, con compromiso de 12 meses |
| Transferencia de datos de recursos protegidos | Tarifa adicional por GB (CloudFront, ELB, EC2) |
| Requisito para el SRT proactivo | Soporte Business (mínimo 100 USD/mes) o Enterprise |
| WAF en recursos protegidos | Incluido |
Son 36.000 USD al año, más transferencia, más soporte. El compromiso anual significa que no se puede contratar «solo mientras dure el susto».
Hagamos la evaluación honesta para MercadoFresco:
| Factor | Situación de MercadoFresco | ¿Empuja hacia Advanced? |
|---|---|---|
| Facturación anual | Pyme española, un solo país | No |
| Coste de un ataque de 6 h | ~200 USD de infraestructura + ventas perdidas | No |
| Superficie expuesta | Todo detrás de CloudFront, orígenes privados | No |
| Perfil de objetivo | Tienda de alimentación, sin perfil político | No |
| Requisito contractual o normativo | Ninguno | No |
| Equipo de guardia 24/7 | No existe | Sí, un poco |
| Datos regulados | Datos personales, pero DDoS no los expone | Neutro |
Conclusión: MercadoFresco no debe contratar Shield Advanced hoy. El coste equivale aproximadamente a toda su factura de AWS multiplicada por varias veces, para protegerse de un riesgo cuyo impacto directo es de dos órdenes de magnitud menor.
Lo que sí debe hacer, y es el resto de la lección:
- Aprovechar al máximo Shield Standard, que ya tiene, sirviendo todo por CloudFront.
- Diseñar la arquitectura para absorber, no para resistir.
- Montar WAF con reglas por tasa (04-05), que cuesta unos pocos dólares al mes y cubre el 90 % de lo que le preocupa.
- Tener alarmas y un plan escrito.
Y cuándo sí tendría sentido reconsiderarlo:
- Si MercadoFresco creciera hasta facturar millones y una hora de caída costara decenas de miles.
- Si recibiera un ataque de extorsión con amenaza de repetición.
- Si un cliente corporativo o una normativa lo exigiera contractualmente.
- Si operara en un sector con perfil de objetivo alto (banca, juego, medios, sector público).
Es una decisión de negocio con números, no una decisión técnica. Y saber argumentar el «no» con datos es tan valioso como saber configurar el «sí».
Arquitectura resiliente: la primera línea de defensa
Antes que cualquier servicio de protección, la mejor defensa contra DDoS es una arquitectura que absorbe. Estos son los cuatro principios, y MercadoFresco cumple ya casi todos:
flowchart TD
subgraph L1["Capa 1: el borde absorbe"]
A["Route 53<br/>Shield Standard"] --> B["CloudFront E2QWERTY123ABC<br/>~700 puntos de presencia<br/>Shield Standard + cache"]
end
subgraph L2["Capa 2: filtrado inteligente"]
B --> C["AWS WAF<br/>reglas gestionadas + por tasa<br/>Se ve en 04-05"]
end
subgraph L3["Capa 3: superficie minima"]
C --> D["ALB alb-mercadofresco-tienda<br/>sg-mercadofresco-alb: solo 443"]
D --> E["ASG asg-mercadofresco-tienda<br/>subredes privadas app-a/-b<br/>sg solo acepta el ALB"]
end
subgraph L4["Capa 4: datos aislados"]
E --> F["RDS mercadofresco-pedidos<br/>subredes datos-a/-b<br/>sin salida a internet"]
B -.->|"OAC oac-mercadofresco-catalogo"| G["S3 mercadofresco-catalogo-fotos<br/>bloqueo de acceso publico"]
end
Lo que hace fuerte a esta arquitectura no es ningún producto de seguridad, sino cuatro decisiones tomadas en los módulos 2 y 3:
| Principio | Cómo lo cumple MercadoFresco | Lección |
|---|---|---|
| Servir desde el borde | Todo el tráfico entra por CloudFront | 03-04 |
| Reducir la superficie | S3 cerrado con OAC, instancias en subredes privadas, RDS sin salida | 03-01, 03-04 |
| Sobredimensionar y autoescalar | ASG de 2 a 20 instancias en dos AZ | 02-01 |
| Cachear agresivamente | Fotos y páginas de catálogo en caché de CloudFront | 03-04 |
Reducir la superficie expuesta
La regla es simple: lo que no está expuesto no se puede atacar. Revisión de la superficie de MercadoFresco:
| Recurso | ¿Expuesto? | Comentario |
|---|---|---|
CloudFront E2QWERTY123ABC |
Sí, a propósito | Es el punto de entrada; está diseñado para absorber |
alb-mercadofresco-tienda |
Sí, con DNS público | Mejorable: ver más abajo |
| Instancias del ASG | No | Subredes privadas, sin IP pública |
mercadofresco-pedidos |
No | Subredes de datos, sin ruta a internet |
mercadofresco-catalogo-fotos |
No directamente | Cerrado con OAC desde 03-04 |
| Punto de enlace de la API | Sí, vía CloudFront | Protegido por WAF en 04-05 |
La única mejora pendiente es la segunda fila. Aunque el DNS público apunte a CloudFront, el ALB sigue teniendo un nombre DNS público resoluble, y un atacante que lo descubra puede saltarse CloudFront y golpearlo directamente, evitando la caché y el WAF. La mitigación estándar tiene dos partes:
- Que CloudFront añada una cabecera secreta a cada petición hacia el origen.
- Que el ALB rechace cualquier petición que no la lleve, mediante una regla del listener.
# 1. CloudFront envía una cabecera personalizada al origen 'origen-tienda-alb'
# (se configura en la definición del origen de la distribución)
# X-Origen-Verificado: <valor aleatorio guardado en Secrets Manager>
# 2. El listener del ALB solo permite pasar las que la llevan
aws elbv2 create-rule \
--listener-arn arn:aws:elasticloadbalancing:eu-west-1:111122223333:listener/app/alb-mercadofresco-tienda/50dc6c495c0c9188/abc \
--priority 1 \
--conditions '[{"Field":"http-header",
"HttpHeaderConfig":{"HttpHeaderName":"X-Origen-Verificado",
"Values":["valor-ficticio-rotable"]}}]' \
--actions '[{"Type":"forward","TargetGroupArn":"arn:aws:elasticloadbalancing:eu-west-1:111122223333:targetgroup/tg-mercadofresco-tienda/abc123"}]' \
--profile mercadofresco-dev
# 3. La regla por defecto del listener devuelve 403
aws elbv2 modify-listener \
--listener-arn arn:aws:elasticloadbalancing:eu-west-1:111122223333:listener/app/alb-mercadofresco-tienda/50dc6c495c0c9188/abc \
--default-actions '[{"Type":"fixed-response",
"FixedResponseConfig":{"StatusCode":"403",
"ContentType":"text/plain",
"MessageBody":"Acceso directo no permitido"}}]' \
--profile mercadofresco-devEse valor de cabecera es exactamente el tipo de secreto rotable que va a Secrets Manager, como
vimos en 04-03. Y para completar el cierre se pueden restringir las reglas de entrada de
sg-mercadofresco-alb a los rangos de IP publicados de CloudFront, usando la lista gestionada de
prefijos com.amazonaws.global.cloudfront.origin-facing:
aws ec2 describe-managed-prefix-lists \
--filters "Name=prefix-list-name,Values=com.amazonaws.global.cloudfront.origin-facing" \
--query 'PrefixLists[0].PrefixListId' --output text --profile mercadofresco-devCon esas dos medidas, el ALB deja de ser un objetivo alcanzable y todo el tráfico está obligado a pasar por el borde, que es donde vive la protección.
Cachear agresivamente y sobredimensionar
Cachear. Una petición servida desde la caché de CloudFront no llega a tu infraestructura, no consume CPU, no toca la base de datos y no cuenta para el escalado. Con la tasa de aciertos que medimos en 03-04, la inmensa mayoría del tráfico del catálogo se queda en el borde. Recomendaciones específicas frente a DDoS:
- Cachear también las respuestas de error (404, 403) durante unos segundos. Un ataque que pide rutas inexistentes es, si no, un ataque que llega íntegro al origen.
- Definir un TTL mínimo razonable para que un atacante no pueda invalidar la caché añadiendo parámetros de consulta aleatorios: la clave de caché debe incluir solo los parámetros que de verdad cambian la respuesta, como configuramos con las políticas de caché.
- Servir una página de mantenimiento estática desde S3 como destino de conmutación por error de Route 53, ya preparada en 03-05: si todo falla, los clientes ven algo.
Sobredimensionar. Absorber es más barato que caer:
- Que la capacidad mínima del ASG sea más de lo estrictamente necesario. MercadoFresco tiene 2 instancias para 900 pedidos/hora cuando una sirve 600.
- Que el escalado reaccione rápido: un periodo de calentamiento corto y umbrales bajos.
- Que el máximo tenga un techo consciente. Este punto es contraintuitivo pero importante: un ASG con máximo 100 durante un ataque es una factura. Un máximo de 20 significa que el servicio se degrada, pero de forma acotada y previsible. Elige el número deliberadamente, no lo dejes por defecto.
- Usar tipos de instancia con rendimiento de red garantizado si el tráfico es alto: las familias con crédito de red pueden verse limitadas justo cuando más falta hacen.
Métricas y detección
Con Shield Advanced se dispone del espacio de nombres AWS/DDoSProtection en CloudWatch:
| Métrica | Qué mide |
|---|---|
DDoSDetected |
1 si hay un ataque en curso contra el recurso, 0 si no |
DDoSAttackBitsPerSecond |
Volumen del ataque en bits por segundo (L3/L4) |
DDoSAttackPacketsPerSecond |
Paquetes por segundo |
DDoSAttackRequestsPerSecond |
Peticiones por segundo (capa 7) |
Sin Shield Advanced —el caso de MercadoFresco— esas métricas no existen y hay que detectar por señales indirectas. Estas son las que Marta vigila:
| Métrica | Servicio | Señal de alarma |
|---|---|---|
RequestCount |
ALB | Subida súbita de 5× sobre la media horaria |
TargetResponseTime |
ALB | Sube mientras RequestCount sube |
HTTPCode_ELB_5XX_Count |
ALB | Errores del propio balanceador: saturación |
HTTPCode_Target_5XX_Count |
ALB | Los destinos no dan abasto |
ActiveConnectionCount |
ALB | Muchas conexiones con pocas peticiones: slowloris |
NewConnectionCount |
ALB | Tasa de conexiones nuevas anómala |
CPUUtilization |
ASG | Al 100 % en todas las instancias a la vez |
GroupInServiceInstances |
ASG | Escalado al máximo fuera de las horas habituales |
DatabaseConnections |
RDS | Cerca del límite del grupo de parámetros |
Requests y 4xxErrorRate |
CloudFront | Pico con baja tasa de aciertos de caché |
CacheHitRate |
CloudFront | Caída brusca: alguien esquiva la caché |
Esa última fila es especialmente reveladora. Un pico legítimo de tráfico mantiene o mejora la tasa
de aciertos, porque mucha gente pide las mismas páginas populares. Un ataque diseñado para hacer daño
pide rutas aleatorias o con parámetros únicos, y hunde la tasa de aciertos. Un gráfico de
CacheHitRate cayendo mientras Requests sube es una de las señales más limpias que existen.
Alarmas hacia alertas-mercadofresco
Estas son las alarmas que MercadoFresco monta hoy, sin Shield Advanced. CloudWatch se ve a fondo en 05-01; aquí basta con la mecánica:
# 1. Pico anómalo de peticiones en el ALB
aws cloudwatch put-metric-alarm \
--alarm-name mercadofresco-alb-peticiones-anomalas \
--alarm-description "Posible ataque: peticiones muy por encima de lo normal" \
--namespace AWS/ApplicationELB \
--metric-name RequestCount \
--dimensions Name=LoadBalancer,Value=app/alb-mercadofresco-tienda/50dc6c495c0c9188 \
--statistic Sum --period 60 --evaluation-periods 3 \
--threshold 60000 --comparison-operator GreaterThanThreshold \
--alarm-actions arn:aws:sns:eu-west-1:111122223333:alertas-mercadofresco \
--treat-missing-data notBreaching \
--profile mercadofresco-dev
# 2. Caída de la tasa de aciertos de caché: alguien esquiva CloudFront
# (métrica de CloudFront: siempre en us-east-1)
aws cloudwatch put-metric-alarm \
--alarm-name mercadofresco-cdn-aciertos-bajos \
--alarm-description "La tasa de aciertos cae: posible ataque con rutas aleatorias" \
--namespace AWS/CloudFront --metric-name CacheHitRate \
--dimensions Name=DistributionId,Value=E2QWERTY123ABC Name=Region,Value=Global \
--statistic Average --period 300 --evaluation-periods 2 \
--threshold 50 --comparison-operator LessThanThreshold \
--alarm-actions arn:aws:sns:eu-west-1:111122223333:alertas-mercadofresco \
--region us-east-1 --profile mercadofresco-dev
# 3. Escalado al máximo: la señal de que algo va muy mal (o muy bien)
aws cloudwatch put-metric-alarm \
--alarm-name mercadofresco-asg-al-maximo \
--alarm-description "El ASG ha llegado a 18 instancias o mas" \
--namespace AWS/AutoScaling --metric-name GroupInServiceInstances \
--dimensions Name=AutoScalingGroupName,Value=asg-mercadofresco-tienda \
--statistic Maximum --period 300 --evaluation-periods 1 \
--threshold 18 --comparison-operator GreaterThanOrEqualToThreshold \
--alarm-actions arn:aws:sns:eu-west-1:111122223333:alertas-mercadofresco \
--profile mercadofresco-devDos detalles de campo:
- La alarma 2 se crea en
us-east-1, porque CloudFront publica siempre sus métricas ahí, exactamente igual que ocurría con los certificados de ACM en 03-04. --treat-missing-data notBreachingevita alarmas falsas de madrugada cuando no hay tráfico.
Y una alarma que no es de seguridad pero salva la factura: el presupuesto con avisos que creamos en 01-02. Si el gasto diario se dispara, alguien se entera aunque nadie esté mirando los paneles.
Plan de respuesta: qué mira Marta primero
Un plan de respuesta sirve para no tener que pensar a las tres de la madrugada. Este es el de MercadoFresco, en orden:
flowchart TD
A["Alarma en alertas-mercadofresco"] --> B["1. Confirmar: el sitio,<br/>desde fuera, funciona?"]
B --> C["2. Panel: RequestCount,<br/>CacheHitRate, 5XX, CPU"]
C --> D{"3. Ataque o<br/>pico legitimo?"}
D -->|"Pico legitimo"| E["Subir el maximo del ASG,<br/>avisar a negocio, disfrutar"]
D -->|"Ataque"| F["4. Que capa?<br/>Volumen alto = L3/L4<br/>Volumen normal = L7"]
F -->|"L3/L4"| G["Shield Standard ya actua.<br/>Verificar CloudFront y esperar"]
F -->|"L7"| H["5. Identificar el patron:<br/>rutas, paises, agentes de usuario"]
H --> I["6. Aplicar reglas de WAF<br/>en modo Block (04-05)"]
I --> J["7. Monitorizar el efecto"]
J --> K["8. Retirar las reglas<br/>temporales al terminar"]
K --> L["9. Post-mortem escrito"]
Paso 1: confirmar desde fuera. Antes de nada, comprobar que el problema es real y no un fallo de monitorización:
curl -sS -o /dev/null -w "%{http_code} %{time_total}s\n" https://mercadofresco.example/salud
dig +short mercadofresco.examplePaso 2: los cuatro gráficos. RequestCount del ALB, CacheHitRate de CloudFront,
HTTPCode_Target_5XX_Count y CPUUtilization del ASG. Con esos cuatro se sabe casi siempre qué
está pasando.
Paso 5: identificar el patrón. Los registros de acceso que guardamos en mercadofresco-registros-web
desde 03-03 son la fuente:
aws s3 sync s3://mercadofresco-registros-web/alb/2026/08/02/ /tmp/registros/ \
--profile mercadofresco-dev
# Las 20 IP con más peticiones
zcat /tmp/registros/*.gz | awk '{print $4}' | cut -d: -f1 | sort | uniq -c | sort -rn | head -20
# Las rutas más pedidas
zcat /tmp/registros/*.gz | awk '{print $13}' | sort | uniq -c | sort -rn | head -20
# Los agentes de usuario más frecuentes
zcat /tmp/registros/*.gz | awk -F'"' '{print $6}' | sort | uniq -c | sort -rn | head -10Ese análisis produce las tres respuestas que necesitas para escribir una regla de WAF: desde dónde viene, qué pide y con qué se identifica.
Distinguir un ataque de un viernes muy bueno
Esta es la parte difícil, y la que separa una respuesta profesional de un apagón autoinfligido. MercadoFresco tiene picos de tráfico legítimos y previsibles los viernes por la tarde. Bloquear tráfico real un viernes a las 19:00 es peor que el ataque.
| Señal | Pico legítimo | Ataque |
|---|---|---|
| Momento | Viernes tarde, campañas, festivos | Cualquiera, típicamente de madrugada |
| Curva | Sube en minutos u horas | Sube en segundos, verticalmente |
| Tasa de aciertos de caché | Se mantiene o mejora | Se hunde |
| Distribución geográfica | España, algo de Portugal | Países sin clientes, muy repartido |
| Rutas pedidas | Portada, categorías, fichas populares | Rutas raras, aleatorias, siempre la misma cara |
| Conversión a pedido | Normal, ~2 % | Cerca de cero |
| Agentes de usuario | Navegadores reales, variados | Pocos valores repetidos o ausentes |
| Referente | Buscadores, redes, directo | Vacío o falsificado |
| Ratio peticiones/sesión | 10-30 páginas | Miles desde la misma IP |
| Efecto en la base de datos | Sube proporcionalmente | Se dispara sin pedidos que lo justifiquen |
La señal más fiable de todas es la conversión. Si llegan 5.000 peticiones por segundo y el número
de pedidos por hora sigue en 900, no son clientes. Un pico legítimo mueve las dos métricas a la vez;
un ataque solo mueve una. Marta tiene esa métrica de negocio publicada en el espacio de nombres
MercadoFresco/Tienda gracias al permiso cloudwatch:PutMetricData que concedimos en 04-01, y es la
que mira antes de decidir bloquear nada.
Y la regla de oro operativa:
Ante la duda, empieza contando, no bloqueando. El modo
Countde WAF permite ver a quién afectaría una regla antes de aplicarla. Es el tema central de 04-05 y el error más caro de esta disciplina es saltárselo.
Qué hacer en caliente y qué documentar después
Medidas en caliente, de menos a más intrusivas:
| Medida | Impacto en clientes | Cuándo |
|---|---|---|
| Subir el máximo del ASG | Ninguno; coste | Siempre que la carga sea absorbible |
| Aumentar los TTL de caché | Contenido algo más viejo | Inmediato, muy efectivo |
Regla de WAF en Count sobre el patrón |
Ninguno | Siempre primero |
Regla por tasa en Block |
Bloquea a quien supera el umbral | Si el patrón está claro |
| Bloqueo por geolocalización | Bloquea países enteros | Si no tienes clientes ahí |
CAPTCHA o Challenge en rutas caras |
Fricción para humanos | Alternativa a bloquear |
| Página de mantenimiento estática | Servicio degradado | Último recurso |
Nunca: apagar CloudFront o desviar el DNS al origen. Eso elimina la única capa que te está protegiendo y convierte un incidente en una caída total.
Post-mortem. Cuando pasa, se escribe. Sin culpables y con datos:
- Cronología con horas exactas: primer indicio, primera alarma, primera acción, mitigación, recuperación.
- Caracterización: volumen máximo, número de fuentes, países, rutas objetivo, capa.
- Impacto: minutos de degradación, pedidos perdidos estimados, coste de infraestructura extra.
- Qué funcionó y qué no: ¿saltó la alarma correcta?, ¿a tiempo?, ¿había alguien?
- Acciones concretas con responsable y fecha: reglas de WAF que se quedan permanentes, alarmas nuevas, umbrales ajustados.
- Solicitud de créditos si se tuviera Shield Advanced.
El punto 5 es el que convierte un incidente en una mejora. Un post-mortem sin acciones con fecha es un texto que nadie volverá a leer.
Coste, limpieza y lo que viene
| Concepto | Coste para MercadoFresco |
|---|---|
| Shield Standard | 0 USD — ya activo |
| Shield Advanced | 3.000 USD/mes — no contratado, decisión razonada |
| Alarmas de CloudWatch | 3 × 0,10 USD = 0,30 USD/mes |
| Almacenamiento de registros del ALB en S3 | Ya contabilizado en 03-03 |
| Regla del listener del ALB | Sin coste adicional |
| Total de esta lección | 0,30 USD/mes |
Si hubieras activado Shield Advanced para probar, ten muy presente que el compromiso es de 12
meses: no se cancela sin más. Se gestiona desde la consola de Shield o con
aws shield disassociate-drt-role y el proceso de baja de suscripción, que requiere abrir un caso de
soporte.
Para deshacer lo creado en esta lección:
aws cloudwatch delete-alarms \
--alarm-names mercadofresco-alb-peticiones-anomalas mercadofresco-asg-al-maximo \
--profile mercadofresco-dev
aws cloudwatch delete-alarms --alarm-names mercadofresco-cdn-aciertos-bajos \
--region us-east-1 --profile mercadofresco-devLa regla del listener con la cabecera verificada no se borra: es una mejora permanente de la postura de seguridad y debe quedarse.
Errores Comunes y Consejos
Creer que Shield Standard hay que activarlo. Ya está activo, en todas las cuentas, gratis. Lo que sí es una decisión tuya es aprovecharlo, sirviendo el tráfico por CloudFront y Route 53 en lugar de exponer el origen directamente.
Pensar que Shield protege de todo. Shield es capas 3 y 4. Los ataques de capa 7 —los que de verdad amenazan a una tienda— los filtra WAF. Contratar Shield Advanced y no configurar WAF es gastar 3.000 dólares y seguir expuesto a lo que más probablemente te pase.
Dejar el ALB accesible directamente. Si el nombre DNS del balanceador es resoluble y acepta tráfico de cualquier origen, un atacante puede saltarse CloudFront, la caché y el WAF de un salto. La cabecera verificada más la lista de prefijos de CloudFront cierran esa puerta.
Dejar el máximo del ASG en un número muy alto «por si acaso». Durante un ataque escalarás sin límite y el resultado será una factura, no un servicio disponible. Pon un techo consciente.
Bloquear por IP durante un ataque distribuido. Es agotador, inútil y acabas bloqueando clientes reales que comparten NAT corporativa. Bloquea por patrón de comportamiento, no por origen.
Bloquear sin haber contado primero. El error más caro. Una regla en Block mal calibrada un
viernes a las 19:00 hace más daño que el ataque. Count primero, siempre.
Confundir un pico legítimo con un ataque. Mira la conversión a pedido y la tasa de aciertos de caché antes que ninguna otra cosa. Si los pedidos suben con el tráfico, es negocio, no ataque.
Apagar CloudFront «para ver si es cosa suya». Elimina la protección y expone el origen. Nunca.
Consejo: ensaya el plan. Un simulacro trimestral de media hora —«suena la alarma, ¿qué haces?»—
vale más que un documento perfecto que nadie ha leído. Y comprueba que los avisos de
alertas-mercadofresco llegan de verdad a un teléfono, no solo a un correo que nadie mira de noche.
Consejo: guarda una línea base. Ten a mano el tráfico normal por hora y día de la semana. Sin línea base no se puede decir si 5.000 peticiones por segundo es mucho.
Consejo: separa las rutas caras. Búsqueda, /login y /api/pedidos en grupos de destino
distintos —tg-mercadofresco-api ya existe desde 03-03— permite protegerlas con reglas específicas y
que su saturación no arrastre al resto del catálogo.
Ejercicios
Ejercicio 1: decidir sobre Shield Advanced con números
Una empresa de venta de entradas para conciertos, con arquitectura idéntica a la de MercadoFresco, factura 40 millones de euros al año concentrados en las horas siguientes a cada puesta a la venta. Una hora de caída durante una puesta a la venta cuesta unos 350.000 euros. El año pasado sufrió dos ataques de capa 7 que degradaron el servicio 40 minutos cada uno, y recibió un correo de extorsión amenazando con repetir. No tiene equipo de guardia nocturna.
Evalúa si debe contratar Shield Advanced. Estructura la respuesta en: coste anual del servicio, pérdida esperada sin él, funciones concretas que aportan valor en este caso, requisitos adicionales que hay que presupuestar, y decisión con justificación.
Ejercicio 2: caracterizar un incidente
Un martes a las 04:12 saltan las alarmas de MercadoFresco. Los datos de los primeros diez minutos:
RequestCountdel ALB: de 200/min a 45.000/min en 30 segundos.CacheHitRatede CloudFront: de 89 % a 11 %.CPUUtilizationdel ASG: 97 % en las 2 instancias; el ASG escala a 12.DatabaseConnectionsde RDS: de 25 a 190 (el límite es 200).- Métrica
MercadoFresco/Tienda/PedidosPorHora: 3 (lo normal a esa hora es 5-10). - Registros del ALB: 8.400 IP distintas, 61 países, el 78 % pide
/buscar?q=<cadena aleatoria>&pagina=<numero aleatorio>. - Agente de usuario: el 91 % declara
Mozilla/5.0 (compatible; Baiduspider/2.0).
Responde: (a) ¿ataque o pico legítimo, y con qué tres señales lo justificas?; (b) ¿qué capa y qué técnica?; (c) ¿por qué es especialmente eficaz contra esta arquitectura?; (d) ¿qué tres medidas aplicarías, en orden, y cuál es el riesgo de cada una?; (e) ¿qué habría hecho Shield Advanced que no se puede hacer sin él?
Ejercicio 3: cerrar el acceso directo al origen
Escribe el procedimiento completo, con comandos, para impedir que alguien pueda golpear
alb-mercadofresco-tienda saltándose CloudFront. Debe cubrir: dónde se guarda el valor secreto, cómo
lo envía CloudFront, cómo lo verifica el ALB, qué pasa con las peticiones que no lo llevan, cómo se
refuerza además con grupos de seguridad, y cómo se rota el valor sin causar corte de servicio.
Soluciones
Solución 1
Coste anual del servicio:
| Concepto | Importe |
|---|---|
| Shield Advanced (3.000 USD × 12, compromiso anual) | 36.000 USD |
| Soporte Business (necesario para el SRT proactivo) | desde 1.200 USD |
| Transferencia de datos de recursos protegidos | Variable, algunos miles |
| Total aproximado | ~40.000 USD/año |
Pérdida esperada sin él: dos incidentes de 40 minutos el año pasado × 350.000 €/hora × 0,67 h ≈ 470.000 € anuales en pérdida directa, sin contar reputación ni el hecho de que existe una amenaza explícita de repetición, que eleva la probabilidad futura.
Funciones que aportan valor en este caso concreto:
- Protecciones automáticas de capa 7. No hay guardia nocturna y los ataques ocurren en las ventanas de venta, que pueden ser de madrugada. Shield Advanced escribe y aplica reglas solo, en segundos. Es la función decisiva aquí.
- SRT con intervención proactiva. Suple literalmente la ausencia de equipo de guardia.
- Protección de costes. Con esa concentración de tráfico, el escalado durante un ataque puede generar cargos de decenas de miles.
- Detección por recurso. El tráfico de esta empresa es extremadamente picudo por naturaleza; una línea base genérica no distinguiría un ataque de una puesta a la venta. Solo la línea base específica del recurso puede.
Requisitos adicionales a presupuestar: el plan de soporte Business o Enterprise, el trabajo de configurar Web ACL y permisos para el SRT, la definición de contactos de emergencia y un ensayo del procedimiento.
Decisión: contratar, sin dudarlo. 40.000 USD frente a una exposición de 470.000 € anuales es una relación de más de diez a uno, con amenaza explícita de repetición y sin capacidad interna de respuesta nocturna. Es exactamente el perfil para el que existe el producto. Y conviene subrayar el contraste con MercadoFresco: el mismo servicio, la misma arquitectura y la decisión contraria, porque la variable que decide no es técnica sino el coste de un minuto de caída.
Solución 2
(a) Ataque, con tres señales concluyentes:
- La conversión se ha desplomado en términos relativos. 45.000 peticiones por minuto producen 3 pedidos por hora, cuando lo normal a esa hora con 200 peticiones por minuto son 5-10. Si fueran clientes reales, los pedidos habrían subido con el tráfico.
- La tasa de aciertos de caché se hunde de 89 % a 11 %. Un pico legítimo pide contenido popular y la mantiene o la mejora. Aquí se están pidiendo URL únicas a propósito.
- La curva es vertical: de 200 a 45.000 en 30 segundos, y a las 04:12 de un martes, que es el valle absoluto de tráfico de una tienda de alimentación española.
Como confirmación adicional: 8.400 IP en 61 países no corresponden a la geografía de clientes de
MercadoFresco, y un 91 % de agentes de usuario idénticos declarando ser un rastreador chino es una
falsificación evidente —los rastreadores reales se identifican y respetan robots.txt, y ninguno
genera 45.000 peticiones por minuto contra una búsqueda.
(b) Capa 7, inundación HTTP GET dirigida contra el punto de enlace de búsqueda con parámetros aleatorios. El volumen en bits por segundo es modesto; el daño no viene del ancho de banda.
(c) Es especialmente eficaz por tres motivos encadenados que atacan exactamente los puntos fuertes de la arquitectura:
- Anula la caché de CloudFront. Cada
q=<cadena aleatoria>genera una clave de caché distinta, así que el 100 % de las peticiones son fallos de caché y llegan al origen. La CDN, que es la primera línea de defensa, queda neutralizada. - Ataca la ruta más cara. La búsqueda no se cachea, ejecuta una consulta compleja y toca la base de datos en cada petición.
- Satura el recurso que no escala. El ASG escala a 12 instancias, pero cada instancia abre
conexiones a
mercadofresco-pedidos, que tiene un límite de 200. El escalado empeora el problema: más instancias significan más conexiones contra una base de datos que no crece. A 190 de 200 conexiones, el siguiente paso es que la tienda entera deje de poder consultar nada.
(d) Tres medidas, en orden:
- Regla de WAF por tasa sobre
/buscar, enCountdurante 2-3 minutos. Riesgo: ninguno, no bloquea nada; solo cuesta esos minutos. Sirve para confirmar cuántas peticiones legítimas caerían. - Pasar la regla a
Blockcon umbral por IP, y añadir un bloqueo por agente de usuario falsificado. Riesgo: bajo, porque a las 04:12 el tráfico legítimo es mínimo y el patrón está muy caracterizado. Un rastreador legítimo que quedara bloqueado no supone daño real a esa hora. - Aumentar el TTL mínimo de las respuestas de búsqueda y cachear los errores. Riesgo: resultados
de búsqueda ligeramente desactualizados durante unas horas, aceptable. Como cuarta medida, si la
base de datos sigue al límite, derivar las lecturas a
mercadofresco-pedidos-lectura.
Lo que no hay que hacer: bloquear las 8.400 IP una a una —volverán con otras—, ni apagar la búsqueda entera, ni desviar el DNS al origen.
(e) Shield Advanced habría hecho tres cosas imposibles sin él: detectar la anomalía contra la
línea base específica de este recurso y no contra un umbral fijo; aplicar automáticamente reglas
de WAF a las 04:12 sin que Marta se despertara, que es exactamente la ventana en la que ocurrió; y
proporcionar las métricas DDoSDetected y DDoSAttackRequestsPerSecond que caracterizan el ataque
sin tener que descargar y analizar gigabytes de registros a mano. Además, permitiría solicitar
créditos por el coste del escalado a 12 instancias.
Solución 3
Procedimiento completo.
1. Generar y guardar el valor secreto. Va a Secrets Manager (04-03), no a un fichero ni a la consola:
aws secretsmanager create-secret \
--name "mercadofresco/produccion/cdn/cabecera-origen" \
--description "Valor de la cabecera X-Origen-Verificado entre CloudFront y el ALB" \
--kms-key-id alias/mercadofresco-datos \
--secret-string "$(openssl rand -hex 32)" \
--tags Key=Proyecto,Value=mercadofresco Key=Componente,Value=cdn \
--profile mercadofresco-dev2. Que CloudFront la envíe. En la definición del origen origen-tienda-alb de la distribución
E2QWERTY123ABC se añade una cabecera personalizada X-Origen-Verificado con ese valor. Se envía en
cada petición al origen y no es visible para el cliente.
3. Que el ALB la verifique. Regla de prioridad 1 en el listener HTTPS que reenvía al grupo de destino solo si la cabecera coincide:
aws elbv2 create-rule \
--listener-arn <arn-del-listener-443> \
--priority 1 \
--conditions '[{"Field":"http-header",
"HttpHeaderConfig":{"HttpHeaderName":"X-Origen-Verificado",
"Values":["<valor-actual>"]}}]' \
--actions '[{"Type":"forward","TargetGroupArn":"<arn-tg-mercadofresco-tienda>"}]' \
--profile mercadofresco-dev4. Qué pasa con las demás. La acción por defecto del listener pasa a ser una respuesta fija 403, de modo que cualquier petición que no lleve la cabecera —es decir, cualquiera que no venga de CloudFront— se rechaza en el balanceador, sin llegar a las instancias y sin consumir nada:
aws elbv2 modify-listener --listener-arn <arn-del-listener-443> \
--default-actions '[{"Type":"fixed-response",
"FixedResponseConfig":{"StatusCode":"403","ContentType":"text/plain",
"MessageBody":"Acceso directo no permitido"}}]' \
--profile mercadofresco-dev5. Refuerzo con grupos de seguridad. Se restringe la entrada de sg-mercadofresco-alb al puerto
443 desde la lista de prefijos gestionada de CloudFront, en lugar de 0.0.0.0/0:
LISTA=$(aws ec2 describe-managed-prefix-lists \
--filters "Name=prefix-list-name,Values=com.amazonaws.global.cloudfront.origin-facing" \
--query 'PrefixLists[0].PrefixListId' --output text --profile mercadofresco-dev)
aws ec2 authorize-security-group-ingress \
--group-id sg-mercadofresco-alb \
--ip-permissions "IpProtocol=tcp,FromPort=443,ToPort=443,PrefixListIds=[{PrefixListId=$LISTA}]" \
--profile mercadofresco-dev
aws ec2 revoke-security-group-ingress \
--group-id sg-mercadofresco-alb --protocol tcp --port 443 --cidr 0.0.0.0/0 \
--profile mercadofresco-devSon dos capas independientes: aunque alguien averiguara el valor de la cabecera, tendría que además originar el tráfico desde un rango de CloudFront.
6. Rotación sin corte. La clave está en aceptar dos valores simultáneamente durante la
transición, exactamente el mismo principio de AWSCURRENT/AWSPENDING de 04-03:
- Generar el valor nuevo y guardarlo en el secreto como versión
AWSPENDING. - Modificar la regla del ALB para que acepte los dos valores en el array
Values. - Actualizar el origen de CloudFront con el valor nuevo y esperar a que la distribución termine de desplegarse en todos los puntos de presencia (unos minutos).
- Verificar en los registros que ya no llega ninguna petición con el valor antiguo.
- Retirar el valor antiguo de la regla del ALB y promocionar la versión a
AWSCURRENT.
Invertir el orden —cambiar CloudFront antes de que el ALB acepte el valor nuevo— provoca un corte total de servicio durante todo el despliegue de la distribución. Es el error clásico de esta operación, y el motivo por el que se hace un martes por la mañana y no un viernes por la tarde.
Conclusión
Ahora sabes contra qué te proteges. Un ataque de denegación de servicio distribuida no busca robar
nada: busca agotar un recurso finito, y por eso la defensa no es un permiso ni una clave, sino
capacidad, distancia y filtrado. Entiendes por qué la regla DENY numerada 50 de 03-02 funcionó
contra una IP y es inútil contra diez mil: una NACL admite 40 entradas, y filtrar dentro de tu VPC
significa que el paquete ya ha consumido tu ancho de banda. El tráfico malicioso hay que descartarlo
en el borde, lejos.
Distingues las dos familias y sus defensas: los ataques volumétricos de capas 3 y 4 —inundación UDP, reflexión y amplificación, inundación SYN, fragmentación—, que se miden en gigabits y que la red de AWS absorbe; y los ataques de capa 7 —inundación HTTP, slowloris, abuso de la búsqueda, relleno de credenciales—, que llegan con volumen ridículo, parecen tráfico legítimo y son los que de verdad amenazan a una tienda como MercadoFresco. Shield para los primeros, WAF para los segundos.
Sabes que Shield Standard ya está activo y es gratuito, que actúa en CloudFront, Route 53 y ELB, y
que MercadoFresco lleva usándolo desde 03-04 sin haberlo decidido: poner una CDN delante era también
una decisión de seguridad. Y conoces lo que añade Shield Advanced —detección por recurso,
protecciones automáticas de capa 7, métricas DDoSDetected y DDoSAttackBitsPerSecond, protección de
costes frente al escalado y acceso al SRT 24/7— junto con su precio real de 3.000 USD al mes con
compromiso anual. Has hecho la evaluación con números y la respuesta para MercadoFresco es no:
36.000 dólares al año para cubrir un riesgo de infraestructura de doscientos. Y sabes exactamente qué
tendría que cambiar para que la respuesta fuera la contraria, porque el ejercicio de la empresa de
entradas es la misma arquitectura con la decisión opuesta.
Lo que sí has hecho es lo que de verdad protege a una empresa de este tamaño: arquitectura. Servir
todo desde el borde, reducir la superficie cerrando el acceso directo al ALB con una cabecera
verificada guardada en Secrets Manager y la lista de prefijos de CloudFront en sg-mercadofresco-alb,
cachear agresivamente incluidos los errores, y sobredimensionar con un techo consciente en el
ASG para que el escalado no se convierta en la factura del atacante. Has montado tres alarmas hacia
alertas-mercadofresco por 0,30 USD al mes, sabiendo que la de CloudFront va en us-east-1. Y tienes
un plan de respuesta con un orden claro y, sobre todo, la tabla que distingue un ataque de un
viernes muy bueno: la conversión a pedido y la tasa de aciertos de caché antes que cualquier
otra cosa.
Pero el plan termina siempre en el mismo punto. Cuando Marta identifica el patrón —esas rutas, esos
países, ese agente de usuario falsificado, esa tasa de peticiones por IP— necesita una herramienta que
mire dentro de la petición HTTP y decida en función de su contenido, no de su origen. Ni Shield ni
un grupo de seguridad pueden hacerlo: uno trabaja con paquetes y el otro con IP y puertos. En la
lección 04-05, «AWS WAF», cerraremos el módulo con esa herramienta: la Web ACL que se asocia
delante de la distribución E2QWERTY123ABC y del alb-mercadofresco-tienda, los grupos de reglas
gestionadas por AWS, las declaraciones de coincidencia y las transformaciones de texto que impiden las
evasiones triviales, las reglas por tasa para proteger /login y /api/pedidos, y —por encima de
todo— el método de despliegue que evita el desastre: empezar en Count, leer los registros, ajustar
las excepciones y solo entonces pasar a Block.
Curso de AWS
Módulo 1: Introducción a AWS
- ¿Qué es AWS?
- Configuración de tu cuenta de AWS
- Infraestructura global de AWS
- Consola de administración de AWS
- AWS CLI y SDKs
Módulo 2: Servicios principales de AWS
Módulo 3: Redes y entrega de contenido
- Amazon VPC
- Grupos de seguridad y listas de control de acceso
- Elastic Load Balancing
- Amazon CloudFront
- Route 53
Módulo 4: Seguridad e identidad
- AWS Identity and Access Management (IAM)
- AWS Key Management Service (KMS)
- Secrets Manager y Parameter Store
- AWS Shield
- AWS WAF
Módulo 5: Monitorización y gestión
- Amazon CloudWatch
- AWS X-Ray y trazabilidad distribuida
- AWS CloudTrail
- AWS Config
- AWS Trusted Advisor
Módulo 6: Bases de datos
- Cómo elegir la base de datos adecuada
- Amazon DynamoDB
- Amazon Aurora
- Amazon Redshift
- Amazon ElastiCache
Módulo 7: Integración de aplicaciones
- Amazon SQS
- Amazon SNS
- Amazon EventBridge
- AWS Step Functions
- Patrones de integración: idempotencia, reintentos y colas de mensajes fallidos
