Saltar al contenido principal

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​

PuertoServicioCuándo abrirlo
22SSHAcceso de administración (restringir a su IP)
80HTTPSitios web públicos
443HTTPSSitios web seguros
3306MySQLBase de datos (solo interno)
5432PostgreSQLBase de datos (solo interno)
3389RDPEscritorio remoto de Windows
8080HTTP AltAplicaciones, Tomcat
27017MongoDBBase 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​

ConceptoDescripción
Security GroupFirewall a nivel de instancia
StatefulRespuestas permitidas automáticamente
InboundBloqueado por defecto
OutboundPermitido por defecto
Solo ALLOWSin reglas DENY
Referencia SGUsar un SG como fuente

Quiz de Validación​

  1. ¿Qué significa "stateful" para un Security Group?
  2. ¿Cuál es la política por defecto para el tráfico entrante?
  3. ¿Se puede bloquear una IP específica con un Security Group?
  4. ¿Qué significa 0.0.0.0/0 como fuente?
  5. ¿Por qué referenciar un SG en vez de una IP?
  6. ¿Cuál es el puerto por defecto para SSH?

Próxima sección: Lab: Arquitectura EC2