Grupos de Seguridad
¿Qué es un Security Group?
Un Security Group (SG) es un firewall virtual que controla el tráfico entrante y saliente de sus instancias EC2. Es la primera línea de defensa para asegurar sus recursos de AWS.
┌─────────────────────────────────────────────────────────────┐
│ SECURITY GROUP │
├─────────────────────────────────────────────────────────────┤
│ │
│ Internet │
│ │ │
│ ▼ │
│ ┌──────────────────────────────────────────────────┐ │
│ │ SECURITY GROUP │ │
│ │ (Pare-feu au niveau instance) │ │
│ │ │ │
│ │ RÈGLES ENTRANTES (Inbound) │ │
│ │ ┌─────────────────────────────────────────┐ │ │
│ │ │ Port 22 (SSH) ← Admin uniquement │ │ │
│ │ │ Port 80 (HTTP) ← Tout le monde │ │ │
│ │ │ Port 443 (HTTPS) ← Tout le monde │ │ │
│ │ └─────────────────────────────────────────┘ │ │
│ │ │ │
│ │ RÈGLES SORTANTES (Outbound) │ │
│ │ ┌─────────────────────────────────────────┐ │ │
│ │ │ Tout le trafic → Autorisé par défaut │ │ │
│ │ └─────────────────────────────────────────┘ │ │
│ │ │ │
│ └──────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌───────────────┐ │
│ │ Instance EC2 │ │
│ └───────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘
Características Clave
1. Stateful (Conserva el estado)
┌─────────────────────────────────────────────────────────────┐
│ STATEFUL │
├─────────────────────────────────────────────────────────────┤
│ │
│ Si una conexión ENTRANTE está permitida, │
│ la respuesta SALIENTE está permitida automáticamente. │
│ │
│ Ejemplo: │
│ ┌─────────┐ ┌─────────────┐ │
│ │ Cliente │ ──── Solicitud HTTP ────► │ EC2 │ │
│ │ │ (Puerto 80) │ (SG) │ │
│ │ │ ◄─── Respuesta ──────── │ │ │
│ └─────────┘ (Automático) └─────────────┘ │
│ │
│ ¡No necesita crear una regla de salida │
│ para la respuesta! │
│ │
└─────────────────────────────────────────────────────────────┘
2. Deny por Defecto (Entrante)
Por defecto:
• INBOUND : Todo está BLOQUEADO ❌
• OUTBOUND : Todo está PERMITIDO ✅
Debe autorizar explícitamente el tráfico entrante.
3. Solo Reglas ALLOW
Security Groups = Solo reglas ALLOW
✅ PUEDE: Permitir SSH desde 10.0.0.0/8
❌ NO PUEDE: Bloquear una IP específica
Para bloquear IPs → Utilice los NACLs (nivel VPC)
Estructura de una Regla
┌─────────────────────────────────────────────────────────────┐
│ STRUCTURE D'UNE RÈGLE │
├─────────────────────────────────────────────────────────────┤
│ │
│ ┌────────────┬───────────┬─────────────┬───────────────┐ │
│ │ Type │ Protocole │ Port │ Source │ │
│ ├────────────┼───────────┼─────────────┼───────────────┤ │
│ │ SSH │ TCP │ 22 │ 203.0.113.0/24│ │
│ │ HTTP │ TCP │ 80 │ 0.0.0.0/0 │ │
│ │ HTTPS │ TCP │ 443 │ 0.0.0.0/0 │ │
│ │ Custom │ TCP │ 3306 │ sg-xxxxx │ │
│ │ All ICMP │ ICMP │ All │ 10.0.0.0/16 │ │
│ └────────────┴───────────┴─────────────┴───────────────┘ │
│ │
│ La fuente puede ser: │
│ • CIDR: 0.0.0.0/0 (todo), 10.0.0.0/8 (privado) │
│ • Security Group: sg-xxxxxxxx │
│ • Prefix List: pl-xxxxxxxx │
│ │
└─────────────────────────────────────────────────────────────┘
Fuentes Comunes
Notación CIDR
┌─────────────────────────────────────────────────────────────┐
│ NOTATION CIDR │
├─────────────────────────────────────────────────────────────┤
│ │
│ 0.0.0.0/0 = Todo Internet (¡ATENCIÓN!) │
│ ::/0 = Todo IPv6 │
│ │
│ 10.0.0.0/8 = Red privada clase A │
│ 172.16.0.0/12 = Red privada clase B │
│ 192.168.0.0/16 = Red privada clase C │
│ │
│ 203.0.113.25/32 = Una sola IP (su oficina) │
│ 10.0.1.0/24 = 256 direcciones (una subred) │
│ │
│ El /XX indica cuántos bits son fijos: │
│ /32 = 1 IP, /24 = 256 IPs, /16 = 65536 IPs, /0 = todo │
│ │
└─────────────────────────────────────────────────────────────┘
Referenciar Otro Security Group
┌─────────────────────────────────────────────────────────────┐
│ RÉFÉRENCE ENTRE SECURITY GROUPS │
├─────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────────┐ ┌─────────────────┐ │
│ │ sg-web │ │ sg-database │ │
│ │ │ │ │ │
│ │ Inbound: │ │ Inbound: │ │
│ │ HTTP 80 0.0.0.0/0 │ MySQL 3306 │ │
│ │ │ │ Source: sg-web │◄─────┐ │
│ │ │ │ │ │ │
│ │ ┌──────────┐ │ │ ┌──────────┐ │ │ │
│ │ │ Web App │──┼─────────┼─►│ MySQL │ │ │ │
│ │ └──────────┘ │ │ └──────────┘ │ │ │
│ │ │ │ │ │ │
│ └─────────────────┘ └─────────────────┘ │ │
│ │ │
│ Solo las instancias en sg-web pueden acceder ─────┘ │
│ a MySQL. ¡No necesita gestionar las IPs! │
│ │
└─────────────────────────────────────────────────────────────┘
Buena Práctica
Referencie los Security Groups en lugar de las IPs cuando sea posible. ¡Es más dinámico y más seguro!
Puertos Comunes
| Puerto | Servicio | Cuándo abrirlo |
|---|---|---|
| 22 | SSH | Acceso de administración (restringir a su IP) |
| 80 | HTTP | Sitios web públicos |
| 443 | HTTPS | Sitios web seguros |
| 3306 | MySQL | Base de datos (solo interno) |
| 5432 | PostgreSQL | Base de datos (solo interno) |
| 3389 | RDP | Escritorio remoto de Windows |
| 8080 | HTTP Alt | Aplicaciones, Tomcat |
| 27017 | MongoDB | Base de datos (solo interno) |
Ejemplos de Configuración
Servidor Web Público
┌─────────────────────────────────────────────────────────────┐
│ SG : sg-webserver-public │
├─────────────────────────────────────────────────────────────┤
│ │
│ INBOUND RULES : │
│ ┌──────────┬──────────┬──────────┬─────────────────────┐ │
│ │ Type │ Protocol │ Port │ Source │ │
│ ├──────────┼──────────┼──────────┼─────────────────────┤ │
│ │ HTTP │ TCP │ 80 │ 0.0.0.0/0 │ │
│ │ HTTPS │ TCP │ 443 │ 0.0.0.0/0 │ │
│ │ SSH │ TCP │ 22 │ 203.0.113.50/32 │ │
│ └──────────┴──────────┴──────────┴─────────────────────┘ │
│ │
│ OUTBOUND RULES : │
│ ┌──────────┬──────────┬──────────┬─────────────────────┐ │
│ │ All │ All │ All │ 0.0.0.0/0 │ │
│ └──────────┴──────────┴──────────┴─────────────────────┘ │
│ │
│ ⚠️ SSH restringido a la IP de la oficina (203.0.113.50) │
│ │
└─────────────────────────────────────────────────────────────┘
Base de Datos (Interna)
┌─────────────────────────────────────────────────────────────┐
│ SG : sg-database-private │
├─────────────────────────────────────────────────────────────┤
│ │
│ INBOUND RULES : │
│ ┌──────────┬──────────┬──────────┬─────────────────────┐ │
│ │ Type │ Protocol │ Port │ Source │ │
│ ├──────────┼──────────┼──────────┼─────────────────────┤ │
│ │ MySQL │ TCP │ 3306 │ sg-webserver │ │
│ └──────────┴──────────┴──────────┴─────────────────────┘ │
│ │
│ OUTBOUND RULES : │
│ ┌──────────┬──────────┬──────────┬─────────────────────┐ │
│ │ All │ All │ All │ 0.0.0.0/0 │ │
│ └──────────┴──────────┴──────────┴─────────────────────┘ │
│ │
│ ✅ Solo accesible desde el SG de los servidores web │
│ ❌ Sin acceso directo desde Internet │
│ │
└─────────────────────────────────────────────────────────────┘
Errores Comunes
1. SSH Abierto a Todo el Mundo ❌
MALO:
SSH (22) - Source: 0.0.0.0/0
↓
⚠️ ¡Cualquiera puede intentar conectarse!
Ataques de fuerza bruta garantizados.
BUENO:
SSH (22) - Source: 203.0.113.50/32 (su IP)
o
SSH (22) - Source: 10.0.0.0/8 (red privada + VPN)
2. Base de Datos Expuesta ❌
MALO:
MySQL (3306) - Source: 0.0.0.0/0
↓
⚠️ ¡Base de datos accesible públicamente!
Riesgo mayor de seguridad.
BUENO:
MySQL (3306) - Source: sg-application
↓
✅ Solo accesible desde los servidores de aplicación
3. Demasiadas Reglas ❌
MALO:
Un SG con 50 reglas diferentes
↓
⚠️ Difícil de auditar y mantener
Riesgo de errores
BUENO:
Varios SG con roles claros:
- sg-web-public (HTTP/HTTPS)
- sg-admin (SSH/RDP)
- sg-database (MySQL interno)
Buenas Prácticas
1. Principio de Menor Privilegio
Autorice SOLO lo que sea necesario.
✅ Bueno : Puerto 443 desde 0.0.0.0/0 (HTTPS público requerido)
❌ Malo : Todos los puertos desde 0.0.0.0/0
2. Use Nombres Descriptivos
Nombres recomendados:
• sg-web-public-prod
• sg-database-internal-prod
• sg-admin-ssh-restricted
• sg-loadbalancer-public
3. Documente sus Reglas
Agregue descripciones a cada regla:
Puerto 443 - "HTTPS público para el sitio web"
Puerto 22 - "SSH admin solo desde oficina París"
Puerto 3306 - "MySQL solo para backend"
4. Audite Regularmente
Preguntas a considerar:
• ¿Hay reglas con 0.0.0.0/0 innecesarias?
• ¿Hay puertos de BDD expuestos públicamente?
• ¿Las reglas SSH son demasiado permisivas?
• ¿Hay reglas obsoletas?
Security Group vs NACL
┌─────────────────────────────────────────────────────────────┐
│ SECURITY GROUP vs NACL │
├─────────────────────────────────────────────────────────────┤
│ │
│ Criterio Security Group NACL │
│ ────────────────────────────────────────────────────── │
│ Nivel Instancia Subred │
│ Estado Stateful Stateless │
│ Reglas Solo ALLOW ALLOW y DENY │
│ Evaluación Todas las reglas Orden de prioridad │
│ Por defecto Deny entrante Allow todo │
│ Cambio Inmediato Inmediato │
│ │
│ Use SG para: Control detallado por instancia │
│ Use NACL para: Bloquear IPs, defensa en profundidad │
│ │
└─────────────────────────────────────────────────────────────┘
Resumen
| Concepto | Descripción |
|---|---|
| Security Group | Firewall a nivel de instancia |
| Stateful | Respuestas permitidas automáticamente |
| Inbound | Bloqueado por defecto |
| Outbound | Permitido por defecto |
| Solo ALLOW | Sin reglas DENY |
| Referencia SG | Usar un SG como fuente |
Quiz de Validación
- ¿Qué significa "stateful" para un Security Group?
- ¿Cuál es la política por defecto para el tráfico entrante?
- ¿Se puede bloquear una IP específica con un Security Group?
- ¿Qué significa 0.0.0.0/0 como fuente?
- ¿Por qué referenciar un SG en vez de una IP?
- ¿Cuál es el puerto por defecto para SSH?
Próxima sección: Lab: Arquitectura EC2