top of page

Mejorando la Seguridad de tu API con CloudFront y AWS Managed Prefix Lists

  • hace 3 días
  • 5 Min. de lectura

Introducción

Cuando desplegamos APIs en AWS usando Application Load Balancers (ALB), es común configurar los Security Groups para permitir tráfico HTTP/HTTPS desde cualquier origen (0.0.0.0/0). Si bien esto funciona, viola el principio de mínimo privilegio y expone tu infraestructura a riesgos innecesarios.

En este artículo, te mostraré cómo mejorar la seguridad de tu API utilizando CloudFront como capa de distribución y restringiendo el acceso al ALB únicamente a las IPs de CloudFront mediante AWS Managed Prefix Lists.


Arquitectura Actual (Insegura)

arquitectura-insegura

Nuestra infraestructura inicial incluye:

  • VPC: 10.100.0.0/16 con subnets públicas y privadas en 2 AZs.

  • Application Load Balancer: Internet-facing en subnets públicas.

  • EC2 Instance: En subnet privada ejecutando Nginx.

  • CloudFront: Distribución con dominio personalizado testmauro.sandbox.teratest.net.

  • Route53: DNS apuntando a CloudFront.

  • ACM Certificate: SSL/TLS para el dominio personalizado.


El Problema de Seguridad

Actualmente, el Security Group del ALB tiene la siguiente configuración:


{ 

"IpProtocol": "tcp", 

"FromPort": 80, 

"ToPort": 80, 

"CidrIpv4": "0.0.0.0/0"

}


¿Qué significa esto? 

  • Cualquier persona en internet puede acceder directamente al ALB.

  • Se bypasea CloudFront y sus beneficios (caching, DDoS protection, WAF).

  • No hay control sobre quién accede a tu origen.


Validación del Problema

Prueba 1: Acceso Directo al ALB

Probemos acceder directamente al ALB sin pasar por CloudFront:

curl -s -o /dev/null -w "Status: %{http_code}\n" \  http://demo-sbx-alb-142673723.us-east-1.elb.amazonaws.com

Resultado:

Status: 200

El ALB responde correctamente - Esto es un problema de seguridad.


Prueba 2: Contenido Accesible

Resultado:


<!DOCTYPE html>

<html>

<head>   

<title>Teratest</title>

</head>

<body>   

<h1>Hola desde teratest</h1>

</body>

</html>


El contenido completo es accesible sin restricciones.


Prueba 3: Acceso via CloudFront


Ambas rutas funcionan, pero solo CloudFront debería ser el punto de entrada.


funcionamiento-de-ambas-rutas

Análisis del Security Group


Inspeccionemos las reglas actuales del Security Group del ALB:


aws ec2 describe-security-group-rules \ 

--filters Name=group-id,Values=sg-0482d99e7921588bc \ 

--profile teracloud-sbx --region us-east-1


Reglas actuales:

Tipo

Protocolo

Puerto

Origen

Descripción

Ingress

TCP

80

0.0.0.0/0

⚠️ TODO internet

Egress

All

All

0.0.0.0/0

Salida sin restricción

¿Por qué es esto un problema?


  1. Bypass de CloudFront: Los atacantes pueden descubrir la URL del ALB y acceder directamente.

  2. Sin protección DDoS: CloudFront incluye AWS Shield Standard, pero se bypasea.

  3. Sin WAF: Si configuras AWS WAF en CloudFront, no aplica al tráfico directo.

  4. Sin caching: Cada request golpea directamente tu origen.

  5. Costos mayores: Pagas más por transferencia de datos desde el ALB vs CloudFront.

  6. Violación de compliance: Muchos frameworks de seguridad requieren mínimo privilegio.


Implementación del Hardening

En la siguiente sección, implementaremos las siguientes mejoras:

  1. Identificar el Managed Prefix List de CloudFront para la región.

  2. Remover la regla insegura 0.0.0.0/0 del Security Group.

  3. Agregar regla permitiendo solo el Prefix List de CloudFront.

  4. Validar que el acceso directo al ALB falla.

  5. Confirmar que el acceso via CloudFront sigue funcionando.


Arquitectura Mejorada (Segura)

arquitectura-mejorada

Flujo de tráfico seguro:

Usuario → CloudFront (HTTPS) → ALB (HTTP, solo desde CloudFront IPs) → EC2

Flujo bloqueado:

Usuario → ALB directo ❌ BLOQUEADO


Recursos de la infraestructura

Toda la infraestructura fue creada en la cuenta AWS 208619972546 (región us-east-1):


Próximos pasos

En la siguiente parte de este artículo, implementaremos el hardening de seguridad y validaremos que:

  1. El acceso directo al ALB es bloqueado.

  2. El acceso via CloudFront funciona correctamente.

  3. La configuración cumple con el principio de mínimo privilegio.


Parte 2: Implementación del Hardening


Paso 1: Identificar el Managed Prefix List de CloudFront

AWS proporciona Managed Prefix Lists para los servicios de CloudFront. Primero, necesitamos identificar el ID del prefix list:


aws ec2 describe-managed-prefix-lists \ 

