diff --git a/adn/01_ontologia.md b/adn/01_ontologia.md index b134732d..1bbe8621 100644 --- a/adn/01_ontologia.md +++ b/adn/01_ontologia.md @@ -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/* | | **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 | +| **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-* | ### Relaciones @@ -99,12 +101,20 @@ GET /api/entradas?ambito_id=2 ### 🏔️ 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`) *Citrix XenServer 7.0.0 | Xeon E3-1230 (4C) | Hypervisor Legacy* + | VMID | Nodo | IP | Rol | | :--- | :--- | :--- | :--- | -| - | **[srvv-sysacadweb](../nodos/srvv-sysacadweb.md)** | *Interna* | Web SysACAD | -| - | **[srvv-maurik](../nodos/srvv-maurik.md)** | *Desconocida* | Domain Controller | +| - | **[srvv-sysacadweb](../nodos/srvv-sysacadweb.md)** | `10.0.10.12` | Web SysACAD | +| - | **[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) diff --git a/adn/tools/candados/.boveda.json b/adn/tools/candados/.boveda.json index 9d14f4b2..0f13e004 100644 --- a/adn/tools/candados/.boveda.json +++ b/adn/tools/candados/.boveda.json @@ -12,5 +12,6 @@ "deepseek_key": "eyJpdiI6InRCc2IvL3J4SGNsejgvL04iLCJ0YWciOiJBbjRlMTNXNlZzUGhNSWowSUU1a01nPT0iLCJkYXRhIjoiQXR4azk1aU9sb2QydzNwa0FMTHpjVkJKQTIvZU4wY1U2V2crK3NBbVd1UnRmUGh6In0=", "srv-ns8:rmonla": "eyJpdiI6IlJ4cHZkbFpJQWVsTTl3T1YiLCJ0YWciOiJ3WTZGMDEvNHNsZm1wZm5jMEF4Q1lBPT0iLCJkYXRhIjoibFljUHRYTm44bUxvQjhCa2tBPT0ifQ==", "dasu-sql3:Administrador": "eyJpdiI6IlRiMDh3U1N2aVhTcDYzbzciLCJ0YWciOiI5NVNyUDFlMXlrM0dGRlNqUXhLbEt3PT0iLCJkYXRhIjoiVkp2V09zSjczcS96UktTSlZTOFdBdz09In0=", - "srvv-nginx-rm:rmonla": "eyJpdiI6ImFsQnk5UjhLaDFYWHJsWnciLCJ0YWciOiJJaEtCS215ekkwYVdFR0ZHNzFVN0VBPT0iLCJkYXRhIjoiUkcvSS9sMjhoQnFpRmZobFZBPT0ifQ==" -} \ No newline at end of file + "srvv-nginx-rm:rmonla": "eyJpdiI6ImFsQnk5UjhLaDFYWHJsWnciLCJ0YWciOiJJaEtCS215ekkwYVdFR0ZHNzFVN0VBPT0iLCJkYXRhIjoiUkcvSS9sMjhoQnFpRmZobFZBPT0ifQ==", + "srv-xen01:rmonla": "eyJpdiI6ImdURFJuRDNucGpETkxVVjAiLCJ0YWciOiJWdnNzdmRxRGthS0RnUTBWeE1xYUpRPT0iLCJkYXRhIjoiaGszT2lYRkNONVVWakFhQjdnPT0ifQ==" +} diff --git a/adn/tools/cli/nodos/info.rb b/adn/tools/cli/nodos/info.rb index b528d013..ec8c2b88 100644 --- a/adn/tools/cli/nodos/info.rb +++ b/adn/tools/cli/nodos/info.rb @@ -22,7 +22,9 @@ module ADN puerto_ssh: detectar_puerto_ssh(contenido) || 22, usuario: detectar_usuario(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 @@ -100,8 +102,8 @@ module ADN # | Sistema Operativo | ... | o - **Sistema Operativo**: ... if contenido =~ /(?:\||\-)\s*\*\*?(?:Sistema Operativo|SO|OS)\*\*?\s*[:\|]\s*([^\|\n]+)/i 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 :linux if so_raw =~ /linux|ubuntu|debian|centos|rocky|proxmox/i end :linux # Default end @@ -143,6 +145,11 @@ module ADN end 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 match = $1.downcase return :passphrase if match == 'passphrase' @@ -151,5 +158,27 @@ module ADN end :password # Default para VMs Windows 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 diff --git a/adn/tools/cli/ssh.rb b/adn/tools/cli/ssh.rb index d7a3e7f3..36d536a6 100644 --- a/adn/tools/cli/ssh.rb +++ b/adn/tools/cli/ssh.rb @@ -122,8 +122,8 @@ module ADN contexto_str = contexto.any? ? " [#{contexto.join(' ')}]" : "" @logger.info("Conectando a #{nodo_nombre}#{contexto_str} (#{config[:ip]}:#{config[:puerto_ssh]})") - # Autorizar candados - autorizar_candados + # Autorizar candados solo si es necesario (password o passphrase) + autorizar_candados unless config[:auth_type] == :rsa_legacy case config[:auth_type] when :passphrase @@ -132,16 +132,26 @@ module ADN ejecutar_con_password(nodo_nombre, config, comando_remoto) when :rsa ejecutar_con_rsa(nodo_nombre, config, comando_remoto) + when :rsa_legacy + ejecutar_con_rsa_legacy(nodo_nombre, config, comando_remoto) end end def obtener_config(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 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 if meta[:host] && meta[:host] != nodo_nombre proxy_meta = ADN::NodosInfo.extraer_metadata(meta[:host]) @@ -360,6 +370,77 @@ module ADN 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 puts "#{Color::CYAN}📡 Nodos SSH disponibles (leídos de fichas nodos/*.md):#{Color::RESET}" puts "#{Color::DIM}#{'─' * 75}#{Color::RESET}" diff --git a/docs/ambito/dtic-BKPs/A03.P003_Optimizacion_SysAcadWeb.md b/docs/ambito/dtic-BKPs/A03.P003_Optimizacion_SysAcadWeb.md new file mode 100644 index 00000000..f5d2a25c --- /dev/null +++ b/docs/ambito/dtic-BKPs/A03.P003_Optimizacion_SysAcadWeb.md @@ -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 + diff --git a/docs/ambito/dtic-BKPs/A03_dtic-BKPs.md b/docs/ambito/dtic-BKPs/A03_dtic-BKPs.md index 7098407f..8cd43f11 100644 --- a/docs/ambito/dtic-BKPs/A03_dtic-BKPs.md +++ b/docs/ambito/dtic-BKPs/A03_dtic-BKPs.md @@ -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.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) diff --git a/docs/ambito/dtic-DNS/A07.P002_Resolver-DKIM-Gmail.md b/docs/ambito/dtic-DNS/A07.P002_Resolver-DKIM-Gmail.md index 0223ba0e..d38a7e51 100644 --- a/docs/ambito/dtic-DNS/A07.P002_Resolver-DKIM-Gmail.md +++ b/docs/ambito/dtic-DNS/A07.P002_Resolver-DKIM-Gmail.md @@ -4,7 +4,7 @@ **Código:** A07.P002 **Fecha:** 07 de abril de 2026 -**Autor:** Sistema ADN +**Autor:** Lic. Ricardo MONLA **Versión:** 1.0 **Estado:** ✅ COMPLETADO **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. +## 🖥️ 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 ### 🚧 **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 - [x] **1.1:** Verificar registros DKIM actuales en el DNS - [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`) -- [ ] **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:** ```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.` ✓ - `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.3:** Enviar correo de prueba a cuenta Gmail - **Llega pero va a SPAM** -- [ ] **4.4:** Verificar headers del correo recibido - **Pendiente: revisar dkim=pass/fail** +- [x] **4.3:** Enviar correo de prueba a cuenta Gmail - **Completado** +- [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) -**Estado actual (2026-04-07 22:10):** -- ✅ DKIM configurado y habilitado en M365 +**Estado actual (2026-04-10):** +- ✅ DKIM configurado y validado en DNS público (`o365frlrutneduar.onmicrosoft.com`) - ✅ SPF configurado correctamente -- ✅ **DMARC AGREGADO** - `_dmarc.frlr.utn.edu.ar` con `p=none` (monitoreo) -- ⚠️ Gmail marca correos como spam (reputación de dominio en calentamiento - 24-72 horas) +- ✅ **DMARC AGREGADO** - `_dmarc.frlr.utn.edu.ar` reportando (`p=none`) +- ✅ Periodo de calentamiento superado. Correos validados sin ser marcados como SPAM. **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.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 | --- diff --git a/docs/ambito/dtic-DNS/A07.P002_Resolver-DKIM-Gmail.pdf b/docs/ambito/dtic-DNS/A07.P002_Resolver-DKIM-Gmail.pdf new file mode 100644 index 00000000..643047d1 Binary files /dev/null and b/docs/ambito/dtic-DNS/A07.P002_Resolver-DKIM-Gmail.pdf differ diff --git a/docs/ambito/dtic-XenServer/A06.P001_Habilitar_SSH_Legacy.md b/docs/ambito/dtic-XenServer/A06.P001_Habilitar_SSH_Legacy.md new file mode 100644 index 00000000..403b6dea --- /dev/null +++ b/docs/ambito/dtic-XenServer/A06.P001_Habilitar_SSH_Legacy.md @@ -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) diff --git a/docs/ambito/dtic-XenServer/A06.P002_Optimizar_Exportacion_XVA.md b/docs/ambito/dtic-XenServer/A06.P002_Optimizar_Exportacion_XVA.md new file mode 100644 index 00000000..a59bf84b --- /dev/null +++ b/docs/ambito/dtic-XenServer/A06.P002_Optimizar_Exportacion_XVA.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= filename=/path/to/backup.xva + +# Exportar a stdout (para piping) +xe vm-export vm= filename=/dev/stdout + +# Listar VMs disponibles +xe vm-list + +# Parámetros específicos de una VM +xe vm-param-get 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) diff --git a/docs/ambito/dtic-XenServer/A06_dtic-XenServer.md b/docs/ambito/dtic-XenServer/A06_dtic-XenServer.md new file mode 100644 index 00000000..844661ad --- /dev/null +++ b/docs/ambito/dtic-XenServer/A06_dtic-XenServer.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 ` — 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= 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 | Función | +| :--- | :--- | +| `dron lanzar --evento ID/AUTO --nota "X" -- ` | 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 diff --git a/docs/bitacoras/2026-04-10.md b/docs/bitacoras/2026-04-10.md new file mode 100644 index 00000000..062c7b99 --- /dev/null +++ b/docs/bitacoras/2026-04-10.md @@ -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 + + + +--- + + diff --git a/docs/contexto/IA.md b/docs/contexto/IA.md index f7035ce3..042a6693 100644 --- a/docs/contexto/IA.md +++ b/docs/contexto/IA.md @@ -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-BKPs/` | Ámbito A03: Backups — `./adn/tools/run bkps` | | `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-NOTAS/` | Ámbito A08: Sistema de Notas e Informes — Web de plantillas | | `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` | -**Ú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 --- diff --git a/nodos/srv-xen1.md b/nodos/srv-xen1.md index bbc56e5b..12710b14 100644 --- a/nodos/srv-xen1.md +++ b/nodos/srv-xen1.md @@ -4,7 +4,7 @@ - **Hostname**: `srv-xen1` - **IP**: `10.0.10.23` - **Rol**: **Citrix XenServer Hypervisor** (Detectado) -- **Sistema Operativo**: XenServer 7.0.0-125380c +- **Sistema Operativo**: Linux (XenServer 7.0.0-125380c) - **Kernel**: Linux (Dom0) - **Estado**: 🟢 Online (Relevado el 2026-02-18) @@ -24,6 +24,28 @@ - **Red**: `ovs-vswitchd` (Open vSwitch). - **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 - **Fecha**: 2026-02-18 - **Acción**: Re-Sondeo con Script `alta_nodo.rb`.