[Tools] ns8-candados: herramienta unificada de seguridad (reemplaza candado.rb + secret_box.rb)
This commit is contained in:
+42
-47
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user