--filters "Name=prefix-list-name,Values=com.amazonaws.global.cloudfront.origin-facing" \ 

--region us-east-1


managed-prefix-lists


Paso 2: Modificar el Security Group

Ahora modificaremos el Security Group del ALB para: 1. Remover la regla insegura que permite 0.0.0.0/0 2. Agregar una nueva regla que solo permita el Prefix List de CloudFront.


Comando para remover la regla insegura:


aws ec2 revoke-security-group-ingress \ 

--group-id sg-0482d99e7921588bc \ 

--ip-permissions IpProtocol=tcp,FromPort=80,ToPort=80,IpRanges='[{CidrIp=0.0.0.0/0}]' \ 

--region us-east-1


Comando para agregar la regla segura:


aws ec2 authorize-security-group-ingress \ 

--group-id sg-0482d99e7921588bc \ 

--ip-permissions IpProtocol=tcp,FromPort=80,ToPort=80,PrefixListIds='[{PrefixListId=<PREFIX_LIST_ID>}]' \ 

--region us-east-1


Paso 3: Validación Post-Hardening


Prueba 1: Acceso directo al ALB (debe fallar)


Resultado esperado:

Status: 000curl: (28) Connection timed out


El acceso directo ahora está bloqueado - ¡Éxito!


acceso-bloqueado


Prueba 2: Acceso via CloudFront (debe funcionar)

curl -s -o /dev/null -w "Status: %{http_code}\n" \ 


Resultado esperado:

Status: 200


CloudFront funciona correctamente - La aplicación sigue accesible por la ruta correcta.

funciona-correctamente

Prueba 3: Verificar contenido


Resultado:


<!DOCTYPE html>

<html>

<head>   

<title>Teratest</title>

</head>

<body>

    <h1>Hola desde teratest</h1>

</body>

</html>


El contenido se sirve correctamente a través de CloudFront.


verificacion-de-contenido

Paso 4: Inspeccionar las nuevas reglas

aws ec2 describe-security-group-rules \ 

--filters Name=group-id,Values=sg-0482d99e7921588bc \ 

--region us-east-1


Reglas actualizadas:

Tipo

Protocolo

Puerto

Origen

Descripción

Ingress

TCP

80

pl-xxxxxx (CloudFront)

Solo CloudFront

Egress

All

All

0.0.0.0/0

Salida sin restricción


Comparación: antes vs después


Antes (inseguro)

flujo-inseguro














Después (seguro)

flujo-seguro

















Beneficios obtenidos


  • Seguridad

    • Principio de mínimo privilegio: Solo CloudFront puede acceder al ALB .

    • Protección DDoS: AWS Shield Standard protege CloudFront.

    • WAF ready: Puedes agregar AWS WAF en CloudFront.

    • Ofuscación del origen: La URL del ALB no es útil para atacantes.


  • Performance

    • Caching global: Contenido servido desde edge locations.

    • Menor latencia: Usuarios acceden desde el edge más cercano.

    • Compresión: CloudFront comprime automáticamente.


  • Costos

    • Menor transferencia desde origen: CloudFront cachea contenido.

    • Free tier: 50GB/mes + 2M requests gratis por 12 meses.

    • Optimización de requests: Menos carga en el ALB y EC2.

  • Operacional

    • Sin mantenimiento de IPs: AWS actualiza el Prefix List automáticamente.

    • Auditable: Todos los cambios en CloudTrail.

    • Compliance: Cumple con frameworks de seguridad (CIS, NIST).


Consideraciones adicionales

1. Custom headers para mayor seguridad

Puedes agregar un header personalizado en CloudFront que el ALB valide:

{ 

"CustomHeaders": {   

"Quantity": 1,   

"Items": [{     

"HeaderName": "X-Custom-Secret",     

"HeaderValue": "tu-secreto-aleatorio"   

}] 

}

}


Luego configura el ALB para rechazar requests sin este header.


2. Monitoreo y alertas

Configura CloudWatch Alarms para detectar:

  • Intentos de acceso directo al ALB (aunque serán bloqueados).

  • Cambios en el Security Group.

  • Distribución de CloudFront deshabilitada.


3. Múltiples orígenes

Si tienes múltiples ALBs o orígenes, todos deben usar el mismo Prefix List de CloudFront.


4. IPv6

El Managed Prefix List de CloudFront incluye tanto IPv4 como IPv6. Asegúrate de que tu VPC y ALB soporten IPv6 si lo necesitas.


Conclusión

Implementar el principio de mínimo privilegio en AWS no tiene que ser complicado. Usando AWS Managed Prefix Lists para CloudFront, podemos:

  1. Restringir el acceso al ALB solo a CloudFront

  2. Eliminar la exposición innecesaria a internet

  3. Mantener la configuración actualizada automáticamente

  4. Mejorar seguridad, performance y costos

Esta configuración es especialmente importante para:

  • APIs públicas.

  • Aplicaciones web con contenido estático.

  • Entornos que requieren compliance (PCI-DSS, HIPAA, SOC2).

  • Arquitecturas multi-región.


Recursos






Mauro Rosales

Cloud Engineer


 
 
bottom of page