[Tools] ns8-candados: herramienta unificada de seguridad (reemplaza candado.rb + secret_box.rb)

This commit is contained in:
Ricardo Monla
2026-02-28 08:37:44 -03:00
parent 72f1944090
commit 3555b788e7
6 changed files with 277 additions and 193 deletions
+42 -47
View File
@@ -2,7 +2,7 @@
> Referencia canónica: [`adn/00_indice.md`](00_indice.md)
Esta hebra gobierna los protocolos de seguridad de red, gestión de secretos, autorización SSH y contingencia ante fallos críticos de conectividad.
Esta hebra gobierna los protocolos de seguridad de red, gestión de secretos y autorización SSH.
## 1. Protocolo de Seguridad de Red (Hombre Muerto)
@@ -16,78 +16,73 @@ Esta hebra gobierna los protocolos de seguridad de red, gestión de secretos, au
3. **Si no hay confirmación**: Revertir cambios inmediatamente y restaurar estado anterior.
4. **Si hay confirmación**: Hacer cambios persistentes.
## 2. Gestión de Secretos (Bóveda Operativa)
## 2. Gestión de Secretos — `ns8-candados`
Todos los artefactos de seguridad residen en `scripts/seguridad/`.
Herramienta unificada de seguridad: [`tools/ns8-candados/ns8-candados.rb`](../tools/ns8-candados/ns8-candados.rb)
### 2.1 Prohibición de Texto Plano
La Inteligencia Artificial operante tiene **expresamente prohibido** solicitar contraseñas administrativas, tokens o claves privadas al operador, así como también plasmarlas en logs, comandos literales temporales o en la bitácora.
### 2.2 Componentes de la Bóveda
### 2.2 Componentes
| Archivo | Ubicación | Git | Descripción |
| :--- | :--- | :---: | :--- |
| `secret_box.rb` | `scripts/seguridad/` | ✅ | Motor de cifrado AES-256-GCM. Encripta/desencripta payloads. |
| `.agent_secrets.json` | `scripts/seguridad/` | ❌ | Payloads cifrados (sudo, rsa, domain_admin). |
| `ns8-candados.rb` | `tools/ns8-candados/` | ✅ | Script Ruby unificado: cifrado, bóveda y autorización SSH. |
| `.boveda.json` | `tools/ns8-candados/` | ❌ | Payloads AES-256-GCM cifrados. |
| `.master.key` | Raíz del proyecto | ❌ | Clave maestra de la bóveda (nunca en Git). |
### 2.3 Consumo Efímero de Bóveda
Ante requerimientos de escalada de privilegios (`sudo`, `root`, `sshpass`), la IA accederá de forma autónoma a la bóveda:
### 2.3 Comandos Disponibles
```bash
# Ejemplo: ejecutar comando con privilegios en un nodo remoto
CMD_PASS=$(ruby scripts/seguridad/secret_box.rb decrypt "$PAYLOAD")
sshpass -p "$CMD_PASS" ssh root@10.0.10.205 "comando"
ruby tools/ns8-candados/ns8-candados.rb <comando> [args]
```
**Payloads disponibles** (en `.agent_secrets.json`):
- `sudo`: Contraseña de sudo/root del entorno local.
- `rsa`: Passphrase de la llave SSH (`~/.ssh/id_rsa`).
- `domain_admin`: Credenciales de administrador del dominio `dasuten.utnlr`.
| Comando | Descripción |
| :--- | :--- |
| `abrir` | Autorizar SSH (cargar llave con passphrase, sin timeout). |
| `encrypt <texto>` | Cifrar texto plano → token. |
| `decrypt <token>` | Descifrar token → texto plano. |
| `get <clave>` | Obtener secreto de la bóveda (salida limpia para pipelines). |
| `set <clave>` | Guardar secreto (input interactivo sin eco). |
| `rm <clave>` | Eliminar secreto de la bóveda. |
| `list` | Listar claves disponibles. |
## 3. Autorización SSH (Candado)
### 2.4 Consumo Efímero (IA)
```bash
# Obtener password para uso en comando remoto
PASS=$(ruby tools/ns8-candados/ns8-candados.rb get admindasu)
sshpass -p "$PASS" ssh -J root@10.0.10.205 admindasu@10.0.100.12 "cmd"
```
### 2.5 Payloads en la Bóveda
| Clave | Propósito |
| :--- | :--- |
| `sudo` | Contraseña de sudo/root del entorno local. |
| `rsa` | Passphrase de la llave SSH (`~/.ssh/id_rsa`). |
| `domain_admin` | Credenciales del Administrador del dominio `dasuten.utnlr`. |
| `admindasu` | Credenciales del usuario `admindasu` (Domain Admin). |
## 3. Autorización SSH
### 3.1 Problema
La llave SSH del operador está protegida con passphrase. El agente SSH no retiene las identidades entre sesiones. La IA no puede inyectar la passphrase de forma no interactiva sin `expect`.
La llave SSH del operador está protegida con passphrase. El agente SSH no retiene las identidades entre sesiones.
### 3.2 Solución: `candado.rb`
El operador ejecuta el script **interactivamente** para autorizar a la IA durante una ventana de tiempo:
### 3.2 Solución: `ns8-candados.rb abrir`
El operador ejecuta el comando **interactivamente** para cargar su identidad SSH:
```bash
ruby scripts/seguridad/candado.rb [minutos]
ruby tools/ns8-candados/ns8-candados.rb abrir
```
**Flujo:**
1. 🧹 Limpia identidades previas del agente SSH (`ssh-add -D`).
2. 🔑 Pide la passphrase al operador (`ssh-add`).
3. ✅ Verifica que la llave se cargó correctamente.
4. 🔓 Genera un token temporal (`.agent_token`, 5 min por defecto).
5. La IA puede ahora ejecutar comandos SSH sin intervención.
### 3.3 Flujo Operativo Completo
```
OPERADOR IA (Agente)
│ │
│ ruby candado.rb 10 │
│ → Ingresa passphrase │
│ → Token activo 10 min │
│ │
│ "Listo, el candado está abierto"│
│─────────────────────────────────→│
│ │ ssh root@srv-dasu "qm create..."
│ │ (usa llave cargada en agente)
│ │
│ ⏳ Token expira │
│ │ ssh → ❌ (sin identidad)
```
Las identidades permanecen activas mientras dure la sesión del agente SSH (sin timeout artificial).
## 4. Archivos Protegidos (`.gitignore`)
Los siguientes artefactos **nunca** deben ser rastreados por Git:
- `.master.key` (clave maestra de la bóveda)
- `scripts/seguridad/.agent_secrets.json` (payloads cifrados)
- `.agent_token` (token temporal de autorización)
- `tools/ns8-candados/.boveda.json` (payloads cifrados)
- `.agent_token` (token legacy, obsoleto)
- `*.key` (claves privadas)
- `tmp/` (artefactos transitorios de la IA)