termal.in

← Blog

OpenClaw e SSH: faça um túnel até o painel e deixe o agente alcançar seus servidores sem uma chave

· Termalin Team mcpai-agentssshsecuritytutorial

Duas tarefas diferentes se escondem por trás da expressão “OpenClaw SSH”, e confundi-las é onde as pessoas travam. Uma é alcançar o próprio OpenClaw: o painel dele roda em localhost, então você o abre por um túnel SSH. A outra é o contrário — deixar o agente do OpenClaw executar comandos nos seus próprios servidores. Este post faz as duas coisas e, para a segunda, mostra um jeito que nunca coloca uma chave SSH onde o agente possa lê-la.

Transparência, de saída: nós desenvolvemos o Termalin, a opção sem chave da Parte 2. O OpenClaw é um gateway de agente open source que você mesmo hospeda — ele roda em uma máquina, serve um painel web e instala “skills” do marketplace dele, o ClawHub. Descrevemos as outras abordagens com a mesma justeza com que gostaríamos que a nossa fosse descrita.

Duas coisas que as pessoas querem dizer com “OpenClaw SSH”

  • Alcançar o OpenClaw por SSH. O painel fica vinculado ao localhost, então você encaminha a porta dele para a sua máquina. Essa é a Parte 1.
  • Deixar o OpenClaw alcançar os seus servidores. Você quer que o agente execute comandos em outras máquinas. Essa é a Parte 2, e é a parte que vale fazer com cuidado.

Parte 1 — abra o painel do OpenClaw por um túnel SSH

O gateway do OpenClaw fica vinculado a 127.0.0.1:18789 na máquina em que roda, de propósito. O painel é um plano de controle administrativo, não um site público. Do seu notebook, encaminhe essa porta pelo seu login SSH já existente:

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

Depois abra http://127.0.0.1:18789 no navegador. -N significa “sem shell, só o túnel”; ServerAliveInterval=30 evita que a conexão fique ociosa. O tráfego usa a sessão SSH em que você já confia, então nada de novo fica exposto à internet.

Não vincule o gateway a 0.0.0.0 para pular o túnel. Isso coloca o plano de controle do seu agente na internet pública, e quem achar a porta fica com o agente. A própria documentação do OpenClaw diz o mesmo: use um túnel SSH, não exponha a porta do gateway. Mantenha-o em 127.0.0.1 e alcance-o por SSH.

Quando o túnel não conecta

“Connection refused”, “check failed” ou uma página em branco costuma significar uma destas coisas:

  • O gateway não está rodando, ou está em outra porta. Verifique na máquina com ss -tlnp | grep 18789.
  • A sua porta local 18789 já está em uso. Escolha outra porta local: -L 28789:127.0.0.1:18789, depois abra http://127.0.0.1:28789.
  • Você ganhou um shell em vez de um túnel. Você esqueceu o -N.

Mais casos em SSH connection refused ou timed out.

Mantenha o túnel do painel no ar

Um túnel ssh -L simples para quando a sua rede cai. Para um túnel sempre no ar, use o autossh ou um pequeno serviço systemd, ou um gerenciador de túneis que reconecta por você. A mecânica dos encaminhamentos local e remoto está em encaminhamento de portas e túneis SSH (em inglês).

Parte 2 — deixe o OpenClaw executar comandos nos seus outros servidores

Esta é a parte que a maioria das pessoas quer: o OpenClaw vê que um serviço caiu e o conserta na máquina de verdade. O jeito comum é dar uma chave SSH ao agente — uma chave em ~/.ssh na máquina do gateway, ou uma skill de SSH do ClawHub. Funciona. É também o arranjo que carrega o maior risco, então vale entendê-lo antes de recorrer a ele.

A parte arriscada: uma chave no gateway

Um marketplace de skills é código que você não escreveu, rodando ao lado da sua chave. No começo de 2026, a pesquisa “ClawHavoc” da Koi Security auditou 2.857 skills do ClawHub e apontou 341 como maliciosas. Várias foram feitas para roubar chaves SSH e credenciais; a maioria instalava o stealer AMOS por meio de falsos “pré-requisitos”, e algumas exfiltravam o próprio arquivo .env do agente.

Some a isso o modo de falha que todo agente tem — injeção de prompt a partir de uma página web ou de um e-mail que ele lê — e a consequência é clara. Uma chave SSH no gateway é um shell completo em cada host que confia nela, alcançável por qualquer coisa que consiga guiar o agente. Revogá-la significa rotacionar essa chave em todos esses hosts.

