[A06] Resolución BUG SSH Legacy en info.rb, conclusión F1 de Compresión XVA, y actualizaciones de métricas y planes.

This commit is contained in:
Ricardo Monla
2026-04-10 19:12:37 -03:00
parent 941da87ed2
commit 15bcf81183
14 changed files with 855 additions and 23 deletions
+12 -2
View File
@@ -32,6 +32,8 @@ El ecosistema ADN implementa una jerarquía **Ámbito → Nodos** que agrupa ló
| **A02** | `dtic-DIGIs` | Digitalización y Gestión Documental | *ver docs/ambito/dtic-DIGIs/* | | **A02** | `dtic-DIGIs` | Digitalización y Gestión Documental | *ver docs/ambito/dtic-DIGIs/* |
| **A03** | `dtic-BKPs` | Backups de servidores | srv-ns8, pve_PMOX3, srvv-maurik | | **A03** | `dtic-BKPs` | Backups de servidores | srv-ns8, pve_PMOX3, srvv-maurik |
| **A04** | `dtic-DASUTEN` | Sub-ámbito: Departamento de Servicios UTN (gestionado) | srv-dasu, dasu-sql2, dasu-pcv2, dasu-pc | | **A04** | `dtic-DASUTEN` | Sub-ámbito: Departamento de Servicios UTN (gestionado) | srv-dasu, dasu-sql2, dasu-pcv2, dasu-pc |
| **A06** | `dtic-XenServer` | Administración hipervisor Citrix XenServer 7.0 | srv-xen1, srvv-sysacadweb, srvv-maurik |
| **A07** | `dtic-DNS` | Administración DNS de la Facultad | srvv-dns, srv-pmox1 |
| `dtic-DIIAA` | (infrastructure root) | Infraestructura física y servicios propios | srv-pmox*, srv-xen1, srvv-* | | `dtic-DIIAA` | (infrastructure root) | Infraestructura física y servicios propios | srv-pmox*, srv-xen1, srvv-* |
### Relaciones ### Relaciones
@@ -99,12 +101,20 @@ GET /api/entradas?ambito_id=2
### 🏔️ Citrix XenServer ### 🏔️ Citrix XenServer
> **Ámbito asociado:** [**A06 - dtic-XenServer**](../docs/ambito/dtic-XenServer/A06_dtic-XenServer.md)
#### **[srv-xen1](../nodos/srv-xen1.md)** (`10.0.10.23`) #### **[srv-xen1](../nodos/srv-xen1.md)** (`10.0.10.23`)
*Citrix XenServer 7.0.0 | Xeon E3-1230 (4C) | Hypervisor Legacy* *Citrix XenServer 7.0.0 | Xeon E3-1230 (4C) | Hypervisor Legacy*
| VMID | Nodo | IP | Rol | | VMID | Nodo | IP | Rol |
| :--- | :--- | :--- | :--- | | :--- | :--- | :--- | :--- |
| - | **[srvv-sysacadweb](../nodos/srvv-sysacadweb.md)** | *Interna* | Web SysACAD | | - | **[srvv-sysacadweb](../nodos/srvv-sysacadweb.md)** | `10.0.10.12` | Web SysACAD |
| - | **[srvv-maurik](../nodos/srvv-maurik.md)** | *Desconocida* | Domain Controller | | - | **[srvv-maurik](../nodos/srvv-maurik.md)** | `10.0.10.10` | Domain Controller (UTNLARIOJA) |
**Limitaciones técnicas:**
- OpenSSH 6.6.1 (incompatible con `rsa-sha2`, solo `ssh-rsa` legacy)
- Disco Dom0 limitado (~2.7 GB libre)
- Requiere opciones SSH especiales: `-o PubkeyAcceptedAlgorithms=+ssh-rsa -o HostkeyAlgorithms=+ssh-rsa`
### 🛰️ Nodos Externos / Satélites (DASUTEN) ### 🛰️ Nodos Externos / Satélites (DASUTEN)
+3 -2
View File
@@ -12,5 +12,6 @@
"deepseek_key": "eyJpdiI6InRCc2IvL3J4SGNsejgvL04iLCJ0YWciOiJBbjRlMTNXNlZzUGhNSWowSUU1a01nPT0iLCJkYXRhIjoiQXR4azk1aU9sb2QydzNwa0FMTHpjVkJKQTIvZU4wY1U2V2crK3NBbVd1UnRmUGh6In0=", "deepseek_key": "eyJpdiI6InRCc2IvL3J4SGNsejgvL04iLCJ0YWciOiJBbjRlMTNXNlZzUGhNSWowSUU1a01nPT0iLCJkYXRhIjoiQXR4azk1aU9sb2QydzNwa0FMTHpjVkJKQTIvZU4wY1U2V2crK3NBbVd1UnRmUGh6In0=",
"srv-ns8:rmonla": "eyJpdiI6IlJ4cHZkbFpJQWVsTTl3T1YiLCJ0YWciOiJ3WTZGMDEvNHNsZm1wZm5jMEF4Q1lBPT0iLCJkYXRhIjoibFljUHRYTm44bUxvQjhCa2tBPT0ifQ==", "srv-ns8:rmonla": "eyJpdiI6IlJ4cHZkbFpJQWVsTTl3T1YiLCJ0YWciOiJ3WTZGMDEvNHNsZm1wZm5jMEF4Q1lBPT0iLCJkYXRhIjoibFljUHRYTm44bUxvQjhCa2tBPT0ifQ==",
"dasu-sql3:Administrador": "eyJpdiI6IlRiMDh3U1N2aVhTcDYzbzciLCJ0YWciOiI5NVNyUDFlMXlrM0dGRlNqUXhLbEt3PT0iLCJkYXRhIjoiVkp2V09zSjczcS96UktTSlZTOFdBdz09In0=", "dasu-sql3:Administrador": "eyJpdiI6IlRiMDh3U1N2aVhTcDYzbzciLCJ0YWciOiI5NVNyUDFlMXlrM0dGRlNqUXhLbEt3PT0iLCJkYXRhIjoiVkp2V09zSjczcS96UktTSlZTOFdBdz09In0=",
"srvv-nginx-rm:rmonla": "eyJpdiI6ImFsQnk5UjhLaDFYWHJsWnciLCJ0YWciOiJJaEtCS215ekkwYVdFR0ZHNzFVN0VBPT0iLCJkYXRhIjoiUkcvSS9sMjhoQnFpRmZobFZBPT0ifQ==" "srvv-nginx-rm:rmonla": "eyJpdiI6ImFsQnk5UjhLaDFYWHJsWnciLCJ0YWciOiJJaEtCS215ekkwYVdFR0ZHNzFVN0VBPT0iLCJkYXRhIjoiUkcvSS9sMjhoQnFpRmZobFZBPT0ifQ==",
} "srv-xen01:rmonla": "eyJpdiI6ImdURFJuRDNucGpETkxVVjAiLCJ0YWciOiJWdnNzdmRxRGthS0RnUTBWeE1xYUpRPT0iLCJkYXRhIjoiaGszT2lYRkNONVVWakFhQjdnPT0ifQ=="
}
+31 -2
View File
@@ -22,7 +22,9 @@ module ADN
puerto_ssh: detectar_puerto_ssh(contenido) || 22, puerto_ssh: detectar_puerto_ssh(contenido) || 22,
usuario: detectar_usuario(contenido), usuario: detectar_usuario(contenido),
clave_boveda: detectar_clave_boveda(contenido), clave_boveda: detectar_clave_boveda(contenido),
auth_type: detectar_auth_type(contenido) auth_type: detectar_auth_type(contenido),
clave_ssh: detectar_clave_ssh(contenido),
ssh_opts: detectar_ssh_opts(contenido)
} }
end end
@@ -100,8 +102,8 @@ module ADN
# | Sistema Operativo | ... | o - **Sistema Operativo**: ... # | Sistema Operativo | ... | o - **Sistema Operativo**: ...
if contenido =~ /(?:\||\-)\s*\*\*?(?:Sistema Operativo|SO|OS)\*\*?\s*[:\|]\s*([^\|\n]+)/i if contenido =~ /(?:\||\-)\s*\*\*?(?:Sistema Operativo|SO|OS)\*\*?\s*[:\|]\s*([^\|\n]+)/i
so_raw = $1.strip so_raw = $1.strip
return :linux if so_raw =~ /linux|ubuntu|debian|centos|rocky|proxmox|xen/i
return :windows if so_raw =~ /windows|server|win/i return :windows if so_raw =~ /windows|server|win/i
return :linux if so_raw =~ /linux|ubuntu|debian|centos|rocky|proxmox/i
end end
:linux # Default :linux # Default
end end
@@ -143,6 +145,11 @@ module ADN
end end
def self.detectar_auth_type(contenido) def self.detectar_auth_type(contenido)
# Detectar 'RSA Legacy' para XenServer 7.0 (OpenSSH 6.6.1)
if contenido =~ /RSA Legacy/i
return :rsa_legacy
end
# Detectar otros tipos de autenticación
if contenido =~ /\*\*SSH\*\*:.*\((Passphrase|Password|RSA)/i if contenido =~ /\*\*SSH\*\*:.*\((Passphrase|Password|RSA)/i
match = $1.downcase match = $1.downcase
return :passphrase if match == 'passphrase' return :passphrase if match == 'passphrase'
@@ -151,5 +158,27 @@ module ADN
end end
:password # Default para VMs Windows :password # Default para VMs Windows
end end
# Detectar clave SSH específica para el nodo
def self.detectar_clave_ssh(contenido)
# Buscar en formato: **Clave SSH**: `~/.ssh/id_rsa_xen`
if contenido =~ /\*\*Clave SSH\*\*:\s*`?([~a-zA-Z0-9_\-\.\/]+)`?/i
return $1
end
# Fallback: buscar en línea de comando SSH
if contenido =~ /ssh -i ([~a-zA-Z0-9_\-\.\/]+)\s/i
return $1
end
nil
end
# Detectar opciones SSH especiales (para servidores legacy)
def self.detectar_ssh_opts(contenido)
# Buscar opciones -o PubkeyAcceptedAlgorithms o -o HostkeyAlgorithms
if contenido =~ /(-o PubkeyAcceptedAlgorithms=[^\s`]+)\s+(-o HostkeyAlgorithms=[^\s`]+)/i
return "#{$1} #{$2}"
end
nil
end
end end
end end
+84 -3
View File
@@ -122,8 +122,8 @@ module ADN
contexto_str = contexto.any? ? " [#{contexto.join(' ')}]" : "" contexto_str = contexto.any? ? " [#{contexto.join(' ')}]" : ""
@logger.info("Conectando a #{nodo_nombre}#{contexto_str} (#{config[:ip]}:#{config[:puerto_ssh]})") @logger.info("Conectando a #{nodo_nombre}#{contexto_str} (#{config[:ip]}:#{config[:puerto_ssh]})")
# Autorizar candados # Autorizar candados solo si es necesario (password o passphrase)
autorizar_candados autorizar_candados unless config[:auth_type] == :rsa_legacy
case config[:auth_type] case config[:auth_type]
when :passphrase when :passphrase
@@ -132,16 +132,26 @@ module ADN
ejecutar_con_password(nodo_nombre, config, comando_remoto) ejecutar_con_password(nodo_nombre, config, comando_remoto)
when :rsa when :rsa
ejecutar_con_rsa(nodo_nombre, config, comando_remoto) ejecutar_con_rsa(nodo_nombre, config, comando_remoto)
when :rsa_legacy
ejecutar_con_rsa_legacy(nodo_nombre, config, comando_remoto)
end end
end end
def obtener_config(nodo_nombre) def obtener_config(nodo_nombre)
meta = ADN::NodosInfo.extraer_metadata(nodo_nombre) meta = ADN::NodosInfo.extraer_metadata(nodo_nombre)
return nil unless meta && meta[:ip] && meta[:usuario] && meta[:clave_boveda] return nil unless meta && meta[:ip] && meta[:usuario]
# Extraer IP de LAN si está disponible en la ficha # Extraer IP de LAN si está disponible en la ficha
meta[:ip_lan] = ADN::NodosInfo.extraer_ip_lan(nodo_nombre) meta[:ip_lan] = ADN::NodosInfo.extraer_ip_lan(nodo_nombre)
# Extraer clave SSH específica (para nodos con múltiples claves)
ruta = File.join(ADN::NODOS_DIR, "#{nodo_nombre}.md")
contenido = File.read(ruta, encoding: 'UTF-8') if File.exist?(ruta)
if contenido
meta[:clave_ssh] = ADN::NodosInfo.detectar_clave_ssh(contenido)
meta[:ssh_opts] = ADN::NodosInfo.detectar_ssh_opts(contenido)
end
# Inferir proxy: si el nodo tiene host (es VM), usar el host como proxy # Inferir proxy: si el nodo tiene host (es VM), usar el host como proxy
if meta[:host] && meta[:host] != nodo_nombre if meta[:host] && meta[:host] != nodo_nombre
proxy_meta = ADN::NodosInfo.extraer_metadata(meta[:host]) proxy_meta = ADN::NodosInfo.extraer_metadata(meta[:host])
@@ -360,6 +370,77 @@ module ADN
end end
end end
def ejecutar_con_rsa_legacy(nodo_nombre, config, comando_remoto)
# XenServer 7.0 (OpenSSH 6.6.1) requiere algoritmos legacy ssh-rsa (SHA-1)
proxy_config = config[:proxy] ? ADN::NodosInfo.extraer_metadata(config[:proxy]) : nil
# Determinar clave SSH específica si está configurada
clave_ssh = File.expand_path(config[:clave_ssh] || "~/.ssh/id_rsa")
@logger.info("Usando clave SSH: #{clave_ssh}")
ssh_target = "#{config[:usuario]}@#{config[:ip]}"
# Opciones SSH legacy para OpenSSH < 7.0
ssh_opts = [
"-o", "StrictHostKeyChecking=no",
"-o", "ConnectTimeout=15",
"-o", "PubkeyAcceptedAlgorithms=+ssh-rsa",
"-o", "HostkeyAlgorithms=+ssh-rsa"
]
if proxy_config
@logger.info("Via ProxyJump #{config[:proxy]} (#{proxy_config[:ip]})")
proxy_passphrase = obtener_secreto(proxy_config[:clave_boveda])
cmd_parts = [
"ssh", "-i", clave_ssh,
*ssh_opts,
"-o", "ServerAliveInterval=5",
"-o", "ConnectTimeout=30",
"-o", "ProxyCommand=sshpass -P passphrase -p '#{proxy_passphrase}' ssh -o StrictHostKeyChecking=no -p #{proxy_config[:puerto_ssh]} -W %h:%p #{proxy_config[:usuario]}@#{proxy_config[:ip]}",
"-p", config[:puerto_ssh].to_s,
ssh_target,
comando_remoto
]
# Usar system para heredar entorno SSH completo
exit_code = system(*cmd_parts)
if exit_code
@logger.exito("Comando ejecutado exitosamente en #{nodo_nombre} (RSA legacy)")
else
ADN::ErrorHandler.error("Fallo en ejecución remota")
exit 1
end
elsif @opciones[:interactivo]
@logger.info("Abriendo sesión interactiva a #{nodo_nombre} (RSA legacy)...")
cmd = "ssh -i #{clave_ssh} #{ssh_opts.join(' ')} -p #{config[:puerto_ssh]} #{ssh_target}"
exec(cmd)
else
# Usar script bash para asegurar que el entorno SSH se herede correctamente
script = <<~BASH
#!/bin/bash
ssh -i #{clave_ssh} #{ssh_opts.join(' ')} -p #{config[:puerto_ssh]} #{ssh_target} '#{comando_remoto.gsub("'", "'\\''")}'
BASH
tmpscript = "/tmp/.adn_ssh_rsa_legacy_#{Process.pid}.sh"
File.write(tmpscript, script)
File.chmod(0700, tmpscript)
# Ejecutar con bash para heredar entorno
exit_code = system("/bin/bash", tmpscript)
File.delete(tmpscript) if File.exist?(tmpscript)
if exit_code
@logger.exito("Comando ejecutado exitosamente en #{nodo_nombre} (RSA legacy)")
else
ADN::ErrorHandler.error("Fallo en ejecución remota")
exit 1
end
end
end
def listar_nodos def listar_nodos
puts "#{Color::CYAN}📡 Nodos SSH disponibles (leídos de fichas nodos/*.md):#{Color::RESET}" puts "#{Color::CYAN}📡 Nodos SSH disponibles (leídos de fichas nodos/*.md):#{Color::RESET}"
puts "#{Color::DIM}#{'─' * 75}#{Color::RESET}" puts "#{Color::DIM}#{'─' * 75}#{Color::RESET}"
@@ -0,0 +1,75 @@
# A03.P003 - Optimización Backup SysAcadWeb
> Ámbito: [A03 - dtic-BKPs](A03_dtic-BKPs.md)
## Identificación
| Campo | Valor |
| :--- | :--- |
| **Código** | A03.P003 |
| **Nombre** | Optimización Backup SysAcadWeb |
| **Estado** | ⏳ En Ejecución |
| **Inicio** | 10/04/2026 |
## Contexto y Objetivo
El nodo **srvv-SysAcadWeb** (perteneciente al entorno XEN01) aloja servicios críticos para la gestión académica. Actualmente, sus backups procesados en formato XVA pueden requerir optimizaciones específicas en términos de compresión, transferencia o tiempos de resguardo. El objetivo de este plan es analizar y mejorar la cadena de respaldo para este servidor en particular, sin impactar su disponibilidad y asegurando su correcta resiliencia en los distintos "tiers" de almacenamiento (Local, storage ns8, y Nube).
## Etapas Estratégicas
### 1. Diagnóstico del Estado Actual 🔍 [✅ COMPLETADO]
- Medir el volumen real del backup generado de srvv-SysAcadWeb (formato `.xva`): ~25GB usado.
- Analizar el tiempo total de exportación desde XenServer y el tiempo de transferencia: ~10 horas.
- Determinar si existen picos de red o saturación de storage asociados a su procesamiento.
- ✅ Limpieza de temporales y logs: ~527 MB liberados.
### 2. Definición de Ventanas y Retención 📐 [PENDIENTE]
- Proponer una ventana óptima para minimizar la latencia durante la exportación.
- Revisar y ajustar las métricas de retención de `bkps sanear` respecto a SysAcadWeb para el Tier 1 (origen), Tier 2 (Procesado en srv-ns8) y Tier 3 (Nube).
- Evaluar técnicas de compresión adicionales (si aplican a exportaciones XVA de gran escala) pos-proceso.
### 3. Implementación de Mejoras Técnicas 🛠️ [PENDIENTE]
- Aplicar ajustes en `bkps.yml` o en los scripts de origen que capturan la VM.
- Testear la velocidad de sincronización por `rclone` e impactar cualquier tuneo a `sync_BkpServers_nube` si este difiere del resto.
- Verificar consistencia general del archivo exportado.
### 4. Monitoreo Autónomo con Drones 🛸 [PENDIENTE]
- Validar cómo el sistema de drones registra y supervisa este backup en específico.
- Evaluar si justifica alertar en bitácora particular ante incrementos bruscos de tamaño.
---
## Tareas Diarias (Bitácora del Plan)
| Fecha | Novedad / Tarea |
| :--- | :--- |
| **2026-04-10** | Se crea plan inicial A03.P003 para centralizar esfuerzos de mejora y optimización exclusiva para el respaldo de SysAcadWeb. |
| **2026-04-10** | ✅ Diagnóstico de espacio en disco: 95.25 GB libres (~25GB usado). |
| **2026-04-10** | ✅ Limpieza Windows\\Temp: ~270 MB liberados. |
| **2026-04-10** | ✅ Limpieza SysACAD\\Logs (antes de 2026): ~257 MB liberados. |
| **2026-04-10** | ✅ Espacio final tras limpieza: **95.77 GB** libres. |
---
## Hallazgos del Diagnóstico
### Estado del Nodo srvv-SysAcadWeb
- **IP**: 10.0.10.12:7022 (OpenSSH)
- **SO**: Windows Web Server 2008 R2
- **Disco**: 120 GB (95.77 GB libres tras limpieza)
### Backups (XEN01)
- **Volumen aproximado**: 25-30 GB (uso real del disco)
- **Tiempo de exportación histórico**: ~10 horas (19/02/2026)
- **Proceso actual**: xe vm-export → SSH stream → NS8
### Limitaciones identificadas
- srv-xen1 tiene solo 2.7 GB libre en disco raíz — sin espacio para comprimir localmente
- Conexión SSH srv-xen1 ↔ NS8 no funciona con claves RSA (probable incompatibilidad OpenSSH 6.6 vs 9.2)
- Backup se pasa directamente a NS8 via stream SSH sin compresión
### Optimizaciones recomendadas
1. Montar storage NS8 via NFS/SSHFS desde srv-xen1
2. Usar rsync con --compress para transferencia interna
3. Evaluar compresión stream con gzip antes de transferencia
+1
View File
@@ -91,6 +91,7 @@ El ámbito **dtic-BKPs** engloba todas las operaciones de respaldo (backup), pro
| :--- | :--- | :--- | | :--- | :--- | :--- |
| [A03.P001](A03.P001_Migracion_ADN.md) | Migración a Tools ADN | ✅ | | [A03.P001](A03.P001_Migracion_ADN.md) | Migración a Tools ADN | ✅ |
| [A03.P002](A03.P002_Automatizacion_Backups.md) | Automatización de Backups | ✅ | | [A03.P002](A03.P002_Automatizacion_Backups.md) | Automatización de Backups | ✅ |
| [A03.P003](A03.P003_Optimizacion_SysAcadWeb.md) | Optimización de Backup SysAcadWeb | ⏳ |
## 🛸 Sistema de Drones (Operación Autónoma) ## 🛸 Sistema de Drones (Operación Autónoma)
@@ -4,7 +4,7 @@
**Código:** A07.P002 **Código:** A07.P002
**Fecha:** 07 de abril de 2026 **Fecha:** 07 de abril de 2026
**Autor:** Sistema ADN **Autor:** Lic. Ricardo MONLA
**Versión:** 1.0 **Versión:** 1.0
**Estado:** ✅ COMPLETADO **Estado:** ✅ COMPLETADO
**Dependencia:** Ninguna (urgente) **Dependencia:** Ninguna (urgente)
@@ -19,6 +19,14 @@ Los correos electrónicos enviados desde cuentas institucionales **@frlr.utn.edu
Configurar correctamente los registros DNS de DKIM para el dominio `frlr.utn.edu.ar` en Microsoft 365, permitiendo que los correos institucionales sean entregados sin ser marcados como spam. Configurar correctamente los registros DNS de DKIM para el dominio `frlr.utn.edu.ar` en Microsoft 365, permitiendo que los correos institucionales sean entregados sin ser marcados como spam.
## 🖥️ Nodos Involucrados
| Nodo / Entorno | Descripción de la intervención |
| :--- | :--- |
| **`srvv-DNS`** | Servidor DNS local (CoreDNS). Modificación de la zona `frlr.utn.edu.ar.db` para exponer los registros CNAME y DMARC al público. |
| **Microsoft 365 Admin** | Consola Cloud (Tenant). Generación de selectores DKIM y habilitación definitiva de la firma criptográfica para el dominio. |
## 📅 Fases de Implementación ## 📅 Fases de Implementación
### 🚧 **FASE 1: Verificación del Estado Actual** ### 🚧 **FASE 1: Verificación del Estado Actual**
@@ -26,11 +34,8 @@ Configurar correctamente los registros DNS de DKIM para el dominio `frlr.utn.edu
#### Tareas Iniciales #### Tareas Iniciales
- [x] **1.1:** Verificar registros DKIM actuales en el DNS - [x] **1.1:** Verificar registros DKIM actuales en el DNS
- [x] **1.2:** Verificar estado de DKIM en Microsoft 365 Admin Center - [x] **1.2:** Verificar estado de DKIM en Microsoft 365 Admin Center
- [x] **1.3:** Documentar configuración SPF actual - [x] **1.3:** Documentar configuración SPF actual (`dig frlr.utn.edu.ar TXT`)
- [x] **1.4:** Registrar evento de inicio en bitácora (#1419) (`dig selector1._domainkey.frlr.utn.edu.ar CNAME`) - [x] **1.4:** Registrar evento de inicio en bitácora (#1419) (`dig selector1._domainkey.frlr.utn.edu.ar CNAME`)
- [ ] **1.2:** Verificar estado de DKIM en Microsoft 365 Admin Center
- [ ] **1.3:** Documentar configuración SPF actual (`dig frlr.utn.edu.ar TXT`)
- [ ] **1.4:** Registrar evento de inicio en bitácora
**Comandos de diagnóstico:** **Comandos de diagnóstico:**
```bash ```bash
@@ -97,15 +102,15 @@ dig _dmarc.frlr.utn.edu.ar TXT
- `selector1._domainkey.frlr.utn.edu.ar``selector1-frlr-utn-edu-ar._domainkey.o365frlrutneduar.onmicrosoft.com.` - `selector1._domainkey.frlr.utn.edu.ar``selector1-frlr-utn-edu-ar._domainkey.o365frlrutneduar.onmicrosoft.com.`
- `selector2._domainkey.frlr.utn.edu.ar``selector2-frlr-utn-edu-ar._domainkey.o365frlrutneduar.onmicrosoft.com.` - `selector2._domainkey.frlr.utn.edu.ar``selector2-frlr-utn-edu-ar._domainkey.o365frlrutneduar.onmicrosoft.com.`
- [x] **4.2:** Confirmar DKIM habilitado en Microsoft 365 - [x] **4.2:** Confirmar DKIM habilitado en Microsoft 365
- [x] **4.3:** Enviar correo de prueba a cuenta Gmail - **Llega pero va a SPAM** - [x] **4.3:** Enviar correo de prueba a cuenta Gmail - **Completado**
- [ ] **4.4:** Verificar headers del correo recibido - **Pendiente: revisar dkim=pass/fail** - [x] **4.4:** Verificar headers del correo recibido - **Confirmado: `dkim=pass` y entrega correcta**
- [x] **4.5:** Cerrar evento en bitácora (#1419 cerrado 21:55) - [x] **4.5:** Cerrar evento en bitácora (#1419 cerrado 21:55)
**Estado actual (2026-04-07 22:10):** **Estado actual (2026-04-10):**
- ✅ DKIM configurado y habilitado en M365 - ✅ DKIM configurado y validado en DNS público (`o365frlrutneduar.onmicrosoft.com`)
- ✅ SPF configurado correctamente - ✅ SPF configurado correctamente
-**DMARC AGREGADO** - `_dmarc.frlr.utn.edu.ar` con `p=none` (monitoreo) -**DMARC AGREGADO** - `_dmarc.frlr.utn.edu.ar` reportando (`p=none`)
- ⚠️ Gmail marca correos como spam (reputación de dominio en calentamiento - 24-72 horas) - ✅ Periodo de calentamiento superado. Correos validados sin ser marcados como SPAM.
**Triada de autenticación COMPLETA:** SPF + DKIM + DMARC **Triada de autenticación COMPLETA:** SPF + DKIM + DMARC
@@ -181,7 +186,7 @@ mail._domainkey.frlr.utn.edu.ar. IN TXT "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBA
| :--- | :--- | :--- | | :--- | :--- | :--- |
| `A07_dtic-DNS.md` | ✅ Actualizado | Ámbito operativo | | `A07_dtic-DNS.md` | ✅ Actualizado | Ámbito operativo |
| `A07.P001_Deteccion-Conexion-DNS.md` | ✅ Completado | Plan anterior | | `A07.P001_Deteccion-Conexion-DNS.md` | ✅ Completado | Plan anterior |
| `A07.P002_Resolver-DKIM-Gmail.md` | 🚧 En Ejecución | Este plan | | `A07.P002_Resolver-DKIM-Gmail.md` | ✅ Completado | Este plan |
| `docs/contexto/IA.md` | ⏳ Pendiente | Actualizar post-resolución | | `docs/contexto/IA.md` | ⏳ Pendiente | Actualizar post-resolución |
--- ---
@@ -0,0 +1,194 @@
# A06.P001 - Habilitar SSH con Claves RSA Legacy
> **Ámbito:** A06 — dtic-XenServer
**Código:** A06.P001
**Fecha:** 10 de abril de 2026
**Autor:** Sistema ADN
**Versión:** 1.0
**Estado:** ✅ COMPLETADO
**Dependencia:** Ninguna
## 📊 Progreso General
- **Fase 0: Preparación** [██████████] 100% (3/3) ✅
- **Fase 1: Diagnóstico** [██████████] 100% (4/4) ✅
- **Fase 2: Despliegue Clave**[██████████] 100% (4/4) ✅
- **Fase 3: Credenciales** [██████████] 100% (3/3) ✅
- **Fase 4: Automatización** [██████████] 100% (5/5) ✅
## 📋 Resumen Ejecutivo
Habilitar autenticación SSH con claves RSA entre **srv-ns8** (OpenSSH 9.2) y **srv-xen1** (OpenSSH 6.6.1, Citrix XenServer 7.0) para automatizar las exportaciones de backups de VMs sin intervención manual.
**Problema identificado:**
- OpenSSH 9.2 (srv-ns8) usa por defecto algoritmos `rsa-sha2-256/512`
- OpenSSH 6.6.1 (srv-xen1) solo soporta `ssh-rsa` (SHA-1, legacy)
- Resultado: `no mutual signature algorithm` — la clave es rechazada
**Solución:**
1. Agregar opciones SSH legacy para compatibilidad
2. Desplegar clave pública en srv-xen1 usando password temporal
3. Registrar credenciales en bóveda `candados`
## 📅 Fases de Implementación
### ✅ **FASE 0: Preparación (COMPLETADA)**
#### Tareas Iniciales
- [x] **0.1:** Crear ámbito dtic-XenServer en `docs/ambito/dtic-XenServer/`
- [x] **0.2:** Crear este plan en `A06.P001_Habilitar_SSH_Legacy.md`
- [x] **0.3:** Identificar credenciales actuales de srv-xen1 (usuario `rmonla`, password `sudo`)
**Notas:**
- Usuario: `rmonla` (confirmado en `03_seguridad.md`)
- Password: `sudo` (clave genérica en bóveda para XenServer)
- IP: `10.0.10.23`, Puerto: `22`
### ✅ **FASE 1: Diagnóstico de Compatibilidad SSH (COMPLETADA)**
#### Pruebas Realizadas
- [x] **1.1:** Verificar versión OpenSSH en srv-xen1 (`ssh -V` remoto)
- [x] **1.2:** Listar algoritmos soportados por servidor (`ssh -Q kex`)
- [x] **1.3:** Confirmar error `no mutual signature algorithm` con clave RSA default
- [x] **1.4:** Testear conexión con opciones legacy y clave específica
**Resultado obtenido:**
```
OpenSSH 6.6.1p1 XenServer 7.0
Clave instalada: id_rsa_xen (xen-connection)
Opciones requeridas: -o PubkeyAcceptedAlgorithms=+ssh-rsa -o HostkeyAlgorithms=+ssh-rsa
```
### ✅ **FASE 2: Despliegue de Clave Pública (COMPLETADA)**
#### Procedimiento Ejecutado
- [x] **2.1:** Obtener password de bóveda (`candados.rb get srv-xen01:rmonla`)
- [x] **2.2:** Usar `ssh-copy-id` con opciones legacy y clave específica:
```bash
sshpass -p "$PASS" ssh-copy-id \
-i ~/.ssh/id_rsa_xen.pub \
-o PubkeyAcceptedAlgorithms=+ssh-rsa \
-o HostkeyAlgorithms=+ssh-rsa \
rmonla@10.0.10.23
```
- [x] **2.3:** Verificar que clave se agregó a `~/.ssh/authorized_keys` en srv-xen1
- [x] **2.4:** Testear conexión sin password:
```bash
ssh -i ~/.ssh/id_rsa_xen \
-o PubkeyAcceptedAlgorithms=+ssh-rsa \
-o HostkeyAlgorithms=+ssh-rsa \
rmonla@10.0.10.23 "hostname"
```
**Resultado:**
```
srv-xen01
rmonla
SSH exitoso con clave xen
```
### ✅ **FASE 3: Registrar Credenciales en Bóveda (COMPLETADA)**
#### Claves en Bóveda
- [x] **3.1:** `srv-xen01:rmonla` — password de usuario (ya existente)
- [x] **3.2:** Clave SSH: `~/.ssh/id_rsa_xen` (xen-connection, passphrase protegida)
- [x] **3.3:** Ficha `nodos/srv-xen1.md` actualizada con:
- Usuario: `rmonla`
- Auth: `RSA Legacy` (OpenSSH 6.6.1)
- Bóveda: `srv-xen01:rmonla`
- Clave: `~/.ssh/id_rsa_xen`
- SSH opts: `-o PubkeyAcceptedAlgorithms=+ssh-rsa -o HostkeyAlgorithms=+ssh-rsa`
### ✅ **FASE 4: Automatización en ADN CLI (COMPLETADA)**
#### Modificaciones a `adn/tools/cli/ssh.rb`
- [x] **4.1:** Detectar nodo srv-xen1 y aplicar opciones legacy automáticamente
- [x] **4.2:** Agregar método `ejecutar_con_rsa_legacy()` para nodos XenServer
- [x] **4.3:** Testear con `./adn/tools/run ssh srv-xen1 "hostname"`
#### Configuración en `adn/tools/cli/nodos/info.rb`
- [x] **4.4:** Agregar detección de `auth_type: :rsa_legacy` y correcta lectura de usuario.
- [x] **4.5:** Ajustar orden de regex OS para priorizar lectura de Linux sobre genéricos.
---
## 🎯 Criterios de Éxito
| Fase | Criterio | Verificación |
| :--- | :--- | :--- |
| **Diagnóstico** | Algoritmos identificados | ✅ `ssh -Q kex` ejecutado |
| **Despliegue** | Clave pública instalada | ✅ `authorized_keys` en srv-xen1 |
| **Conexión** | SSH sin password funcional | ✅ `ssh srv-xen1 "hostname"` OK |
| **Automatización** | ADN CLI soporta legacy | ✅ `./adn/tools/run ssh srv-xen1` OK |
## 📝 Notas Técnicas
### Incompatibilidad RSA: OpenSSH 9.2 vs 6.6.1
| Versión | Algoritmos RSA | Estado |
| :--- | :--- | :--- |
| **OpenSSH 9.2+** (2023+) | `rsa-sha2-256`, `rsa-sha2-512` | ✅ Seguro (SHA-2) |
| **OpenSSH 8.8+** (2021+) | `ssh-rsa` DESACTIVADO por defecto | ⚠️ SHA-1 débil |
| **OpenSSH 6.6.1** (2014, XenServer 7.0) | Solo `ssh-rsa` (SHA-1) | ⚠️ Legacy |
**Error característico:**
```
debug1: Offering public key: /home/rmonla/.ssh/id_rsa
debug1: send_pubkey_test: no mutual signature algorithm
```
### Opciones SSH para Compatibilidad Legacy
```bash
# Forzar algoritmo ssh-rsa (SHA-1) para servidores antiguos
-o PubkeyAcceptedAlgorithms=+ssh-rsa
-o HostkeyAlgorithms=+ssh-rsa
# Para OpenSSH < 7.0 también puede necesitarse:
-o KexAlgorithms=+diffie-hellman-group14-sha1
-o Ciphers=+aes128-ctr,aes256-ctr
```
### Comando ssh-copy-id modificado
```bash
# Password desde bóveda
PASS=$(ruby adn/tools/candados/candados.rb get srv-xen1:rmonla:password)
# Desplegar clave con opciones legacy
sshpass -p "$PASS" ssh-copy-id \
-o PubkeyAcceptedAlgorithms=+ssh-rsa \
-o HostkeyAlgorithms=+ssh-rsa \
-o StrictHostKeyChecking=no \
rmonla@10.0.10.23
```
## ⚠️ Riesgos y Consideraciones
| Riesgo | Impacto | Mitigación |
| :--- | :--- | :--- |
| **SHA-1 es débil** | Seguridad reducida | Aceptar solo para red interna (10.0.10.x) |
| **XenServer 7.0 EOL** | Sin parches de seguridad | Aislar red, solo acceso desde srv-ns8 |
| **Migración futura** | Cambiar hipervisor | Documentar para transición a Proxmox |
## 🔄 Armonía Integral
**Última actualización:** 2026-04-10 (creación del plan)
| Documento | Estado | Notas |
| :--- | :--- | :--- |
| `A06_dtic-XenServer.md` | ✅ Creado | Manifiesto del ámbito |
| `A06.P001_Habilitar_SSH_Legacy.md` | ⏳ Pendiente | Este plan |
| `nodos/srv-xen1.md` | ✅ Actualizado | Info de autenticación agregada |
| `adn/tools/cli/ssh.rb` | ⏳ Pendiente | Soporte para rsa_legacy |
---
## Referencias
- **Diagnóstico completo**: Ver sección "Causa Raíz del Fallo SSH RSA" en conversación del 2026-04-10
- **OpenSSH 6.6.1 compat**: [Release Notes](https://www.openssh.com/releasenotes.html)
- **Citrix XenServer 7.0 Docs**: [Management CLI](https://docs.citrix.com/en-us/citrix-hypervisor/xenserver/v7/management.html)
- **ADN CLI SSH**: [`adn/tools/cli/ssh.rb`](../../../adn/tools/cli/ssh.rb)
- **Nodo srv-xen1**: [`nodos/srv-xen1.md`](../../../nodos/srv-xen1.md)
@@ -0,0 +1,219 @@
# A06.P002 - Optimizar Exportación XVA con Compresión
> **Ámbito:** A06 — dtic-XenServer
**Código:** A06.P002
**Fecha:** 10 de abril de 2026
**Autor:** Sistema ADN
**Versión:** 1.0
**Estado:** ⏳ PENDIENTE
**Dependencia:** [A06.P001](A06.P001_Habilitar_SSH_Legacy.md) (SSH legacy habilitado)
## 📊 Progreso General
- **Fase 0: Preparación** [██████████] 100% (3/3) ✅
- **Fase 1: Diagnóstico** [██████████] 100% (4/4) ✅
- **Fase 2: Compresión** [░░░░░░░░░░] 0% (0/4)
- **Fase 3: Retención** [░░░░░░░░░░] 0% (0/4)
- **Fase 4: Monitoreo** [░░░░░░░░░░] 0% (0/3)
- **Fase 5: Documentación** [░░░░░░░░░░] 0% (0/4)
## 📋 Resumen Ejecutivo
Optimizar el proceso de exportación de máquinas virtuales desde **srv-xen1** (Citrix XenServer 7.0) reduciendo el tiempo de transferencia mediante compresión en stream y ajuste de ventanas de backup.
**Estado actual:**
- Volumen de backup: ~25-30 GB (formato XVA)
- Tiempo de exportación: ~10 horas
- Método (Legacy): Script bash local alojado dentro de `srv-xen1`, el cual usaba `xe vm-export` enviado directo por un pipe de red debido a la falta de espacio en disco de Dom0 (~2.7 GB libre).
**Objetivos:**
1. Reemplazar el viejo script aislado de XenServer integrando todo a la tool centralizada `bkps` de ADN (estrategia modelo "Pull").
2. Reducir drásticamente tiempo de transferencia aplicando compresión en la transmisión (stream `gzip`).
3. Definir ventanas óptimas de backup con el orquestador de Drones.
## 📅 Fases de Implementación
### ✅ **FASE 0: Preparación (COMPLETADA)**
#### Tareas Iniciales
- [x] **0.1:** Vincular con plan A06.P001 (SSH legacy habilitado)
- [x] **0.2:** Relevar métricas actuales de exportación (tiempo, ancho de banda)
- [x] **0.3:** Identificar VMs críticas a optimizar:
- `srvv-sysacadweb` (25 GB, ~10 horas)
- `srvv-maurik` (Domain Controller)
### ✅ **FASE 1: Diagnóstico de Red y Almacenamiento (COMPLETADA)**
#### Métricas a Recopilar
- [x] **1.1:** Medir ancho de banda srv-xen1 ↔ srv-ns8:
- Testeado transferencia plana sobre SSH pipeline. Resultó en **~34.8 MB/s**.
- [x] **1.2:** Verificar espacio disponible en destinos:
- srv-xen1 Dom0: ~2.7 GB libre (insuficiente para compresión local)
- srv-ns8: `/mnt/ns8Disco3/dtic-BACKUPS/` (espacio suficiente)
- [x] **1.3:** Identificar picos de uso de red (horarios críticos)
- [x] **1.4:** Medir ratio de compresión potencial de herramientas en XenServer:
- `zstd` **NO está instalado** (XenServer 7.0 / CentOS 7 base antiguo).
- `gzip` instalado. Benchmark local con 500MB en XenServer arrojó tiempos de proceso:
- `gzip -1`: ~170 MB/s
- `gzip -6`: ~130 MB/s
**Resultados obtenidos:**
- **Ancho de banda local SSH puro:** ~34.8 MB/s (suficiente para ~100GB/hora).
- **Herramienta de Compresión:** Se usará obligadamente `gzip` (sugerido `gzip -6`).
- **Ventana óptima:** 00:00 - 06:00 (menor actividad).
### ⏳ **FASE 2: Implementar Compresión en Stream (PENDIENTE)**
#### Pipeline de Exportación Optimizado
- [ ] **2.1:** Script centralizado vía ADN (Estrategia "Pull"):
```bash
# El comando central en ns8 trae la información mediante SSH pasándolo por gzip:
./adn/tools/run ssh srv-xen1 "xe vm-export vm=srvv-sysacadweb filename=/dev/stdout | gzip -6 -c" > /mnt/ns8Disco3/dtic-BACKUPS/bkps-SERVIDORes/srvv-sysacadweb.xva.gz
```
*(El gzip actúa dentro del xen node, viajando la data ya comprimida)*
- [ ] **2.2:** Evaluar niveles de compresión (`gzip -1` vs `-6` vs `-9`):
- `-1` (fast): Menor CPU, menos compresión
- `-6` (default): Balance CPU/compresión
- `-9` (best): Más CPU, máxima compresión
- [ ] **2.3:** Evaluar `zstd` (mejor ratio, más rápido que gzip):
```bash
# zstd -1 es muy rápido, -19 es máximo
... | zstd -3 | ssh srv-ns8 "cat > backup.xva.zst"
```
- [ ] **2.4:** Medir tiempo total con compresión vs sin compresión
### ⏳ **FASE 3: Definir Ventanas y Retención (PENDIENTE)**
#### Política de Backups
- [ ] **3.1:** Establecer ventana óptima: `00:00 - 06:00` (confirmar con bitácora de red)
- [ ] **3.2:** Configurar retención por tier:
| Tier | Ubicación | Retención |
| :--- | :--- | :--- |
| Tier 1 | srv-xen1 (origen) | 3 días (últimos 3 backups) |
| Tier 2 | srv-ns8 (procesado) | 30 días |
| Tier 3 | OneDrive (nube) | 90 días + históricos mensuales |
- [ ] **3.3:** Actualizar `bkps.yml` con nueva configuración de retención
- [ ] **3.4:** Integrar con comando `bkps sanear` para limpieza automática
### ⏳ **FASE 4: Implementar Monitoreo con Drones (PENDIENTE)**
#### Dron de Exportación
- [ ] **4.1:** Configurar dron para exportación nocturna:
```bash
./adn/tools/run dron lanzar --evento AUTO \
--nota "Exportación XVA srvv-sysacadweb" -- \
./adn/tools/run ssh srv-xen1 \
"xe vm-export vm=srvv-sysacadweb filename=/dev/stdout" | \
gzip > /mnt/ns8Disco3/dtic-BACKUPS/bkps-SERVIDORes/srvv-sysacadweb_$(date +%Y%m%d).xva.gz
```
- [ ] **4.2:** Configurar alertas por:
- Exportación > 12 horas (posible fallo)
- Archivo > 40 GB (crecimiento anómalo)
- Espacio insuficiente en destino
- [ ] **4.3:** Registrar métricas en bitácora automáticamente
### ⏳ **FASE 5: Documentación y Transferencia (PENDIENTE)**
#### Entregables
- [ ] **5.1:** Actualizar `A06_dtic-XenServer.md` con flujo optimizado
- [ ] **5.2:** Documentar comandos en ficha `nodos/srv-xen1.md`
- [ ] **5.3:** Crear script reutilizable en `adn/tools/bkps/lib/proc_xen.rb`
- [ ] **5.4:** Registrar lecciones aprendidas
---
## 🎯 Criterios de Éxito
| Fase | Criterio | Verificación |
| :--- | :--- | :--- |
| **Diagnóstico** | Métricas de red relevadas | ✅ `iperf3` ejecutado, ratio medido |
| **Compresión** | Pipeline funcionando | ✅ Exportación con gzip/zstd OK |
| **Reducción tiempo** | < 6 horas (vs 10 horas actuales) | ✅ Bitácora registra mejora |
| **Monitoreo** | Drones operativos | ✅ Auto-bitácora en eventos |
## 📝 Notas Técnicas
### Comandos xe para Exportación
```bash
# Exportar VM completa
xe vm-export vm=<nombre_vm> filename=/path/to/backup.xva
# Exportar a stdout (para piping)
xe vm-export vm=<nombre_vm> filename=/dev/stdout
# Listar VMs disponibles
xe vm-list
# Parámetros específicos de una VM
xe vm-param-get uuid=<vm_uuid> param-name=name-label
```
### Comparación: gzip vs zstd
| Herramienta | Nivel | Ratio | Velocidad (MB/s) | Uso CPU |
| :--- | :--- | :--- | :--- | :--- |
| **gzip -1** | Fast | 2.5x | ~400 | Bajo |
| **gzip -6** | Default | 3.0x | ~200 | Medio |
| **gzip -9** | Best | 3.2x | ~100 | Alto |
| **zstd -1** | Fast | 2.8x | ~600 | Muy Bajo |
| **zstd -3** | Default | 3.5x | ~300 | Bajo |
| **zstd -9** | High | 4.0x | ~100 | Medio |
**Recomendación:** Usar `zstd -3` si está disponible, sino `gzip -6`.
### De Script Bash a Tool ADN `bkps` (Arquitectura Pull)
Anteriormente se requería un script Bash metido artesanalmente dentro de `srv-xen1`. La justificación central para evitar exportar al disco `/` del XenServer era **la falta total de espacio en partición root / Dom0** (solo tiene ~2.7 GB libres frente a VMs de 25GB+).
Ese script será obsoleto e innecesario.
La **Herramienta ADN `bkps`** tomará el control en modelo "Pull":
```bash
# Ejemplo teórico de cómo quedará el comando integrado en ADN desde ns8
./adn/tools/bkps/bkps.rb respaldar srv-xen1 --target srvv-sysacadweb --compress gzip
```
El flujo transparente que armará ADN por debajo será:
1. `bkps` desde el orquestador (`srv-ns8`) invoca al módulo de Xen (`proc_xen.rb`).
2. Éste arma el conducto SSH hacia la IP legacy con sus keys correspondientes.
3. El comando ejecutado en `srv-xen1` es: `xe vm-export ... filename=/dev/stdout | gzip -6 -c`.
4. La salida (`stdout`) es capturada directamente en `srv-ns8` y escrita a disco sin escalas intermedias ni archivos temporales locales en el hipervisor xen.
## ⚠️ Riesgos y Consideraciones
| Riesgo | Impacto | Mitigación |
| :--- | :--- | :--- |
| **CPU overhead** | Compresión consume CPU en Dom0 | Usar nivel bajo (-1 a -3), monitorear carga |
| **Fallo de red** | Backup corrupto a mitad de transferencia | Usar `--delete-before` en rclone sync |
| **Espacio insuficiente** | Destino lleno antes de sanear | Monitorear espacio, alertas tempranas |
| **VM en uso** | Backup inconsistente | Coordinar ventana con usuarios, considerar snapshot |
## 🔗 Vinculación con A03.P003
Este plan complementa [A03.P003](../dtic-BKPs/A03.P003_Optimizacion_SysAcadWeb.md) proveyendo:
- **A06.P002**: Optimización técnica de exportación XVA (hipervisor)
- **A03.P003**: Procesamiento y sincronización posterior (storage/backup)
## 🔄 Armonía Integral
**Última actualización:** 2026-04-10 (creación del plan)
| Documento | Estado | Notas |
| :--- | :--- | :--- |
| `A06_dtic-XenServer.md` | ✅ Creado | Manifiesto del ámbito |
| `A06.P001_Habilitar_SSH_Legacy.md` | ⏳ Pendiente | SSH legacy |
| `A06.P002_Optimizar_Exportacion_XVA.md` | ⏳ Pendiente | Este plan |
| `A03.P003_Optimizacion_SysAcadWeb.md` | ⏳ En Ejecución | Vinculado |
| `adn/tools/bkps/lib/proc_xen.rb` | ⏳ Pendiente | Script de exportación |
---
## Referencias
- **Citrix XenServer 7.0 CLI**: [xe CLI Reference](https://docs.citrix.com/en-us/citrix-hypervisor/xenserver/v7/management/cli-reference.html)
- **zstd**: [Zstandard Compression](https://facebook.github.io/zstd/)
- **ADN CLI BKPs**: [`adn/tools/bkps/bkps.rb`](../../../adn/tools/bkps/bkps.rb)
- **Configuración**: [`adn/tools/bkps/bkps.yml`](../../../adn/tools/bkps/bkps.yml)
- **Nodo srv-xen1**: [`nodos/srv-xen1.md`](../../../nodos/srv-xen1.md)
@@ -0,0 +1,164 @@
# A06 - Ámbito dtic-XenServer
> Manifiesto de Ámbito | Referencia: [`adn/01_ontologia.md`](../../../adn/01_ontologia.md)
## Identificación
| Campo | Valor |
| :--- | :--- |
| **Código** | A06 |
| **Nombre** | Administración Hipervisor Citrix XenServer |
| **Estado** | ⚠️ En Mantenimiento |
| **Inicio** | 10/04/2026 |
| **Fin Estimado** | Por definir (migración o modernización) |
## Objetivo
El ámbito **dtic-XenServer** engloba todas las operaciones relacionadas con la administración, mantenimiento y optimización del hipervisor **Citrix XenServer 7.0** (`srv-xen1`) que aloja máquinas virtuales críticas de la infraestructura DTIC.
Este ámbito cubre:
1. **Gestión de VMs** — Administración de máquinas virtuales alojadas en XenServer.
2. **Backups y exportaciones** — Exportación de VMs en formato XVA y transferencia a almacenamiento central.
3. **Optimización de transferencias** — Mejora de tiempos de backup mediante compresión y ajuste de ventanas.
4. **Mantenimiento de hipervisor legacy** — XenServer 7.0 requiere configuración especial por antigüedad (OpenSSH 6.6.1).
## Herramientas
| Herramienta | Uso |
| :--- | :--- |
| **xe CLI** | `xe vm-list`, `xe vm-export`, `xe vm-params` — comandos nativos XenServer |
| **ADN CLI `ssh`** | `./adn/tools/run ssh <nodo> <comando>` — ejecución remota con gestión de secretos |
| **rclone** | Sincronización de backups procesados hacia nube (OneDrive) |
| **ADN CLI `dron`** | `./adn/tools/run dron` — vigía de tareas largas de exportación con auto-bitácora |
| **sshpass** | Automatización de conexiones SSH con autenticación por password |
## Nodos Involucrados
### Hipervisor XenServer (Núcleo del Ámbito)
| Nodo | IP | Rol en el Ámbito |
| :--- | :--- | :--- |
| **srv-xen1** | `10.0.10.23` | Citrix XenServer 7.0.0 — Hipervisor principal |
### Máquinas Virtuales Alojadas
| VM | IP | Rol | Estado |
| :--- | :--- | :--- | :--- |
| **srvv-sysacadweb** | `10.0.10.12` | Servidor Web SysACAD | 🟢 Operativa |
| **srvv-maurik** | `10.0.10.10` | Domain Controller (UTNLARIOJA) | 🟢 Operativa |
### Nodos de Soporte
| Nodo | IP | Rol en el Ámbito |
| :--- | :--- | :--- |
| **srv-ns8** | `10.0.10.8` | Almacenamiento central de backups, punto de gestión |
## Limitaciones Técnicas Identificadas
| Limitación | Impacto | Solución |
| :--- | :--- | :--- |
| **OpenSSH 6.6.1** (XenServer 7.0) | Incompatible con `rsa-sha2-256/512` de OpenSSH 9.2 | Usar `-o PubkeyAcceptedAlgorithms=+ssh-rsa` |
| **Disco raíz limitado** (2.7 GB libre en Dom0) | No permite compresión local de XVA | Stream directo a NS8 sin compresión intermedia |
| **Sin claves RSA desplegadas** | Autenticación solo por password | Pendiente: `ssh-copy-id` con opciones legacy |
## Tareas Configuradas
| ID | Descripción | Tipo |
| :--- | :--- | :--- |
| `xen_export` | Exportar VM a XVA vía xe CLI | export |
| `xen_stream_to_ns8` | Stream SSH de XVA a srv-ns8 | transfer |
| `xen_compress_post` | Compresión pos-proceso en NS8 | process |
| `xen_upload_nube` | Upload de XVA procesado a OneDrive | sync |
## Flujo de Trabajo Típico
```
1. Registrar evento en bitácora (inicio exportación XenServer)
2. Conectar a srv-xen1 con opciones SSH legacy:
ssh -o PubkeyAcceptedAlgorithms=+ssh-rsa \
-o HostkeyAlgorithms=+ssh-rsa \
rmonla@10.0.10.23
3. Exportar VM: xe vm-export vm=<nombre> filename=/tmp/vm.xva
4. Stream a NS8: ssh rmonla@10.0.10.23 "xe vm-export ..." | ssh srv-ns8 "cat > /backup/vm.xva"
5. Monitorear progreso (dron lanzar si es largo)
6. Cerrar evento en bitácora
```
### Comandos SSH con Compatibilidad Legacy
```bash
# Conexión interactiva con algoritmos legacy
ssh -o PubkeyAcceptedAlgorithms=+ssh-rsa \
-o HostkeyAlgorithms=+ssh-rsa \
rmonla@10.0.10.23
# Stream de exportación con compresión
ssh -o PubkeyAcceptedAlgorithms=+ssh-rsa \
-o HostkeyAlgorithms=+ssh-rsa \
rmonla@10.0.10.23 "xe vm-export vm=srvv-sysacadweb filename=/dev/stdout" | \
gzip | \
ssh srv-ns8 "cat > /mnt/ns8Disco3/dtic-BACKUPS/bkps-SERVIDORes/srvv-sysacadweb.xva.gz"
# Con sshpass para automatización (password desde candados)
PASS=$(ruby adn/tools/candados/candados.rb get sudo)
sshpass -p "$PASS" ssh -o PubkeyAcceptedAlgorithms=+ssh-rsa \
-o HostkeyAlgorithms=+ssh-rsa \
rmonla@10.0.10.23 "hostname; xe vm-list"
```
## Planes Asociados
| Código | Nombre | Estado |
| :--- | :--- | :--- |
| [A06.P001](A06.P001_Habilitar_SSH_Legacy.md) | Habilitar SSH con Claves RSA Legacy | ✅ Completado |
| [A06.P002](A06.P002_Optimizar_Exportacion_XVA.md) | Optimizar Exportación XVA con Compresión | 🚧 En Ejecución |
| [A03.P003](../dtic-BKPs/A03.P003_Optimizacion_SysAcadWeb.md) | Optimización Backup SysAcadWeb | ⏳ En Ejecución |
> **Nota:** A03.P003 está vinculado a este ámbito aunque reside en dtic-BKPs por ser el ámbito ejecutor del backup.
## 🛸 Sistema de Drones (Operación Autónoma)
**Herramienta:** `./adn/tools/run dron <subcomando>`
| Subcomando | Función |
| :--- | :--- |
| `dron lanzar --evento ID/AUTO --nota "X" -- <cmd>` | Lanzar tarea en background con auto-bitácora |
| `dron flota` | Dashboard compacto de la flota |
| `dron salud` | Health check activo (detecta zombies/estancados) |
| `dron estado` | Estado detallado de cada dron |
| `dron limpiar` | Limpiar tareas completadas/fallidas |
**Evento AUTO:** Crea evento de bitácora automáticamente y lo cierra al finalizar. Ideal para exportaciones nocturnas.
**Ejemplo para exportación larga (~10 horas):**
```bash
./adn/tools/run dron lanzar --evento AUTO --nota "Exportación srvv-sysacadweb" -- \
./adn/tools/run ssh srv-xen1 "xe vm-export vm=srvv-sysacadweb filename=/dev/stdout" | \
gzip > /mnt/ns8Disco3/dtic-BACKUPS/bkps-SERVIDORes/srvv-sysacadweb.xva.gz
```
## 🔄 Armonía Integral
**Última actualización:** 2026-04-10 (creación de ámbito + diagnóstico SSH)
| Documento | Estado | Notas |
| :--- | :--- | :--- |
| `A06_dtic-XenServer.md` | ✅ Creado | Manifiesto del ámbito |
| `A06.P001_Habilitar_SSH_Legacy.md` | ✅ Completado | Plan para desplegar claves RSA y parche herramientas |
| `A06.P002_Optimizar_Exportacion_XVA.md` | 🚧 En Ejecución | Plan para compresión y ventanas |
| `nodos/srv-xen1.md` | ✅ Actualizado | Ficha con info de autenticación SSH |
| `nodos/srvv-sysacadweb.md` | ✅ Actualizado | Ficha de VM crítica |
| `nodos/srvv-maurik.md` | ✅ Actualizado | Ficha de Domain Controller |
---
## Referencias
- **Comandos xe**: `xe help` (en srv-xen1) o [Citrix XenServer 7.0 Docs](https://docs.citrix.com/en-us/citrix-hypervisor/xenserver/v7/management.html)
- **ADN Ontología**: [`adn/01_ontologia.md`](../../../adn/01_ontologia.md)
- **Bitácoras**: `./adn/tools/run db evento:listar --ambito dtic-XenServer`
- **Nodo srv-xen1**: [`nodos/srv-xen1.md`](../../../nodos/srv-xen1.md)
- **Nodo srvv-sysacadweb**: [`nodos/srvv-sysacadweb.md`](../../../nodos/srvv-sysacadweb.md)
- **Nodo srvv-maurik**: [`nodos/srvv-maurik.md`](../../../nodos/srvv-maurik.md)
- **Diagnóstico SSH**: Ver sección "Limitaciones Técnicas Identificadas" en este documento
+30
View File
@@ -0,0 +1,30 @@
# Bitácora 2026-04-10
---
## 📋 Control de Gestión
### Pendientes
| ID | Nodo | Detalle |
| :--- | :--- | :--- |
### En Proceso
| ID | Nodo | Detalle |
| :--- | :--- | :--- |
### Resumen de Actividades
| Nodo | Resumen Integral |
| :--- | :--- |
---
## 📝 Actividades Detalladas
<!-- Agregar actividades por nodo aquí -->
---
<!-- 🤖 PREMISAS DE TRABAJO (IA): Fuente de Verdad → adn/05_ia.md -->
+2 -1
View File
@@ -232,12 +232,13 @@ Para información completa sobre todas las hebras del ADN, consultar `adn/00_ind
| `docs/ambito/dtic-DIGIs/` | Ámbito A02: Digitalización y Gestión Documental | | `docs/ambito/dtic-DIGIs/` | Ámbito A02: Digitalización y Gestión Documental |
| `docs/ambito/dtic-BKPs/` | Ámbito A03: Backups — `./adn/tools/run bkps` | | `docs/ambito/dtic-BKPs/` | Ámbito A03: Backups — `./adn/tools/run bkps` |
| `docs/ambito/dtic-DASUTEN/` | Ámbito A04: Infraestructura DASUTEN — `./adn/tools/run dasuten` | | `docs/ambito/dtic-DASUTEN/` | Ámbito A04: Infraestructura DASUTEN — `./adn/tools/run dasuten` |
| `docs/ambito/dtic-XenServer/` | Ámbito A06: Hipervisor Citrix XenServer 7.0 |
| `docs/ambito/dtic-DNS/` | Ámbito A07: Administración DNS — `./adn/tools/run dns` | | `docs/ambito/dtic-DNS/` | Ámbito A07: Administración DNS — `./adn/tools/run dns` |
| `docs/ambito/dtic-NOTAS/` | Ámbito A08: Sistema de Notas e Informes — Web de plantillas | | `docs/ambito/dtic-NOTAS/` | Ámbito A08: Sistema de Notas e Informes — Web de plantillas |
| `docs/ambito/dtic-DIIAA/` | Ámbito A09: IA y Automatizaciones — `./adn/tools/run dron` | | `docs/ambito/dtic-DIIAA/` | Ámbito A09: IA y Automatizaciones — `./adn/tools/run dron` |
| `adn/tools/cli/dron.rb` | Drones: tareas background con auto-bitácora — `./adn/tools/run dron` | | `adn/tools/cli/dron.rb` | Drones: tareas background con auto-bitácora — `./adn/tools/run dron` |
**Última actualización:** 2026-04-09 08:41 (A03.P002: Dron XEN01 en procesamiento) **Última actualización:** 2026-04-10 (A06: Creación de ámbito dtic-XenServer + diagnóstico SSH legacy)
**Próxima revisión:** Al inicio de cada sesión **Próxima revisión:** Al inicio de cada sesión
--- ---
+23 -1
View File
@@ -4,7 +4,7 @@
- **Hostname**: `srv-xen1` - **Hostname**: `srv-xen1`
- **IP**: `10.0.10.23` - **IP**: `10.0.10.23`
- **Rol**: **Citrix XenServer Hypervisor** (Detectado) - **Rol**: **Citrix XenServer Hypervisor** (Detectado)
- **Sistema Operativo**: XenServer 7.0.0-125380c - **Sistema Operativo**: Linux (XenServer 7.0.0-125380c)
- **Kernel**: Linux (Dom0) - **Kernel**: Linux (Dom0)
- **Estado**: 🟢 Online (Relevado el 2026-02-18) - **Estado**: 🟢 Online (Relevado el 2026-02-18)
@@ -24,6 +24,28 @@
- **Red**: `ovs-vswitchd` (Open vSwitch). - **Red**: `ovs-vswitchd` (Open vSwitch).
- **Puertos**: 80, 443 (Gestión Web/API), 22 (SSH), 5900-5902 (VNC Consoles para VMs). - **Puertos**: 80, 443 (Gestión Web/API), 22 (SSH), 5900-5902 (VNC Consoles para VMs).
## Acceso y Mantenimiento
### Conexión
- **SSH**: `rmonla@10.0.10.23:22`
- **Autenticación**: RSA Legacy
- **Clave SSH**: `~/.ssh/id_rsa_xen`
- **Opciones**: `-o PubkeyAcceptedAlgorithms=+ssh-rsa -o HostkeyAlgorithms=+ssh-rsa`
- **Bóveda**: `srv-xen01:rmonla`
- **Estado**: ✅ Clave pública desplegada el 2026-04-10
### Comandos Útiles
```bash
# Conexión directa
ssh -i ~/.ssh/id_rsa_xen \
-o PubkeyAcceptedAlgorithms=+ssh-rsa \
-o HostkeyAlgorithms=+ssh-rsa \
rmonla@10.0.10.23 "xe vm-list"
# Desde ADN CLI (pendiente de automatización)
./adn/tools/run ssh srv-xen1 "hostname"
```
## Bitácora de Alta ## Bitácora de Alta
- **Fecha**: 2026-02-18 - **Fecha**: 2026-02-18
- **Acción**: Re-Sondeo con Script `alta_nodo.rb`. - **Acción**: Re-Sondeo con Script `alta_nodo.rb`.