Autenticação por Trusted Proxy
⚠️ Recurso sensível à segurança. Esse modo delega toda a autenticação ao seu proxy reverso. Uma configuração incorreta pode expor seu Gateway a acesso não autorizado. Leia esta página com atenção antes de ativar.
Quando usar
Use o modo de autenticaçãotrusted-proxy quando:
- Você executa o OpenClaw atrás de um proxy com reconhecimento de identidade (Pomerium, Caddy + OAuth, nginx + oauth2-proxy, Traefik + forward auth)
- Seu proxy lida com toda a autenticação e repassa a identidade do usuário por cabeçalhos
- Você está em um ambiente Kubernetes ou de contêiner em que o proxy é o único caminho para o Gateway
- Você está recebendo erros WebSocket
1008 unauthorizedporque navegadores não conseguem passar tokens no payload de WS
Quando NÃO usar
- Se seu proxy não autentica usuários (é apenas um terminador TLS ou load balancer)
- Se houver qualquer caminho até o Gateway que contorne o proxy (aberturas no firewall, acesso de rede interna)
- Se você não tiver certeza de que seu proxy remove/sobrescreve corretamente cabeçalhos encaminhados
- Se você só precisa de acesso pessoal para um único usuário (considere Tailscale Serve + loopback para uma configuração mais simples)
Como funciona
- Seu proxy reverso autentica usuários (OAuth, OIDC, SAML etc.)
- O proxy adiciona um cabeçalho com a identidade autenticada do usuário (por exemplo,
x-forwarded-user: nick@example.com) - O OpenClaw verifica se a requisição veio de um IP de proxy confiável (configurado em
gateway.trustedProxies) - O OpenClaw extrai a identidade do usuário do cabeçalho configurado
- Se tudo estiver correto, a requisição é autorizada
Comportamento de pareamento da Control UI
Quandogateway.auth.mode = "trusted-proxy" está ativo e a requisição passa
pelas verificações de trusted-proxy, sessões WebSocket da Control UI podem se conectar sem
identidade de pareamento de dispositivo.
Implicações:
- O pareamento deixa de ser o principal mecanismo de controle de acesso à Control UI nesse modo.
- Sua política de autenticação do proxy reverso e
allowUsersse tornam o controle de acesso efetivo. - Mantenha o ingresso do gateway restrito apenas a IPs de proxy confiáveis (
gateway.trustedProxies+ firewall).
Configuração
- A autenticação por trusted-proxy rejeita requisições com origem em loopback (
127.0.0.1,::1, CIDRs de loopback). - Proxies reversos no mesmo host via loopback não satisfazem a autenticação por trusted-proxy.
- Para configurações com proxy via loopback no mesmo host, use autenticação por token/senha, ou roteie por um endereço trusted proxy fora de loopback que o OpenClaw possa verificar.
- Implantações da Control UI fora de loopback ainda exigem
gateway.controlUi.allowedOriginsexplícito.
Referência de configuração
| Campo | Obrigatório | Descrição |
|---|---|---|
gateway.trustedProxies | Sim | Array de endereços IP de proxies confiáveis. Requisições de outros IPs são rejeitadas. |
gateway.auth.mode | Sim | Deve ser "trusted-proxy" |
gateway.auth.trustedProxy.userHeader | Sim | Nome do cabeçalho que contém a identidade autenticada do usuário |
gateway.auth.trustedProxy.requiredHeaders | Não | Cabeçalhos adicionais que devem estar presentes para que a requisição seja confiável |
gateway.auth.trustedProxy.allowUsers | Não | Allowlist de identidades de usuário. Vazio significa permitir todos os usuários autenticados. |
Terminação TLS e HSTS
Use um único ponto de terminação TLS e aplique HSTS nele.Padrão recomendado: terminação TLS no proxy
Quando seu proxy reverso lida com HTTPS parahttps://control.example.com, defina
Strict-Transport-Security no proxy para esse domínio.
- É uma boa opção para implantações expostas à internet.
- Mantém certificado + política de reforço de segurança HTTP em um só lugar.
- O OpenClaw pode permanecer em HTTP de loopback atrás do proxy.
Terminação TLS no Gateway
Se o próprio OpenClaw servir HTTPS diretamente (sem proxy com terminação TLS), defina:strictTransportSecurity aceita um valor de cabeçalho em string, ou false para desativar explicitamente.
Orientação para rollout
- Comece primeiro com um max age curto (por exemplo
max-age=300) enquanto valida o tráfego. - Aumente para valores de longa duração (por exemplo
max-age=31536000) somente depois de ter alta confiança. - Adicione
includeSubDomainsapenas se todos os subdomínios estiverem prontos para HTTPS. - Use preload apenas se você atender intencionalmente aos requisitos de preload para todo o conjunto do seu domínio.
- Desenvolvimento local apenas com loopback não se beneficia de HSTS.
Exemplos de configuração de proxy
Pomerium
O Pomerium passa a identidade emx-pomerium-claim-email (ou outros cabeçalhos de claim) e um JWT em x-pomerium-jwt-assertion.
Caddy com OAuth
O Caddy com o plugincaddy-security pode autenticar usuários e repassar cabeçalhos de identidade.
nginx + oauth2-proxy
O oauth2-proxy autentica usuários e repassa a identidade emx-auth-request-email.
Traefik com Forward Auth
Configuração mista com token
O OpenClaw rejeita configurações ambíguas em quegateway.auth.token (ou OPENCLAW_GATEWAY_TOKEN) e o modo trusted-proxy estão ativos ao mesmo tempo. Configurações mistas com token podem fazer com que requisições via loopback sejam autenticadas silenciosamente pelo caminho de autenticação errado.
Se você vir um erro mixed_trusted_proxy_token na inicialização:
- Remova o token compartilhado ao usar o modo trusted-proxy, ou
- Mude
gateway.auth.modepara"token"se sua intenção for usar autenticação baseada em token.
Cabeçalho de escopos de operador
A autenticação trusted-proxy é um modo HTTP com identidade, então chamadores podem opcionalmente declarar escopos de operador comx-openclaw-scopes.
Exemplos:
x-openclaw-scopes: operator.readx-openclaw-scopes: operator.read,operator.writex-openclaw-scopes: operator.admin,operator.write
- Quando o cabeçalho está presente, o OpenClaw respeita o conjunto de escopos declarado.
- Quando o cabeçalho está presente, mas vazio, a requisição declara nenhum escopo de operador.
- Quando o cabeçalho está ausente, APIs HTTP normais com identidade recorrem ao conjunto padrão de escopos de operador.
- Rotas HTTP de plugin com autenticação do gateway são mais restritas por padrão: quando
x-openclaw-scopesestá ausente, o escopo de runtime delas recorre aoperator.write. - Requisições HTTP originadas no navegador ainda precisam passar por
gateway.controlUi.allowedOrigins(ou modo deliberado de fallback pelo cabeçalho Host) mesmo depois de a autenticação trusted-proxy ser bem-sucedida.
- Envie
x-openclaw-scopesexplicitamente quando quiser que uma requisição trusted-proxy seja mais restrita do que os padrões, ou quando uma rota de plugin com autenticação do gateway precisar de algo mais forte do que o escopo de gravação.
Checklist de segurança
Antes de ativar a autenticação trusted-proxy, verifique:- O proxy é o único caminho: a porta do Gateway está protegida por firewall de tudo, exceto do seu proxy
- trustedProxies é mínimo: apenas os IPs reais do seu proxy, não sub-redes inteiras
- Sem origem de proxy em loopback: a autenticação trusted-proxy falha em modo fechado para requisições com origem em loopback
- O proxy remove cabeçalhos: seu proxy sobrescreve (não acrescenta) cabeçalhos
x-forwarded-*vindos dos clientes - Terminação TLS: seu proxy lida com TLS; usuários se conectam por HTTPS
- allowedOrigins é explícito: Control UI fora de loopback usa
gateway.controlUi.allowedOriginsexplícito - allowUsers está definido (recomendado): restrinja a usuários conhecidos em vez de permitir qualquer pessoa autenticada
- Sem configuração mista com token: não defina ao mesmo tempo
gateway.auth.tokenegateway.auth.mode: "trusted-proxy"
Auditoria de segurança
openclaw security audit marcará a autenticação trusted-proxy com um achado de severidade critical. Isso é intencional — é um lembrete de que você está delegando a segurança à configuração do seu proxy.
A auditoria verifica:
- Aviso/lembrete base
gateway.trusted_proxy_authwarning/critical - Configuração ausente de
trustedProxies - Configuração ausente de
userHeader allowUsersvazio (permite qualquer usuário autenticado)- Política de origem do navegador curinga ou ausente em superfícies expostas da Control UI
Solução de problemas
”trusted_proxy_untrusted_source”
A requisição não veio de um IP emgateway.trustedProxies. Verifique:
- O IP do proxy está correto? (IPs de contêiner Docker podem mudar)
- Há um load balancer na frente do seu proxy?
- Use
docker inspectoukubectl get pods -o widepara encontrar os IPs reais
”trusted_proxy_loopback_source”
O OpenClaw rejeitou uma requisição trusted-proxy com origem em loopback. Verifique:- O proxy está se conectando a partir de
127.0.0.1/::1? - Você está tentando usar autenticação trusted-proxy com um proxy reverso via loopback no mesmo host?
- Use autenticação por token/senha em configurações com proxy via loopback no mesmo host, ou
- Roteie por um endereço trusted proxy fora de loopback e mantenha esse IP em
gateway.trustedProxies.
”trusted_proxy_user_missing”
O cabeçalho de usuário estava vazio ou ausente. Verifique:- Seu proxy está configurado para repassar cabeçalhos de identidade?
- O nome do cabeçalho está correto? (não diferencia maiúsculas/minúsculas, mas a grafia importa)
- O usuário está realmente autenticado no proxy?
“trustedproxy_missing_header*”
Um cabeçalho obrigatório não estava presente. Verifique:- A configuração do seu proxy para esses cabeçalhos específicos
- Se os cabeçalhos estão sendo removidos em algum ponto da cadeia
”trusted_proxy_user_not_allowed”
O usuário está autenticado, mas não está emallowUsers. Adicione-o ou remova a allowlist.
”trusted_proxy_origin_not_allowed”
A autenticação trusted-proxy foi bem-sucedida, mas o cabeçalhoOrigin do navegador não passou nas verificações de origem da Control UI.
Verifique:
gateway.controlUi.allowedOriginsinclui a origem exata do navegador- Você não está usando origens curingas, a menos que queira intencionalmente um comportamento de permitir tudo
- Se você usa intencionalmente o modo fallback por cabeçalho Host,
gateway.controlUi.dangerouslyAllowHostHeaderOriginFallback=trueestá definido deliberadamente
O WebSocket ainda falha
Verifique se seu proxy:- Oferece suporte a upgrades de WebSocket (
Upgrade: websocket,Connection: upgrade) - Passa os cabeçalhos de identidade em requisições de upgrade de WebSocket (não apenas em HTTP)
- Não tem um caminho de autenticação separado para conexões WebSocket
Migração da autenticação por token
Se você estiver migrando de autenticação por token para trusted-proxy:- Configure seu proxy para autenticar usuários e repassar cabeçalhos
- Teste a configuração do proxy de forma independente (curl com cabeçalhos)
- Atualize a configuração do OpenClaw com autenticação trusted-proxy
- Reinicie o Gateway
- Teste conexões WebSocket a partir da Control UI
- Execute
openclaw security audite revise os achados
Relacionado
- Security — guia completo de segurança
- Configuration — referência de configuração
- Remote Access — outros padrões de acesso remoto
- Tailscale — alternativa mais simples para acesso somente por tailnet