termal.in

← Blog

OpenClaw et SSH : un tunnel vers le tableau de bord, et l’agent qui atteint vos serveurs sans clé

· Termalin Team mcpai-agentssshsecuritytutorial

Deux tâches différentes se cachent derrière l’expression « OpenClaw SSH », et c’est en les confondant que l’on se bloque. La première consiste à joindre OpenClaw lui-même : son tableau de bord tourne sur localhost, vous l’ouvrez donc par un tunnel SSH. La seconde est l’inverse — laisser l’agent OpenClaw exécuter des commandes sur vos propres serveurs. Cet article traite les deux, et pour la seconde il montre une méthode qui ne place jamais de clé SSH là où l’agent peut la lire.

Une précision d’emblée : nous développons Termalin, l’option sans clé de la Partie 2. OpenClaw est une passerelle d’agent open source que vous auto-hébergez — elle tourne sur une machine, sert un tableau de bord web et installe des « skills » depuis sa place de marché, ClawHub. Nous décrivons les autres approches aussi équitablement que nous voudrions qu’on décrive la nôtre.

Deux sens que l’on donne à « OpenClaw SSH »

  • Joindre OpenClaw par SSH. Le tableau de bord est lié à localhost, vous redirigez donc son port vers votre machine. C’est la Partie 1.
  • Laisser OpenClaw atteindre vos serveurs. Vous voulez que l’agent exécute des commandes sur d’autres machines. C’est la Partie 2, et c’est celle qui mérite d’être faite avec soin.

Partie 1 — ouvrir le tableau de bord OpenClaw via un tunnel SSH

La passerelle OpenClaw se lie à 127.0.0.1:18789 sur l’hôte où elle tourne, et c’est voulu. Le tableau de bord est un plan de contrôle d’administration, pas un site public. Depuis votre portable, redirigez ce port par votre connexion SSH existante :

ssh -N -o ServerAliveInterval=30 -L 18789:127.0.0.1:18789 user@vps

Puis ouvrez http://127.0.0.1:18789 dans votre navigateur. -N signifie « pas de shell, juste le tunnel » ; ServerAliveInterval=30 empêche la connexion de rester inactive. Le trafic emprunte la session SSH en laquelle vous avez déjà confiance, donc rien de nouveau n’est exposé sur internet.

Ne liez pas la passerelle à 0.0.0.0 pour vous passer du tunnel. Cela place le plan de contrôle de votre agent sur l’internet public, et quiconque trouve le port tient l’agent. La propre documentation d’OpenClaw dit la même chose : utilisez un tunnel SSH, n’exposez pas le port de la passerelle. Gardez-la sur 127.0.0.1 et joignez-la par SSH.

Quand le tunnel ne se connecte pas

« Connection refused », « check failed » ou une page blanche signifie en général l’une de ces choses :

  • La passerelle ne tourne pas, ou est sur un autre port. Vérifiez sur la machine avec ss -tlnp | grep 18789.
  • Votre port local 18789 est déjà occupé. Choisissez un autre port local : -L 28789:127.0.0.1:18789, puis ouvrez http://127.0.0.1:28789.
  • Vous avez obtenu un shell au lieu d’un tunnel. Vous avez oublié -N.

D’autres cas sont traités dans connection refused ou timed out.

Garder le tunnel du tableau de bord ouvert

Un simple tunnel ssh -L s’arrête quand votre réseau tombe. Pour un tunnel toujours actif, utilisez autossh ou un petit service systemd, ou un gestionnaire de tunnels qui se reconnecte à votre place. Les mécanismes des redirections locales et distantes sont détaillés dans SSH : redirection de port et tunnels (en anglais).

Partie 2 — laisser OpenClaw exécuter des commandes sur vos autres serveurs

C’est ce que la plupart des gens veulent : OpenClaw voit qu’un service est tombé et le répare sur la machine elle-même. La façon courante est de donner une clé SSH à l’agent — une clé dans ~/.ssh sur l’hôte de la passerelle, ou un skill SSH depuis ClawHub. Ça marche. C’est aussi l’arrangement qui comporte le plus de risques, donc il vaut la peine de le comprendre avant d’y recourir.

La partie risquée : une clé sur la passerelle

Une place de marché de skills, c’est du code que vous n’avez pas écrit, qui tourne à côté de votre clé. Début 2026, la recherche « ClawHavoc » de Koi Security a audité 2 857 skills ClawHub et en a signalé 341 comme malveillants. Plusieurs étaient conçus pour voler des clés SSH et des identifiants ; la plupart installaient le voleur AMOS via de faux « prérequis », et certains exfiltraient le propre fichier .env de l’agent.

Ajoutez le mode de défaillance que connaît tout agent — une injection d’instructions via une page web ou un e-mail qu’il lit — et la conséquence est claire. Une seule clé SSH sur la passerelle, c’est un shell complet sur chaque hôte qui lui fait confiance, joignable par tout ce qui peut piloter l’agent. La révoquer suppose de renouveler cette clé sur tous ces hôtes.

L’objectif de la Partie 2 est donc de laisser OpenClaw exécuter les commandes que vous voulez, sans une clé qu’il — ou un skill malveillant — puisse dérober.

