Add HojaDeRura.md
This commit is contained in:
parent
5cd0a16aeb
commit
403e82b24e
402
HojaDeRura.md
Normal file
402
HojaDeRura.md
Normal file
|
|
@ -0,0 +1,402 @@
|
|||
# Hoja de Ruta - Despliegue infraestructura Sirio
|
||||
|
||||
> Servidor: sirio.vpn9.com.es
|
||||
> CPU: AMD EPYC 4465P (12c/24t)
|
||||
> RAM: 128 GB
|
||||
> Disco: 4x 1.92 TB NVMe
|
||||
> Fecha inicio: marzo 2026
|
||||
|
||||
---
|
||||
|
||||
## Inventario de VMs
|
||||
|
||||
| # | VM | Hostname | URL panel | CPU | RAM | Disco | Pool NVMe |
|
||||
|---|-----|----------|-----------|-----|-----|-------|-----------|
|
||||
| - | Host PVE | sirio.vpn9.com.es | :8006 (directo) | - | ~4 GB overhead | boot mirror | disco1+disco2 |
|
||||
| 1 | Forgejo | vega.vpn9.com.es | git.vpn9.com.es | existente | existente | existente | - |
|
||||
| 2 | Bastion | polar.vpn9.com.es | - (solo SSH) | 1 vCPU | 1 GB | 20 GB | pool-b |
|
||||
| 3 | WG Hub A | orion.vpn9.com.es | wg.vpn9.com.es | 1 vCPU | 512 MB | 10 GB | pool-b |
|
||||
| 4 | Authentik | atlas.vpn9.com.es | auth.vpn9.com.es | 1-2 vCPU | 2-3 GB | 20 GB | pool-b |
|
||||
| 5 | Netbox | nova.vpn9.com.es | netbox.vpn9.com.es | 1-2 vCPU | 2-3 GB | 20 GB | pool-b |
|
||||
| 6 | Monitoring | rigel.vpn9.com.es | grafana.vpn9.com.es | 4 vCPU | 8-12 GB | 200-500 GB | pool-a |
|
||||
| 7 | Wazuh | altair.vpn9.com.es | wazuh.vpn9.com.es | 4 vCPU | 12 GB | 100 GB | pool-c |
|
||||
| 8 | Servicios | deneb.vpn9.com.es | ansible.vpn9.com.es / status.vpn9.com.es | 1-2 vCPU | 2-3 GB | 20 GB | pool-d |
|
||||
| 9 | Zammad | antares.vpn9.com.es | tickets.vpn9.com.es | 2-3 vCPU | 4-6 GB | 50 GB | pool-c |
|
||||
| 10 | ICSManager | castor.vpn9.com.es | ics.vpn9.com.es | 1-2 vCPU | 2-3 GB | 20 GB | pool-d |
|
||||
| 11 | WildDuck | pollux.vpn9.com.es | correo.vpn9.com.es | 1-2 vCPU | 2-3 GB | 30-50 GB | pool-d |
|
||||
| 12 | PMG | spica.vpn9.com.es | pmg.vpn9.com.es | 1-2 vCPU | 2-3 GB | 30 GB | pool-d |
|
||||
| 13 | PDM | mira.vpn9.com.es | pdm.vpn9.com.es | 1 vCPU | 1-2 GB | 20 GB | pool-d |
|
||||
| 14 | Outline | lyra.vpn9.com.es | docs.vpn9.com.es | 1 vCPU | 1-2 GB | 20 GB | pool-c |
|
||||
| 15 | WG Hub B | betel.vpn9.com.es | - | 1 vCPU | 512 MB | 10 GB | pool-c |
|
||||
|
||||
### Distribucion de pools NVMe
|
||||
|
||||
```
|
||||
Disco 1 (1.92TB) Disco 2 (1.92TB) Disco 3 (1.92TB) Disco 4 (1.92TB)
|
||||
┌──────────────┐ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐
|
||||
│ Boot 100GB │◄─mirror─►│ Boot 100GB │ │ │ │ │
|
||||
├──────────────┤ ├──────────────┤ │ │ │ │
|
||||
│ │ │ │ │ │ │ │
|
||||
│ pool-a │ │ pool-b │ │ pool-c │ │ pool-d │
|
||||
│ ~1.8 TB │ │ ~1.8 TB │ │ ~1.9 TB │ │ ~1.9 TB │
|
||||
│ │ │ │ │ │ │ │
|
||||
│ Monitoring │ │ Bastion │ │ Wazuh │ │ Servicios │
|
||||
│ (200-500GB) │ │ WG Hub A │ │ Zammad │ │ ICSManager │
|
||||
│ │ │ Authentik │ │ Outline │ │ WildDuck │
|
||||
│ │ │ Netbox │ │ WG Hub B │ │ PMG │
|
||||
│ │ │ │ │ │ │ PDM │
|
||||
└──────────────┘ └──────────────┘ └──────────────┘ └──────────────┘
|
||||
```
|
||||
|
||||
Criterio: Monitoring en pool-a solo (ocupa mucho disco). Resto repartido por criticidad: si muere un disco, solo 1/4 de los servicios se cae, el resto sigue. Se restaura desde PBS.
|
||||
|
||||
---
|
||||
|
||||
## Fase 0: Base del servidor (dia 1)
|
||||
|
||||
### 0.1 Instalar Proxmox VE
|
||||
|
||||
- [ ] Instalar PVE en sirio
|
||||
- [ ] Configurar boot ZFS mirror (disco1 + disco2, particion 100GB)
|
||||
- [ ] Crear pools ZFS independientes:
|
||||
```bash
|
||||
zpool create pool-a /dev/nvme0n1p3
|
||||
zpool create pool-b /dev/nvme1n1p3
|
||||
zpool create pool-c /dev/nvme2n1
|
||||
zpool create pool-d /dev/nvme3n1
|
||||
```
|
||||
- [ ] Optimizar ZFS en los 4 pools:
|
||||
```bash
|
||||
for pool in pool-a pool-b pool-c pool-d; do
|
||||
zfs set recordsize=1M $pool
|
||||
zfs set compression=lz4 $pool
|
||||
zfs set atime=off $pool
|
||||
done
|
||||
```
|
||||
|
||||
### 0.2 Hardening inmediato
|
||||
|
||||
- [ ] Firewall PVE: activar, policy_out: DROP, policy_in: DROP
|
||||
- [ ] Reglas firewall: permitir SSH (22), PVE web (8006), WireGuard (51820) solo desde IPs conocidas
|
||||
- [ ] SSH: solo key david@ansible, PasswordAuthentication no
|
||||
- [ ] Verificar sshd_config.d no tiene drop-ins peligrosos
|
||||
- [ ] Instalar check_malware.sh (version actualizada con checks 1-21)
|
||||
|
||||
### 0.3 WireGuard en el host
|
||||
|
||||
- [ ] Instalar WireGuard en el host PVE
|
||||
- [ ] Configurar peer temporal hacia hub WG existente
|
||||
- [ ] Verificar conectividad privada con el resto de la infra
|
||||
- [ ] Registrar sirio en DNS interno (Technitium cuando exista, /etc/hosts mientras tanto)
|
||||
|
||||
---
|
||||
|
||||
## Fase 1: Fundamentos (semana 1)
|
||||
|
||||
### 1.1 VM Forgejo (vega)
|
||||
|
||||
- [ ] Migrar o conectar Forgejo existente
|
||||
- [ ] Crear repos para:
|
||||
- `infra-ansible` (playbooks y roles)
|
||||
- `infra-configs` (backup de configs, capa 6.3)
|
||||
- `infra-docs` (documentacion operativa)
|
||||
- [ ] Verificar acceso por WG
|
||||
|
||||
### 1.2 VM Bastion (polar)
|
||||
|
||||
- [ ] Crear VM: 1 vCPU, 1 GB RAM, 20 GB disco en pool-b
|
||||
- [ ] Debian 12 minimal
|
||||
- [ ] SSH hardened (solo key david@ansible)
|
||||
- [ ] Instalar Claude Code:
|
||||
```bash
|
||||
curl -fsSL https://claude.ai/install.sh | bash
|
||||
```
|
||||
- [ ] Crear /root/CLAUDE.md con contexto de la infra
|
||||
- [ ] Este es el punto de entrada SSH para tecnicos, nunca SSH directo al host PVE
|
||||
|
||||
### 1.3 VM WG Hub A (orion)
|
||||
|
||||
- [ ] Crear VM: 1 vCPU, 512 MB RAM, 10 GB disco en pool-b
|
||||
- [ ] Debian 12 minimal + WireGuard
|
||||
- [ ] Configurar como hub central WG (reemplaza el peer temporal del host)
|
||||
- [ ] nftables con politica restrictiva:
|
||||
```
|
||||
Puerto 25: BLOQUEADO siempre
|
||||
Puertos 465/587: whitelist SMTP
|
||||
Puertos 80/443/53/123: permitidos
|
||||
Resto: DROP + log
|
||||
```
|
||||
- [ ] NAT CGNAT (100.64.0.0/10) para VMs de clientes
|
||||
- [ ] Instalar wgdashboard
|
||||
- [ ] URL: wg.vpn9.com.es (via Traefik, solo VPN)
|
||||
|
||||
---
|
||||
|
||||
## Fase 2: Identidad e inventario (semana 1-2)
|
||||
|
||||
### 2.1 VM Authentik (atlas)
|
||||
|
||||
- [ ] Crear VM: 1-2 vCPU, 2-3 GB RAM, 20 GB disco en pool-b
|
||||
- [ ] Desplegar Authentik (Docker)
|
||||
- [ ] Configurar como proveedor OIDC/SAML central
|
||||
- [ ] Crear usuarios del equipo tecnico
|
||||
- [ ] URL: auth.vpn9.com.es
|
||||
- [ ] Integrar con Grafana, Netbox, Zammad, Outline, Forgejo (cuando se desplieguen)
|
||||
|
||||
### 2.2 VM Netbox (nova)
|
||||
|
||||
- [ ] Crear VM: 1-2 vCPU, 2-3 GB RAM, 20 GB disco en pool-b
|
||||
- [ ] Desplegar Netbox (Docker)
|
||||
- [ ] Configurar IPAM:
|
||||
- Prefijo WG: 10.9.0.0/16
|
||||
- Prefijo CGNAT: 100.64.0.0/10 (un /24 por cliente)
|
||||
- IPv6 WG: fdab::/48
|
||||
- [ ] Registrar todas las VMs ya desplegadas (sirio, vega, polar, orion, atlas, nova)
|
||||
- [ ] URL: netbox.vpn9.com.es
|
||||
- [ ] Integrar con Authentik (SSO)
|
||||
|
||||
---
|
||||
|
||||
## Fase 3: Observabilidad (semana 2-3)
|
||||
|
||||
### 3.1 VM Monitoring (rigel)
|
||||
|
||||
- [ ] Crear VM: 4 vCPU, 8-12 GB RAM, 200-500 GB disco en pool-a
|
||||
- [ ] Desplegar stack de monitoring (Docker):
|
||||
- VictoriaMetrics (metricas, retencion 1 año)
|
||||
- vmagent (scrape de metricas)
|
||||
- Grafana (dashboards)
|
||||
- Loki (logs, retencion 30 dias)
|
||||
- Alertmanager (alertas → Zammad cuando exista, email mientras tanto)
|
||||
- [ ] URL: grafana.vpn9.com.es
|
||||
- [ ] Integrar con Authentik (SSO)
|
||||
- [ ] Instalar en TODAS las VMs existentes:
|
||||
```bash
|
||||
# En cada VM
|
||||
apt install prometheus-node-exporter
|
||||
# + Grafana Alloy para logs a Loki
|
||||
```
|
||||
- [ ] Crear dashboards basicos: host PVE, VMs, discos ZFS
|
||||
|
||||
### 3.2 VM Wazuh (altair)
|
||||
|
||||
- [ ] Crear VM: 4 vCPU, 12 GB RAM, 100 GB disco en pool-c
|
||||
- [ ] Desplegar Wazuh Manager + Dashboard (Docker o paquetes)
|
||||
- [ ] URL: wazuh.vpn9.com.es
|
||||
- [ ] Instalar Wazuh Agent en TODAS las VMs existentes + host PVE
|
||||
- [ ] Configurar FIM (File Integrity Monitoring):
|
||||
- /etc/pam.d/
|
||||
- /etc/ssh/sshd_config.d/
|
||||
- /etc/ld.so.preload
|
||||
- /usr/bin/ (binarios nuevos)
|
||||
- /usr/lib/systemd/system/ (services nuevos)
|
||||
- [ ] Configurar alerta nivel ≥10 → email (→ Zammad cuando exista)
|
||||
|
||||
### 3.3 Instalar agentes en todo lo existente
|
||||
|
||||
- [ ] Por cada VM ya desplegada (polar, orion, atlas, nova, rigel, altair):
|
||||
- [ ] node_exporter
|
||||
- [ ] Grafana Alloy (logs → Loki)
|
||||
- [ ] Wazuh Agent
|
||||
- [ ] Verificar que aparece en Grafana y Wazuh Dashboard
|
||||
|
||||
---
|
||||
|
||||
## Fase 4: Servicios operativos (semana 3-4)
|
||||
|
||||
### 4.1 VM Servicios (deneb)
|
||||
|
||||
- [ ] Crear VM: 1-2 vCPU, 2-3 GB RAM, 20 GB disco en pool-d
|
||||
- [ ] Desplegar (Docker):
|
||||
- Semaphore (UI para Ansible)
|
||||
- Uptime Kuma (status page)
|
||||
- Technitium (DNS interno)
|
||||
- Traefik (reverse proxy central)
|
||||
- [ ] Configurar Traefik:
|
||||
- Certs Let's Encrypt para *.vpn9.com.es
|
||||
- Middleware ipAllowList (solo IPs WG)
|
||||
- Catch-all: pagina "acceso solo por VPN" para peticiones externas
|
||||
- Routers para todos los servicios ya desplegados
|
||||
- [ ] URLs: ansible.vpn9.com.es, status.vpn9.com.es
|
||||
- [ ] Configurar Technitium como DNS interno:
|
||||
- Zona vpn9.com.es con todos los hostnames
|
||||
- Todas las VMs apuntan a Technitium como DNS
|
||||
- [ ] Semaphore: conectar a Forgejo (repos ansible), configurar inventario desde Netbox
|
||||
- [ ] Uptime Kuma: añadir checks de todos los servicios desplegados
|
||||
|
||||
### 4.2 VM Zammad (antares)
|
||||
|
||||
- [ ] Crear VM: 2-3 vCPU, 4-6 GB RAM, 50 GB disco en pool-c
|
||||
- [ ] Desplegar Zammad (Docker)
|
||||
- [ ] URL: tickets.vpn9.com.es
|
||||
- [ ] Integrar con Authentik (SSO)
|
||||
- [ ] Configurar Alertmanager → Zammad (webhook, crea tickets de alertas)
|
||||
- [ ] Configurar Wazuh → Zammad (alertas nivel ≥10)
|
||||
- [ ] Crear colas: infraestructura, clientes, seguridad
|
||||
|
||||
### 4.3 Traefik: pagina VPN para accesos externos
|
||||
|
||||
- [ ] Contenedor nginx con pagina estatica de instrucciones
|
||||
- [ ] Traefik catch-all redirige ahi si la IP no es WG
|
||||
- [ ] Pagina muestra: como instalar WireGuard, a quien contactar
|
||||
|
||||
---
|
||||
|
||||
## Fase 5: Migracion de servicios existentes (semana 4+)
|
||||
|
||||
### 5.1 VM ICSManager (castor)
|
||||
|
||||
- [ ] Crear VM: 1-2 vCPU, 2-3 GB RAM, 20 GB disco en pool-d
|
||||
- [ ] Migrar ICSManager (Docker: app + PostgreSQL, todo dentro, caja negra)
|
||||
- [ ] URL: ics.vpn9.com.es
|
||||
- [ ] Verificar integracion con Netbox (inventario de clientes)
|
||||
|
||||
### 5.2 VM WildDuck (pollux)
|
||||
|
||||
- [ ] Crear VM: 1-2 vCPU, 2-3 GB RAM, 30-50 GB disco en pool-d
|
||||
- [ ] Migrar WildDuck (Docker: WildDuck + MongoDB + Redis, todo dentro)
|
||||
- [ ] URL: correo.vpn9.com.es
|
||||
- [ ] Verificar tokens SMTP de los PVE (notificaciones)
|
||||
- [ ] No migrar hasta tener PMG listo o al menos planificado
|
||||
|
||||
### 5.3 VM PMG (spica)
|
||||
|
||||
- [ ] Crear VM: 1-2 vCPU, 2-3 GB RAM, 30 GB disco en pool-d
|
||||
- [ ] Instalar Proxmox Mail Gateway
|
||||
- [ ] Configurar como relay MX delante de WildDuck:
|
||||
```
|
||||
Internet → PMG (spica) → WildDuck (pollux)
|
||||
```
|
||||
- [ ] Configurar: SpamAssassin, ClamAV, greylisting, SPF/DKIM/DMARC
|
||||
- [ ] URL: pmg.vpn9.com.es
|
||||
- [ ] Redirigir MX del dominio a PMG
|
||||
|
||||
### 5.4 VM PDM (mira)
|
||||
|
||||
- [ ] Crear VM: 1 vCPU, 1-2 GB RAM, 20 GB disco en pool-d
|
||||
- [ ] Instalar Proxmox Datacenter Manager
|
||||
- [ ] Conectar todos los clusters PVE
|
||||
- [ ] URL: pdm.vpn9.com.es
|
||||
|
||||
### 5.5 VM Outline (lyra)
|
||||
|
||||
- [ ] Crear VM: 1 vCPU, 1-2 GB RAM, 20 GB disco en pool-c
|
||||
- [ ] Desplegar Outline (Docker: app + PostgreSQL + Redis)
|
||||
- [ ] URL: docs.vpn9.com.es
|
||||
- [ ] Integrar con Authentik (SSO)
|
||||
- [ ] Migrar documentacion operativa aqui
|
||||
|
||||
### 5.6 VM WG Hub B (betel)
|
||||
|
||||
- [ ] Crear VM: 1 vCPU, 512 MB RAM, 10 GB disco en pool-c
|
||||
- [ ] Clon de la config de orion (WG Hub A)
|
||||
- [ ] Configurar keepalived HA con orion
|
||||
- [ ] Peer de failover: si orion cae, betel toma el relevo
|
||||
|
||||
---
|
||||
|
||||
## Fase 6: Backup y contingencia (en paralelo desde fase 3)
|
||||
|
||||
### 6.1 Backup de las VMs de sirio
|
||||
|
||||
- [ ] Configurar PBS1 (existente) para backupear todas las VMs de sirio
|
||||
- [ ] Schedule: diario, retencion 7 dias minimo
|
||||
- [ ] Verificar restauracion de al menos 1 VM como test
|
||||
|
||||
### 6.2 Backup de configs a git (capa 6.3)
|
||||
|
||||
- [ ] Crear playbook backup-configs.yml en Semaphore:
|
||||
```
|
||||
Recoger: /etc/pve/, /etc/proxmox-backup/, WG configs, ZFS properties
|
||||
Commit + push a repo infra-configs en Forgejo
|
||||
Schedule: diario 06:00
|
||||
```
|
||||
|
||||
### 6.3 Replica ZFS a oficina (capa 6.4)
|
||||
|
||||
- [ ] Configurar zfs send/recv incremental cada 4h
|
||||
- [ ] VMs a replicar: rigel (monitoring), altair (wazuh), deneb (servicios)
|
||||
- [ ] Destino: servidor Xeon 96GB en oficina via WireGuard
|
||||
- [ ] Documentar procedimiento de activacion en caso de perdida de sirio
|
||||
|
||||
### 6.4 Test de contingencia
|
||||
|
||||
- [ ] Simular perdida de 1 pool NVMe: restaurar VMs desde PBS
|
||||
- [ ] Medir tiempo de restauracion
|
||||
- [ ] Documentar en Outline
|
||||
|
||||
---
|
||||
|
||||
## Fase 7: Agentes IA (mes 2-4)
|
||||
|
||||
### 7.1 Claude Code en bastion (dia 1 de fase 1)
|
||||
|
||||
- [ ] Ya instalado en polar (bastion) en fase 1.2
|
||||
- [ ] Crear CLAUDE.md con contexto completo de la infra
|
||||
|
||||
### 7.2 Agente triaje de alertas (mes 2)
|
||||
|
||||
- [ ] Crear workflow en n8n (dentro de deneb):
|
||||
- Trigger: webhook desde Alertmanager
|
||||
- Consulta: VictoriaMetrics + Loki + Netbox
|
||||
- Analisis: Claude API (Sonnet)
|
||||
- Accion: crear ticket en Zammad con diagnostico
|
||||
- [ ] Coste estimado: ~$15-30/mes
|
||||
|
||||
### 7.3 Agente capacity planning (mes 3)
|
||||
|
||||
- [ ] Workflow n8n: cron semanal lunes 08:00
|
||||
- [ ] Genera informe en Outline con predicciones de espacio
|
||||
|
||||
### 7.4 Agente seguridad Wazuh (mes 3-4)
|
||||
|
||||
- [ ] Workflow n8n: webhook desde Wazuh (alertas nivel ≥10)
|
||||
- [ ] Analisis con Claude API (Opus)
|
||||
- [ ] Clasifica: falso positivo / incidente real / indeterminado
|
||||
|
||||
---
|
||||
|
||||
## Checklist por VM (aplicar a cada VM al desplegarla)
|
||||
|
||||
Antes de pasar a la siguiente VM, verificar:
|
||||
|
||||
- [ ] node_exporter instalado y scrapeado por VictoriaMetrics
|
||||
- [ ] Grafana Alloy instalado y enviando logs a Loki
|
||||
- [ ] Wazuh Agent instalado y reportando al manager
|
||||
- [ ] Registrada en Netbox (hostname, IP, rol, cliente: interno)
|
||||
- [ ] Añadida a Uptime Kuma (check HTTP o TCP)
|
||||
- [ ] Firewall de la VM configurado (solo puertos necesarios)
|
||||
- [ ] DNS registrado en Technitium (hostname.vpn9.com.es)
|
||||
- [ ] Router Traefik configurado (si tiene panel web)
|
||||
- [ ] Backup PBS verificado (al menos 1 backup exitoso)
|
||||
|
||||
---
|
||||
|
||||
## Resumen de recursos
|
||||
|
||||
```
|
||||
Total VMs: 15 (+ host PVE)
|
||||
Total vCPU: ~24-32
|
||||
Total RAM: ~44-58 GB (de 128 GB disponibles)
|
||||
Total disco: ~580-920 GB (de 7.68 TB disponibles)
|
||||
Margen RAM: ~70-84 GB libres
|
||||
Margen disco: ~6.8-7.1 TB libres
|
||||
Coste API Claude: ~$30-60/mes
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Documentos de referencia
|
||||
|
||||
| Documento | Contenido |
|
||||
|-----------|-----------|
|
||||
| decision-logs.md | Capa 1: Monitoring y logs centralizados |
|
||||
| decision-incidentes.md | Capa 2: Seguridad y respuesta a incidentes |
|
||||
| decision-automatizacion.md | Capa 3: Ansible + Semaphore + CI/CD |
|
||||
| decision-red.md | Capa 4: WireGuard, CGNAT, VM model, PDM, PMG |
|
||||
| decision-almacenamiento.md | Capa 6: Backup 3 capas, config backup, replica oficina |
|
||||
| decision-observabilidad.md | Capa 7: Dashboards, SLOs, capacity planning |
|
||||
| decision-ia-agentes.md | Capa 8: Claude Code + agentes automatizados |
|
||||
| guia-deteccion-xmrig.md | IOCs y procedimiento de deteccion de malware |
|
||||
| check_malware.sh | Script de verificacion de malware (ejecutar en todos los servidores) |
|
||||
| articulos-seguridad-lecciones.md | 177 articulos para blog (29 bloques) |
|
||||
Loading…
Reference in a new issue