docs: Actualización de contexto IA, Drones, Candados y nuevos nodos
This commit is contained in:
@@ -1,31 +1,43 @@
|
||||
# 🔐 candados: Gestión Segura de Secretos
|
||||
# 🔐 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 (5 min) antes de liberar credenciales.
|
||||
`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.
|
||||
**Principio fundamental:** Las contraseñas **NUNCA** deben aparecer en pantalla, logs ni archivos temporales visibles.
|
||||
|
||||
---
|
||||
|
||||
## ⚙️ 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 5 min via `.session` (permisos 600).
|
||||
- **Master Key**: `.master.key` local (permisos 600, nunca se comparte).
|
||||
## ⚠️ REGLA DE ORO — NUNCA MOSTRAR CONTRASEÑAS
|
||||
|
||||
## 🚀 Comando Primario: `run` ★
|
||||
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.
|
||||
|
||||
El comando `run` es la forma **recomendada** de usar credenciales. Inyecta `USR` y `PASS` directamente en el entorno del subproceso sin imprimir nada:
|
||||
```
|
||||
┌─────────────────────────────────────────────────────────────────────┐
|
||||
│ 🛡️ 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.
|
||||
|
||||
```bash
|
||||
# 1. Autorizar (dura 5 min)
|
||||
ruby candados.rb authorize
|
||||
# Sintaxis
|
||||
ruby candados.rb run <clave> 'comando que usa $USR y $PASS'
|
||||
|
||||
# 2. Ejecutar comando con credenciales inyectadas
|
||||
ruby candados.rb run srv-dasu:rmonla 'sshpass -p $PASS ssh $USR@host "comando"'
|
||||
|
||||
# Retrocompatible con variable legacy (SSHPASS, etc.)
|
||||
ruby candados.rb run admindasu SSHPASS 'sshpass -e ssh root@host'
|
||||
# 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?**
|
||||
@@ -35,6 +47,30 @@ ruby candados.rb run admindasu SSHPASS 'sshpass -e ssh root@host'
|
||||
4. Limpia las variables al terminar
|
||||
5. **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.
|
||||
|
||||
```bash
|
||||
# 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.key` local (permisos 600, nunca se comparte).
|
||||
|
||||
## 🔒 Comando: `sudo`
|
||||
|
||||
Ejecuta comandos con privilegios, resolviendo la contraseña automáticamente:
|
||||
@@ -49,20 +85,7 @@ La clave se busca automáticamente:
|
||||
2. Variantes normalizadas del hostname
|
||||
3. Fallback genérico: `sudo`
|
||||
|
||||
## 📦 Comando Secundario: `load`
|
||||
|
||||
Para uso interactivo cuando se necesitan las variables en el shell actual. **Nunca imprime la contraseña:**
|
||||
|
||||
```bash
|
||||
eval $(ruby candados.rb load srv-dasu:rmonla)
|
||||
# USR y PASS están disponibles en el shell
|
||||
```
|
||||
|
||||
Internamente escribe los exports a un archivo temporal (`tmp/.candados_env_<hex>`) con permisos `600`, y a stdout solo emite el comando `source` + autoborrado.
|
||||
|
||||
**Nota:** Los temporales se guardan en `tmp/` del repositorio (no en `/tmp/`) para cumplir con el principio 11 de `05_ia.md` (Workspace Bounds).
|
||||
|
||||
## 🔑 Resolución Automática de Pares
|
||||
## 🔑 Resolución Automática de Claves
|
||||
|
||||
Los comandos `run` y `load` detectan automáticamente el par usuario/contraseña:
|
||||
|
||||
@@ -77,12 +100,13 @@ Los comandos `run` y `load` detectan automáticamente el par usuario/contraseña
|
||||
| Comando | Seguridad | Descripción |
|
||||
|---|---|---|
|
||||
| `run <clave> <cmd>` | ✅ Nada expuesto | **★ PRIMARIO** - Ejecuta con USR/PASS inyectados |
|
||||
| `sudo <cmd>` | ✅ Nada expuesto | Ejecuta con privilegios desde bóveda |
|
||||
| `load <clave>` | ✅ Archivo temporal 600 | Carga en shell (usar con `eval`) |
|
||||
| `get <clave>` | ⚠ Imprime a stdout | Obtener valor directo (usar con cuidado) |
|
||||
| `authorize` | ✅ | Abrir candado (5 min) |
|
||||
| `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 |
|
||||
| `list` | ✅ | Listar claves (no muestra valores) |
|
||||
| `get <clave>` | ⚠ Imprime a stdout | Obtener valor directo (⚠ solo uso manual) |
|
||||
|
||||
## 🛡️ Auditoría
|
||||
|
||||
@@ -93,12 +117,14 @@ Archivo `access.log` (permisos 600) registra:
|
||||
|
||||
## 🧠 Contexto para IA
|
||||
|
||||
1. **Siempre** ejecutar `authorize` antes de operar
|
||||
2. **Usar `run`** como método primario (inyecta, no imprime)
|
||||
3. **Evitar `get`** en comandos automatizados (filtra en logs)
|
||||
4. Cerrar sesión con `cerrar` cuando ya no se necesite
|
||||
1. **Siempre** ejecutar `authorize` antes de operar (sesión de 30 min)
|
||||
2. **Usar `run`** como método primario (inyecta USR/PASS, no imprime)
|
||||
3. **Usar `load`** para shell interactivo (eval + source)
|
||||
4. **Evitar `get`** en automatizaciones (imprime la contraseña)
|
||||
5. **Cerrar sesión** con `cerrar` cuando ya no se necesite
|
||||
|
||||
```bash
|
||||
# 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
|
||||
|
||||
Reference in New Issue
Block a user