La voie sans clé : un Connector, puis Termalin comme serveur MCP distant

Deux pièces.

D’abord, installez un Connector Termalin sur chaque serveur que vous voulez laisser OpenClaw atteindre. L’installation tient en une ligne et ne fait que sortir : il n’écoute jamais sur un port, il fonctionne donc derrière un NAT ou un CGNAT et ne demande rien d’ouvert dans votre pare-feu. À l’inscription, le sshd du serveur est configuré pour faire confiance à l’autorité de certification SSH de Termalin, et chaque connexion utilise ensuite un certificat à courte durée émis pour votre compte. Aucune clé durable ne se trouve sur la machine, et aucune n’est jamais remise à l’agent.

Ensuite, ajoutez Termalin à OpenClaw comme serveur MCP distant. MCP (en anglais) est la façon dont OpenClaw dialogue avec des outils qu’il ne fournit pas lui-même. L’endpoint hébergé de Termalin expose vos serveurs ajoutés via un Connector sous forme d’outils : hosts_list, ssh_exec, ssh_exec_many, les lectures et écritures SFTP, server_metrics, alerts_list, et d’autres.

OpenClaw lit une configuration JSON5 depuis ~/.openclaw/openclaw.json et la recharge automatiquement. Un piège d’abord : quand vous omettez transport, l’OpenClaw actuel (2026.10.x) retombe sur SSE. Termalin parle le Streamable HTTP, vous devez donc mettre "transport": "streamable-http", sans quoi la connexion échoue.

Il y a deux façons de s’authentifier.

Clé API — idéale pour une passerelle qui tourne sur un VPS. Créez une clé dans l’espace web de Termalin, limitez son périmètre aux serveurs que cet agent doit toucher, et placez la valeur dans l’environnement sous TERMALIN_API_KEY. Puis ajoutez le serveur en une commande :

openclaw mcp set termalin '{"url":"https://termal.in/api/v1/mcp","transport":"streamable-http","headers":{"Authorization":"Bearer ${TERMALIN_API_KEY}"}}'

Ou écrivez la même chose dans ~/.openclaw/openclaw.json :

{
  "mcp": {
    "servers": {
      "termalin": {
        "url": "https://termal.in/api/v1/mcp",
        "transport": "streamable-http",
        "headers": {
          "Authorization": "Bearer ${TERMALIN_API_KEY}"
        }
      }
    }
  }
}

Utilisez la référence ${TERMALIN_API_KEY}, pas la clé en clair. openclaw mcp doctor avertit quand il trouve un jeton écrit directement dans headers, et les valeurs d’en-tête sont masquées dans ses journaux.

OAuth — idéal quand c’est une personne qui se connecte. Pointez le serveur vers https://termal.in/mcp, mettez auth à oauth, puis connectez-vous :

openclaw mcp set termalin '{"url":"https://termal.in/mcp","transport":"streamable-http","auth":"oauth"}'
openclaw mcp login termalin
openclaw mcp doctor termalin --probe

