Refactorización del pipeline de backups DASUTEN: 1. Flujo simplificado (un solo destino): - Backup directo a X:\ (share srv-ns8) - Eliminado paso intermedio E:\BK_SQL\sysdasuten\ - Reducido de 3 ubicaciones a 2 (X: → /var/tmp/) 2. Módulo común DasuExecutor (lib/dasu_executor.rb): - Centraliza ejecución PowerShell en dasu-sql4 - Centraliza verificación de archivos en fenix - Elimina código repetido en 6 drones (-52% líneas) 3. Drones refactorizados: - dasuten_exportar_srvv-fenix.rb (FULL → X:) - dasuten_exportar_diferencial_srvv-fenix.rb (DIF → X:) - dasuten_transferir_srvv-fenix-srv-ns8.rb (simplificado) - dasuten_restaurar_dasu-sql4.rb (usa DasuExecutor) - dasuten_restaurar_diferencial_dasu-sql4.rb (usa DasuExecutor) - dasuten_download_drive-dasu-sql4.rb (usa DasuExecutor) - dasuten_verificar-integridad_dasu-sql4.rb (usa DasuExecutor) 4. Integración BKPs mantenida: - T8-T15: Tareas individuales - C7: dasuten_full (pipeline semanal) - C8: dasuten_diferencial (pipeline diario) 5. Documentación actualizada: - A04.P006_Backups-DASUTEN.md: flujo simplificado + módulo común - Lecciones aprendidas agregadas 6. Nuevos archivos: - Informes técnicos DASUTEN (docs/informes/2026-04_DASUTEN-migracion/) - A01.P011/P012: Documentación de drones y pipeline - proc_linux.rb, ops.rb: Utilitarios del ecosistema 7. Scripts legacy (para referencia): - orquestador_pipeline.rb, orquestador_pipeline_diferencial.rb - dasuten_upload_srv-ns8-drive.rb
🔐 candados: Acceso Seguro a Contraseñas (Sin Exponer)
Resumen Ejecutivo
candados es la herramienta central de seguridad del ecosistema ADN. Cifra y gestiona secretos con AES-256-GCM, implementando un sistema de Candado Temporal que requiere autorización explícita (30 min) antes de liberar credenciales.
Principio fundamental: Las contraseñas NUNCA deben aparecer en pantalla, logs ni archivos temporales visibles.
⚠️ REGLA DE ORO — NUNCA MOSTRAR CONTRASEÑAS
Esta herramienta está diseñada para que las contraseñas NUNCA se muestren en pantalla ni queden registradas en logs, históricos de shell o archivos temporales visibles.
┌─────────────────────────────────────────────────────────────────────┐
│ 🛡️ NUNCA uses `get` en comandos automatizados o logs │
│ │
│ ✅ CORRECTO: ruby candados.rb run <clave> 'ssh $USR@host' │
│ ❌ INCORRECTO: ruby candados.rb get <clave> | algo │
│ │
│ El comando `get` imprime la contraseña a stdout → queda en logs │
│ El comando `run` inyecta USR/PASS en el entorno → no deja rastro │
└─────────────────────────────────────────────────────────────────────┘
📥 MÉTODOS PARA CARGAR CONTRASEÑAS EN VARIABLES
★ MÉTODO 1: run (PRIMARIO - Recomendado para comandos)
Ejecuta un comando con USR y PASS inyectadas en su entorno. La contraseña NUNCA se imprime ni queda en logs.
# Sintaxis
ruby candados.rb run <clave> 'comando que usa $USR y $PASS'
# Ejemplos
ruby candados.rb run srv-dasu:rmonla 'sshpass -p $PASS ssh $USR@host'
ruby candados.rb run srv-ns8:root 'ssh $USR@$HOSTNAME "comando"'
¿Qué pasa internamente?
- Descifra las credenciales de la bóveda
- Las inyecta como
USRyPASSen el entorno del subproceso - Ejecuta el comando
- Limpia las variables al terminar
- Nada se imprime en pantalla ni queda en logs
★ MÉTODO 2: load (Para shell interactivo)
Carga USR y PASS en variables de entorno del shell actual. Usa un archivo temporal (600) que se auto-elimina tras el source.
# Sintaxis
eval $(ruby candados.rb load <clave>)
# Ejemplo
eval $(ruby candados.rb load srv-dasu:rmonla)
# → Carga $USR y $PASS en tu shell actual
sshpass -p $PASS ssh $USR@servidor
Seguridad: El archivo temporal tiene permisos 600 y se auto-borra inmediatamente después del source.
⚙️ Arquitectura
- Cripto: Motor AES-256-GCM con IV aleatorio y autenticación.
- Bóveda: Persistencia cifrada en
.boveda.json(permisos 600). - MFA Temporal: Sesiones de 30 min via
.session(permisos 600). - Master Key:
.master.keylocal (permisos 600, nunca se comparte).
🔒 Comando: sudo
Ejecuta comandos con privilegios, resolviendo la contraseña automáticamente:
ruby candados.rb sudo tailscale set --operator=$USER
ruby candados.rb sudo apt update
La clave se busca automáticamente:
<hostname>:<usuario>:sudo(ej:ns8:rmonla:sudo)- Variantes normalizadas del hostname
- Fallback genérico:
sudo
🔑 Resolución Automática de Claves
Los comandos run y load detectan automáticamente el par usuario/contraseña:
| Formato de clave | USR | PASS |
|---|---|---|
srv-dasu:rmonla |
rmonla (parte después de :) |
Valor cifrado |
tailscale_dasuten_pass |
Busca tailscale_dasuten_user |
Valor cifrado |
admindasu |
Busca admindasu_user (si existe) |
Valor cifrado |
📋 Referencia Rápida
| Comando | Seguridad | Descripción |
|---|---|---|
run <clave> <cmd> |
✅ Nada expuesto | ★ PRIMARIO - Ejecuta con USR/PASS inyectados |
load <clave> |
✅ Archivo temporal 600 | Carga en shell (usar con eval) |
sudo <cmd> |
✅ Nada expuesto | Ejecuta con privilegios desde bóveda |
authorize |
✅ | Abrir candado (30 min) |
cerrar |
✅ | Cerrar sesión manualmente |
set <clave> |
✅ Input sin eco | Guardar secreto |
list |
✅ | Listar claves (no muestra valores) |
get <clave> |
⚠ Imprime a stdout | Obtener valor directo (⚠ solo uso manual) |
🛡️ Auditoría
Archivo access.log (permisos 600) registra:
- Timestamp y Usuario del SO
- Acción:
AUTHORIZE,GET,LOAD,RUN,SUDO,LOCK,DENIED,EXPIRED - Detalle: Clave solicitada y comando ejecutado
🧠 Contexto para IA
- Siempre ejecutar
authorizeantes de operar (sesión de 30 min) - Usar
runcomo método primario (inyecta USR/PASS, no imprime) - Usar
loadpara shell interactivo (eval + source) - Evitar
geten automatizaciones (imprime la contraseña) - Cerrar sesión con
cerrarcuando ya no se necesite
# Flujo típico
ruby candados.rb authorize
ruby candados.rb run srv-dasu:rmonla 'sshpass -p $PASS ssh $USR@host "ls"'
ruby candados.rb cerrar
Generado siguiendo docs/prompt/documentacion.md