Accesso SSH via proxy
Come un agente LLM esegue comandi su macchine remote in sicurezza tramite un'API proxy SSH invece di chiavi SSH grezze.
Accesso SSH via proxy
Gli agenti devono eseguire comandi su macchine remote — deployare un container, leggere un log, correggere una config. Consegnare chiavi private SSH grezze a un LLM è una cattiva idea: le chiavi finiscono in finestre di contesto, log e trascrizioni. Un proxy SSH risolve il problema: le credenziali le detiene lui, l'agente parla solo HTTP.
Il modello
LLM ──HTTPS──► Proxy SSH ──SSH──► macchine target
(detiene le chiavi,
audit log,
limiti di rate)Il proxy espone sessioni persistenti con una superficie REST semplice:
| Endpoint | Scopo |
|---|---|
POST /connect?target=vps1 |
aprire una sessione → session_id |
POST /<sid>/exec {command, timeout} |
eseguire un comando (async) → exec_id |
GET /<sid>/exec/<exec_id> |
interrogare l'output |
| Endpoint SFTP | up/download di file, ls, mkdir, rm |
L'autenticazione è un token Bearer — lo stesso schema di ogni altra API che usi.
Il pattern di esecuzione
# 1. connetti una volta, riusa la sessione per tutto il task
SID=$(curl -s -H "Authorization: Bearer $KEY" \
"https://ssh-proxy.example/connect?target=vps1" | jq -r .session_id)
# 2. esegui un comando
EID=$(curl -s -H "Authorization: Bearer $KEY" -H "Content-Type: application/json" \
-X POST "https://ssh-proxy.example/$SID/exec" \
-d '{"command": "docker ps --format \"{{.Names}}\"", "timeout": 120}' | jq -r .exec_id)
# 3. interroga il risultato
curl -s -H "Authorization: Bearer $KEY" "https://ssh-proxy.example/$SID/exec/$EID"Regole di ingaggio
- Riusa le sessioni. Connettersi per ogni comando spreca risorse e fa scattare i limiti di rate. Salva il
session_id(es./tmp/vps1_sid) e fai heartbeat prima di riutilizzarlo. - Nomina i target, non scoprili. I target sono pre-registrati (
vps1,pi, …). Il proxy è la fonte unica di verità — non hardcodare mai indirizzi IP nel codice agente. - Preferisci SFTP a cat/heredoc di shell per i file. L'escaping di dati binari via
execcorrompe i payload. Usa gli endpoint dedicati di upload/download. - Virgoletta i comandi. Il corpo JSON viene parsato due volte (HTTP + shell). Avvolgi i comandi remoti in apici singoli e tienili su una riga.
- Assumi l'auditing. Ogni exec finisce nell'audit log del proxy — comportati come se l'umano leggesse tutto (può farlo).
Quando NON usare exec
- Leggere stato strutturato che ha una API (Docker, database, la Mind API di Synapse) — preferisci sempre la API al parsing dell'output CLI.
- Processi interattivi di lunga durata.
execè fire-and-forget con timeout; usanohup+ un file di stato sul target. - Qualsiasi cosa distruttiva senza istruzione esplicita. Il proxy ti dà il potere — l'umano ti dà il permesso.
Recupero errori
| Sintomo | Rimedio |
|---|---|
| 401 al connect | token scaduto — rileggilo da memory/settings, mai da una trascrizione |
| sessione 404 | sessione scaduta (limite 24h) — riconnetti |
| timeout dell'exec | alza timeout o spezza il comando; verifica il carico del target |
| contenuto file corrotto | hai usato exec invece di SFTP — passa agli endpoint SFTP |