openclaw mcp login affiche une URL d’autorisation et attend un rappel en loopback (http://127.0.0.1:<port>/callback). L’OAuth de Termalin accepte ces URI de redirection en loopback : vous approuvez la connexion dans votre navigateur et le jeton est stocké — aucune clé à coller. Si OpenClaw tourne sur un VPS sans affichage et que votre navigateur est sur un portable, terminez à la main avec openclaw mcp login termalin --code <code>. Notez qu’avec auth: "oauth" défini, OpenClaw ignore tout en-tête Authorization statique pour ce serveur ; choisissez donc une seule méthode.

Dans les deux cas, openclaw mcp doctor termalin --probe confirme que le serveur est joignable et liste ses outils, puis les outils Termalin apparaissent pour l’agent. (Vous pouvez aussi ajouter un serveur depuis l’interface de contrôle : chat → + → Connectors → Add MCP server…, réservé aux admins.)

Décidez d’abord ce qu’il peut faire, et consignez tout

Un agent permanent devrait commencer petit. Dans la carte « Applications d’IA » de Termalin, donnez à cette connexion une politique de commandes : lecture seule, une liste de commandes autorisées exactes, ou accès complet. Commencez par la lecture seule — « comment vont mes serveurs », le disque, les services en échec, les dernières lignes d’un journal, via server_metrics et alerts_list. Puis élargissez à une liste de commandes autorisées étroite, puis aux écritures, une étape à la fois. Le raisonnement derrière des listes de commandes autorisées par hôte (en anglais) et strictes s’applique directement ici.

Tout ce que l’agent exécute est consigné. Chaque commande atterrit dans l’enregistrement de session, la grille de surveillance en direct et le journal d’audit (en anglais), marquée comme venant de l’agent. Parce que le secret est un identifiant Termalin et non une clé SSH dispersée sur les hôtes, désactiver l’agent tient en un interrupteur, pas en une rotation de clés sur chaque serveur. Si plusieurs personnes partagent un même OpenClaw, OpenClaw peut attribuer à chaque expéditeur une identité distincte (oauth.identity: "per-requester"), afin que la trace d’audit reste par personne.

Quand le serveur MCP ne se connecte pas

  • Il se connecte mais n’affiche aucun outil, ou échoue au handshake. Vous avez omis transport et OpenClaw est retombé sur SSE. Mettez "transport": "streamable-http".
  • 401 Unauthorized. La clé API est absente ou hors périmètre, ou vous êtes sur l’URL OAuth (/mcp) sans avoir lancé openclaw mcp login. L’endpoint par clé est /api/v1/mcp ; l’endpoint OAuth est /mcp.
  • ${TERMALIN_API_KEY} arrive vide. La variable n’est pas définie dans l’environnement où OpenClaw tourne. Exportez-la là où la passerelle démarre.
  • Un serveur que vous attendez manque dans hosts_list. Il n’a pas encore de Connector, ou il est hors du périmètre de la clé.

Lancez openclaw mcp status --verbose et openclaw mcp doctor termalin --probe pour voir quelle étape échoue.

Des alternatives honnêtes

La voie sans clé n’est pas la seule. Deux autres sont raisonnables, selon vos besoins.

Donner une clé directement à l’agent. Placez une clé SSH dans ~/.ssh sur l’hôte de la passerelle, ou installez un skill SSH de ClawHub (ssh-executor, ssh-full, sshx, et d’autres) qui lit une clé, un mot de passe ou une entrée de coffre. C’est le plus rapide à mettre en place et cela ne dépend de rien d’hébergé. Le compromis est exactement le risque décrit plus haut : la clé est lisible par tout ce que l’agent exécute, sa portée est chaque hôte qui lui fait confiance, et la révoquer suppose de renouveler les clés sur tous. Si vous faites cela, utilisez une clé dédiée à faibles privilèges, restreignez-la fermement avec command= dans authorized_keys, et ne réutilisez jamais votre clé personnelle.

Faire tourner un serveur SSH-MCP autonome qui détient la clé. Un petit serveur MCP auto-hébergé doté d’un outil ssh_exec garde la clé dans sa propre configuration, hors du contexte du modèle. C’est une vraie amélioration — une transcription qui fuite ne contient plus l’identifiant. Mais la plupart sont livrés sans politique de commandes, sans vue en direct et sans trace d’audit : n’importe quel appel d’outil peut donc tout exécuter sur n’importe quel hôte configuré, et votre trace de ce qui s’est passé se résume à ce que l’agent rapporte. Nous avons classé ces solutions et tous les autres arrangements selon ce que coûte une compromission dans donner un accès SSH à un agent IA, par rayon d’impact (en anglais).

Questions fréquentes

OpenClaw prend-il en charge MCP ? Oui. L’OpenClaw actuel (2026.10.x) se connecte à des serveurs MCP distants par HTTP. Ajoutez-en un avec openclaw mcp set ou openclaw mcp add, ou depuis l’interface de contrôle (chat → + → Connectors → Add MCP server…, réservé aux admins). Mettez "transport": "streamable-http" pour les serveurs comme Termalin, car le défaut est sinon SSE.

OpenClaw peut-il se connecter en SSH à mon serveur ? Oui, de deux façons. Directement, si vous lui donnez une clé via l’outil d’exécution ou un skill SSH de ClawHub. Ou sans clé, en le reliant à un serveur MCP qui détient l’accès à sa place — la configuration Connector + MCP ci-dessus, où aucune clé n’atteint jamais l’agent.

Est-il sûr de donner ma clé SSH à OpenClaw ? Considérez cela comme à haut risque. Une clé sur la passerelle est lisible par tout skill ou toute instruction injectée que l’agent suit, et ClawHub a diffusé des skills bâtis pour voler précisément cela (Koi Security a signalé 341 skills malveillants début 2026). Si vous devez le faire, utilisez une clé jetable à faibles privilèges avec des restrictions command= — jamais votre clé personnelle.

Comment corriger « openclaw ssh connection refused » ? Pour le tunnel du tableau de bord, vérifiez que la passerelle tourne et qu’elle est liée à 127.0.0.1:18789 (ss -tlnp | grep 18789 sur la machine), assurez-vous que votre port local est libre, et gardez -N sur la commande ssh -L. D’autres cas sont traités dans connection refused ou timed out.

Dois-je ouvrir des ports ? Non. Le tunnel du tableau de bord emprunte votre connexion SSH existante, et un Connector Termalin est en sortie uniquement — il n’écoute jamais sur un port, il fonctionne donc derrière un NAT et un CGNAT sans rien ouvrir dans votre pare-feu.


Termalin est un client SSH multiplateforme avec un serveur MCP hébergé, un gardien des clés et une politique d’agent par hôte. L’endpoint hébergé et l’accès via Connector sont sur Pro (10 $/mois, ou 8 $/mois facturé annuellement) et Team, avec un essai Pro de 14 jours et sans carte — voyez MCP, le Connector, ou SSH pour agents IA.

Essayez-le sur un hôte.

Termalin est un client SSH rapide pour vous — et pour vos agents.

Offre gratuite · 14 jours d’essai Pro · tarifs