178 lines
4.3 KiB
Markdown
178 lines
4.3 KiB
Markdown
|
|
# Modelo de Amenazas TZZR
|
||
|
|
|
||
|
|
**Versión:** 5.0
|
||
|
|
**Fecha:** 2024-12-24
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Resumen Ejecutivo
|
||
|
|
|
||
|
|
El sistema TZZR tiene una base de seguridad sólida (SSH keys, PostgreSQL SSL, tokens de autenticación) pero presenta exposiciones críticas que requieren atención inmediata.
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Hallazgos Críticos
|
||
|
|
|
||
|
|
### CRÍTICO-001: CORP/HST sin Firewall
|
||
|
|
|
||
|
|
**Descripción:** UFW inactivo en servidores CORP y HST.
|
||
|
|
**Impacto:** Todos los puertos expuestos a Internet.
|
||
|
|
**Evidencia:** `ufw status` devuelve "inactive".
|
||
|
|
|
||
|
|
**Mitigación:**
|
||
|
|
```bash
|
||
|
|
# CORP
|
||
|
|
ufw default deny incoming
|
||
|
|
ufw allow 22/tcp
|
||
|
|
ufw allow 80/tcp
|
||
|
|
ufw allow 443/tcp
|
||
|
|
ufw enable
|
||
|
|
|
||
|
|
# HST
|
||
|
|
ufw default deny incoming
|
||
|
|
ufw allow 22/tcp
|
||
|
|
ufw allow 80/tcp
|
||
|
|
ufw allow 443/tcp
|
||
|
|
ufw enable
|
||
|
|
```
|
||
|
|
|
||
|
|
### CRÍTICO-002: PostgreSQL 5432 Expuesto
|
||
|
|
|
||
|
|
**Descripción:** PostgreSQL en ARCHITECT escucha en 0.0.0.0:5432.
|
||
|
|
**Impacto:** Accesible desde cualquier IP (aunque requiere autenticación).
|
||
|
|
|
||
|
|
**Mitigación:**
|
||
|
|
```
|
||
|
|
# /etc/postgresql/16/main/postgresql.conf
|
||
|
|
listen_addresses = '127.0.0.1,172.17.0.1'
|
||
|
|
```
|
||
|
|
|
||
|
|
### CRÍTICO-003: Archivos .env Legibles
|
||
|
|
|
||
|
|
**Descripción:** Archivos .env con permisos 644 (legibles por todos).
|
||
|
|
**Impacto:** Credenciales accesibles a cualquier usuario del sistema.
|
||
|
|
|
||
|
|
**Mitigación:**
|
||
|
|
```bash
|
||
|
|
chmod 600 /opt/clara/.env
|
||
|
|
chmod 600 /opt/alfred/.env
|
||
|
|
chmod 600 /opt/margaret/.env
|
||
|
|
chmod 600 /opt/mason/.env
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Hallazgos Altos
|
||
|
|
|
||
|
|
### ALTO-001: fail2ban No Configurado
|
||
|
|
|
||
|
|
**Descripción:** fail2ban failed en DECK, inactive en CORP.
|
||
|
|
**Impacto:** SSH bruteforce sin mitigación automática.
|
||
|
|
**Evidencia:** Ataques activos desde 165.232.81.204, 188.166.115.48.
|
||
|
|
|
||
|
|
**Mitigación:**
|
||
|
|
```bash
|
||
|
|
apt install fail2ban
|
||
|
|
systemctl enable fail2ban
|
||
|
|
# jail: sshd, maxretry=3, bantime=1h
|
||
|
|
```
|
||
|
|
|
||
|
|
### ALTO-002: Triple Gestión de Secretos
|
||
|
|
|
||
|
|
**Descripción:** Credenciales en Infisical, tablas creds_*, y archivos .env.
|
||
|
|
**Impacto:** No hay fuente única de verdad, riesgo de desincronización.
|
||
|
|
|
||
|
|
**Mitigación:**
|
||
|
|
- Migrar todas las credenciales a Infisical
|
||
|
|
- Eliminar .env hardcodeados
|
||
|
|
- creds_* solo para referencia
|
||
|
|
|
||
|
|
### ALTO-003: Servicios sin TLS Interno
|
||
|
|
|
||
|
|
**Descripción:** CLARA, MARGARET, MASON, FELDMAN en HTTP plano.
|
||
|
|
**Impacto:** Tráfico interno sin cifrar.
|
||
|
|
|
||
|
|
**Mitigación:**
|
||
|
|
- Configurar mTLS entre servicios
|
||
|
|
- Usar Caddy como reverse proxy con TLS
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Hallazgos Medios
|
||
|
|
|
||
|
|
### MEDIO-001: No hay Backup PostgreSQL
|
||
|
|
|
||
|
|
**Descripción:** Solo Gitea tiene backup en R2, PostgreSQL sin backup.
|
||
|
|
**Impacto:** Pérdida de datos en caso de fallo.
|
||
|
|
|
||
|
|
**Mitigación:**
|
||
|
|
```bash
|
||
|
|
# Cron diario
|
||
|
|
pg_dump architect | gzip | aws s3 cp - s3://architect/backups/architect_$(date +%F).sql.gz
|
||
|
|
```
|
||
|
|
|
||
|
|
### MEDIO-002: SENTINEL No Desplegado
|
||
|
|
|
||
|
|
**Descripción:** Sistema de auditoría planificado pero no implementado.
|
||
|
|
**Impacto:** Sin visibilidad de anomalías.
|
||
|
|
|
||
|
|
**Mitigación:** Implementar SENTINEL LIGHT mode básico.
|
||
|
|
|
||
|
|
### MEDIO-003: No hay Rotación de Secretos
|
||
|
|
|
||
|
|
**Descripción:** Sin política de rotación de credenciales.
|
||
|
|
**Impacto:** Credenciales comprometidas persisten indefinidamente.
|
||
|
|
|
||
|
|
**Mitigación:**
|
||
|
|
- API keys: 90 días
|
||
|
|
- DB passwords: 180 días
|
||
|
|
- SSH keys: 365 días
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Controles Existentes
|
||
|
|
|
||
|
|
| Control | Estado | Notas |
|
||
|
|
|---------|--------|-------|
|
||
|
|
| SSH Keys | Activo | Permisos 600 correctos |
|
||
|
|
| PostgreSQL SSL | Activo | SCRAM-SHA-256 |
|
||
|
|
| H_INSTANCIA Auth | Activo | CLARA/MARGARET |
|
||
|
|
| Gitea Tokens | Activo | Lectura/Escritura separados |
|
||
|
|
| DECK UFW | Activo | Política deny incoming |
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Matriz de Riesgos
|
||
|
|
|
||
|
|
| ID | Riesgo | Probabilidad | Impacto | Prioridad |
|
||
|
|
|----|--------|--------------|---------|-----------|
|
||
|
|
| CRÍTICO-001 | Firewall desactivado | Alta | Alto | Semana 1 |
|
||
|
|
| CRÍTICO-002 | PostgreSQL expuesto | Media | Alto | Semana 1 |
|
||
|
|
| CRÍTICO-003 | .env legibles | Alta | Alto | Semana 1 |
|
||
|
|
| ALTO-001 | Sin fail2ban | Alta | Medio | Semana 1 |
|
||
|
|
| ALTO-002 | Secretos duplicados | Media | Medio | Mes 1 |
|
||
|
|
| ALTO-003 | Sin TLS interno | Baja | Medio | Mes 1 |
|
||
|
|
| MEDIO-001 | Sin backup PG | Baja | Alto | Mes 1 |
|
||
|
|
| MEDIO-002 | Sin SENTINEL | Baja | Medio | Mes 2 |
|
||
|
|
| MEDIO-003 | Sin rotación | Baja | Medio | Mes 2 |
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Plan de Remediación
|
||
|
|
|
||
|
|
### Semana 1 (Urgente)
|
||
|
|
- [ ] Activar UFW en CORP y HST
|
||
|
|
- [ ] chmod 600 en todos los .env
|
||
|
|
- [ ] Instalar fail2ban
|
||
|
|
- [ ] PostgreSQL bind 127.0.0.1
|
||
|
|
|
||
|
|
### Mes 1 (Alta)
|
||
|
|
- [ ] Migrar secretos a Infisical
|
||
|
|
- [ ] TLS interno
|
||
|
|
- [ ] Backup PostgreSQL automatizado
|
||
|
|
|
||
|
|
### Mes 2 (Media)
|
||
|
|
- [ ] SENTINEL LIGHT mode
|
||
|
|
- [ ] Política de rotación
|
||
|
|
- [ ] Monitoreo de certificados
|