Accès SSH via proxy
Comment un agent LLM exécute des commandes sur des machines distantes en toute sécurité via une API de proxy SSH au lieu de clés SSH brutes.
Accès SSH via proxy
Les agents doivent exécuter des commandes sur des machines distantes — déployer un conteneur, lire un log, corriger une config. Remettre des clés privées SSH brutes à un LLM est une mauvaise idée : les clés finissent dans les fenêtres de contexte, les logs et les transcriptions. Un proxy SSH résout cela : il détient les identifiants, l'agent ne parle qu'en HTTP.
Le modèle
LLM ──HTTPS──► Proxy SSH ──SSH──► machines cibles
(détient les clés,
journal d'audit,
limites de débit)Le proxy expose des sessions persistantes avec une surface REST simple :
| Endpoint | Objectif |
|---|---|
POST /connect?target=vps1 |
ouvrir une session → session_id |
POST /<sid>/exec {command, timeout} |
exécuter une commande (async) → exec_id |
GET /<sid>/exec/<exec_id> |
interroger la sortie |
| Endpoints SFTP | up/download de fichiers, ls, mkdir, rm |
L'authentification est un token Bearer — le même motif que toutes les autres API que tu utilises.
Le motif d'exécution
# 1. connecte-toi une fois, réutilise la session pour toute la tâche
SID=$(curl -s -H "Authorization: Bearer $KEY" \
"https://ssh-proxy.example/connect?target=vps1" | jq -r .session_id)
# 2. exécute une commande
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. interroge le résultat
curl -s -H "Authorization: Bearer $KEY" "https://ssh-proxy.example/$SID/exec/$EID"Règles d'engagement
- Réutilise les sessions. Se connecter par commande gaspille des ressources et déclenche les limites de débit. Stocke le
session_id(ex./tmp/vps1_sid) et fais-lui un heartbeat avant réutilisation. - Nomme les targets, ne les découvre pas. Les targets sont pré-enregistrés (
vps1,pi, …). Le proxy est la source unique de vérité — n'intègre jamais d'adresses IP en dur dans le code d'agent. - Préfère SFTP à cat/heredoc de shell pour les fichiers. Échapper des données binaires via
execcorrompt les payloads. Utilise les endpoints dédiés d'upload/download. - Cite tes commandes. Le corps JSON est parsé deux fois (HTTP + shell). Enveloppe les commandes distantes dans des guillemets simples et garde-les sur une ligne.
- Suppose l'audit. Chaque exec atterrit dans le journal d'audit du proxy — comporte-toi comme si l'humain lisait tout (il peut).
Quand NE PAS utiliser exec
- Lire un état structuré qui a une API (Docker, bases de données, la Mind API de Synapse) — préfère toujours l'API au parsing de sortie CLI.
- Processus interactifs de longue durée.
execest fire-and-forget avec timeout ; utilisenohup+ un fichier d'état sur la cible. - Tout ce qui est destructif sans instruction explicite. Le proxy te donne le pouvoir — l'humain te donne la permission.
Récupération d'erreurs
| Symptôme | Solution |
|---|---|
| 401 au connect | token expiré — relis-le depuis memory/settings, jamais depuis une transcription |
| session 404 | session expirée (plafond 24h) — reconnecte-toi |
| timeout d'exec | augmente timeout ou découpe la commande ; vérifie la charge de la cible |
| contenu de fichier corrompu | tu as utilisé exec au lieu de SFTP — passe aux endpoints SFTP |