Então o objetivo da Parte 2 é deixar o OpenClaw rodar os comandos que você quer, sem uma chave que ele — ou uma skill maliciosa — possa roubar.

O caminho sem chave: um Connector e, então, o Termalin como servidor MCP remoto

Duas peças.

Primeiro, instale um Connector do Termalin em cada servidor que você quer que o OpenClaw alcance. É uma instalação de uma linha e só de saída: ele nunca fica à escuta em uma porta, então funciona atrás de NAT ou CGNAT e não exige nada aberto no seu firewall. No cadastro, o sshd do servidor passa a confiar na autoridade certificadora SSH do Termalin, e cada login então usa um certificado de curta duração emitido para a sua conta. Nenhuma chave de longa duração fica na máquina, e nenhuma é jamais entregue ao agente.

Segundo, adicione o Termalin ao OpenClaw como um servidor MCP remoto. MCP (em inglês) é como o OpenClaw conversa com ferramentas que ele mesmo não traz. O endpoint hospedado do Termalin expõe como ferramentas os seus servidores cadastrados com um Connector: hosts_list, ssh_exec, ssh_exec_many, leituras e escritas de SFTP, server_metrics, alerts_list e mais.

O OpenClaw lê uma config JSON5 em ~/.openclaw/openclaw.json e a recarrega automaticamente. Uma pegadinha antes de tudo: quando você deixa o transport de fora, o OpenClaw atual (2026.10.x) assume SSE por padrão. O Termalin fala Streamable HTTP, então você precisa definir "transport": "streamable-http", ou a conexão falha.

Há duas formas de autenticar.

Chave de API — boa para um gateway rodando em um VPS. Crie uma chave no painel web do Termalin, limite-a aos servidores que este agente deve tocar e coloque o valor no ambiente como TERMALIN_API_KEY. Depois adicione o servidor com um comando:

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

Ou escreva a mesma coisa em ~/.openclaw/openclaw.json:

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

Use a referência ${TERMALIN_API_KEY}, não a chave literal. O openclaw mcp doctor avisa quando encontra um token escrito direto em headers, e os valores de cabeçalho são ocultados nos logs dele.

OAuth — bom quando é uma pessoa fazendo login. Aponte o servidor para https://termal.in/mcp, defina auth como oauth e então entre:

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

O openclaw mcp login imprime uma URL de autorização e espera por um callback de loopback (http://127.0.0.1:<port>/callback). O OAuth do Termalin aceita essas URIs de redirecionamento de loopback, então você aprova o login no navegador e o token é guardado — não há chave para colar. Se o OpenClaw roda em um VPS headless e o seu navegador está em um notebook, finalize à mão com openclaw mcp login termalin --code <code>. Observe que, com auth: "oauth" definido, o OpenClaw ignora qualquer cabeçalho Authorization estático para esse servidor, então escolha um método só.

De um jeito ou de outro, o openclaw mcp doctor termalin --probe confirma que o servidor está acessível e lista as ferramentas dele, e as ferramentas do Termalin então aparecem para o agente. (Você também pode adicionar um servidor pela Control UI: chat → + → Connectors → Add MCP server…, apenas admin.)

Decida primeiro o que ele pode fazer, e registre tudo

Um agente sempre ligado deve começar pequeno. No cartão de apps de IA do Termalin, dê a esta conexão uma política de comandos: somente leitura, uma lista de comandos permitidos exatos, ou acesso total. Comece com somente leitura — “como estão os meus servidores”, disco, serviços com falha, as últimas linhas de um log, por meio de server_metrics e alerts_list. Depois amplie para uma lista de comandos permitidos estreita, depois para escritas, um passo de cada vez. O raciocínio por trás de listas de comandos permitidos por host (em inglês) bem apertadas se aplica diretamente aqui.

Tudo o que o agente roda fica registrado. Cada comando vai parar na gravação de sessão, na grade de monitoramento ao vivo e no registro de auditoria (em inglês), marcado como do agente. Como o segredo é uma credencial do Termalin e não uma chave SSH espalhada por vários hosts, desligar o agente é uma opção, não uma rotação de chaves. Se várias pessoas compartilham um mesmo OpenClaw, o OpenClaw pode dar a cada remetente uma identidade separada (oauth.identity: "per-requester"), então a trilha de auditoria continua por pessoa.

Quando o servidor MCP não conecta

  • Ele conecta mas não mostra ferramentas, ou falha no handshake. Você deixou o transport de fora e o OpenClaw recorreu ao SSE. Defina "transport": "streamable-http".
  • 401 Unauthorized. A chave de API está faltando ou fora de escopo, ou você está na URL de OAuth (/mcp) sem ter rodado o openclaw mcp login. O endpoint da chave é /api/v1/mcp; o endpoint de OAuth é /mcp.
  • ${TERMALIN_API_KEY} chega vazia. A variável não está definida no ambiente em que o OpenClaw roda. Exporte-a onde o gateway é iniciado.
  • Um servidor que você espera está faltando em hosts_list. Ele ainda não tem um Connector, ou está fora do escopo da chave.

Rode openclaw mcp status --verbose e openclaw mcp doctor termalin --probe para ver em qual etapa falha.

Alternativas justas

O caminho sem chave não é o único. Outros dois são razoáveis, dependendo das suas necessidades.

Dê uma chave ao agente diretamente. Coloque uma chave SSH em ~/.ssh na máquina do gateway, ou instale uma skill de SSH do ClawHub (ssh-executor, ssh-full, sshx e outras) que lê uma chave, uma senha ou uma entrada de cofre. É a mais rápida de configurar e não depende de nada hospedado. A contrapartida é exatamente o risco descrito acima: a chave pode ser lida por qualquer coisa que o agente rode, o alcance dela é cada host que confia nela, e revogá-la significa rotacionar chaves em todos eles. Se você fizer isso, use uma chave dedicada de baixo privilégio, restrinja-a com força com command= no authorized_keys, e nunca reutilize a sua chave pessoal.

Rode um servidor SSH-MCP autônomo que guarda a chave. Um pequeno servidor MCP self-hosted com uma ferramenta ssh_exec mantém a chave na própria config, fora do contexto do modelo. Isso é uma melhoria real — uma transcrição vazada não contém mais a credencial. Mas a maioria deles vem sem política de comandos, sem visão ao vivo e sem trilha de auditoria, então qualquer chamada de ferramenta pode rodar qualquer coisa em qualquer host configurado, e o seu registro do que aconteceu é o que quer que o agente reporte. Nós classificamos esses e todos os outros arranjos pelo que um comprometimento custa em dar acesso SSH a um agente de IA, por raio de impacto (em inglês).

Perguntas frequentes

O OpenClaw suporta MCP? Sim. O OpenClaw atual (2026.10.x) conecta-se a servidores MCP remotos por HTTP. Adicione um com openclaw mcp set ou openclaw mcp add, ou pela Control UI (chat → + → Connectors → Add MCP server…, apenas admin). Defina "transport": "streamable-http" para servidores como o Termalin, porque, caso contrário, o padrão é SSE.

O OpenClaw consegue fazer SSH no meu servidor? Consegue, de dois jeitos. Diretamente, se você der a ele uma chave pela ferramenta de execução ou por uma skill de SSH do ClawHub. Ou sem chave, conectando-o a um servidor MCP que guarda o acesso por ele — a configuração de Connector mais MCP acima, em que nenhuma chave jamais chega ao agente.

É seguro dar a minha chave SSH ao OpenClaw? Trate como alto risco. Uma chave no gateway pode ser lida por qualquer skill ou instrução injetada que o agente siga, e o ClawHub já distribuiu skills feitas para roubar exatamente isso (a Koi Security apontou 341 skills maliciosas no começo de 2026). Se for inevitável, use uma chave descartável de baixo privilégio com restrições command= — nunca a sua chave pessoal.

Como eu corrijo o “openclaw ssh connection refused”? Para o túnel do painel, verifique se o gateway está rodando e vinculado a 127.0.0.1:18789 (ss -tlnp | grep 18789 na máquina), garanta que a sua porta local esteja livre e mantenha o -N no comando ssh -L. Mais casos em SSH connection refused ou timed out.

Preciso abrir alguma porta? Não. O túnel do painel usa a sua conexão SSH já existente, e um Connector do Termalin é só de saída — ele nunca fica à escuta em uma porta, então funciona atrás de NAT e CGNAT sem nada aberto no seu firewall.


O Termalin é um cliente SSH multiplataforma com um servidor MCP hospedado, uma custódia de chaves e política de agente por host. O endpoint hospedado e o acesso via Connector estão no Pro (US$ 10/mês, ou US$ 8/mês no plano anual) e no Team, com 14 dias de teste do Pro e sem cartão — veja MCP, o Connector, ou SSH para agentes de IA.

Experimente em um host.

Termalin é um cliente SSH rápido para você — e para seus agentes.

Plano gratuito · 14 dias de Pro grátis · preços