← Todos os artigos
Guide

Rode Claude Code com segurança em um dev container com auto mode e permissões travadas

A secure developer workstation scene: a laptop connected to an isolated container box, outbound network arrows passing t

A Anthropic colocou um número duro em um problema que todo usuário pesado de Claude Code já sente: usuários aprovaram cerca de 93% dos prompts de permissão, e a empresa diz que a atenção cai conforme os prompts vão se acumulando (Anthropic). Isso é fadiga de aprovação, e transforma “humano no loop” em “humano segurando Enter.”

A resposta errada é rodar --dangerously-skip-permissions no seu laptop e torcer para o modelo se comportar. A resposta certa é engenharia de segurança sem glamour: colocar o Claude Code em um dev container, dar a ele só o repo, restringir tráfego de saída, desativar bypass mode por política e usar auto mode apenas onde ele é de fato suportado.

Este guia mostra uma configuração executável que você pode colocar em um repo hoje. Ele também cobre a discussão atual da comunidade: desenvolvedores querem agentes mais autônomos, mas não querem guardrails invisíveis nem varredura de arquivos em caixa-preta. A resposta prática não é “confie mais no Claude.” É “reduza o raio de explosão até a autonomia ficar aceitável.”

Esboço de arquitetura em estilo capa mostrando um editor no host, um dev container, Claude Code rodando como usuário não-root, um manage

O Debate É Mesmo Sobre Observabilidade e Raio de Explosão

A thread do Hacker News em torno de “Anthropic tenta esconder as ações de IA do Claude” não é só teatro de reclamação. Um comentarista resumiu o medo dos desenvolvedores: se um agente começa a abrir config velha ou vasculhar arquivos irrelevantes, o operador precisa saber rápido o bastante para interromper (Hacker News). Outra thread sobre rodar Claude Code “de forma perigosa” convergiu para o mesmo padrão prático: deixe o agente rodar livremente, mas só dentro de uma sandbox com acesso limitado a arquivos e rede (Hacker News).

O próprio post de engenharia da Anthropic chega ao mesmo lugar. Ele separa as defesas em ambiente, modelo e conteúdo externo. O ambiente é a parte que você consegue tornar determinística. Se credenciais nunca entram na sandbox, Claude não consegue exfiltrá-las, seja a causa uma injeção de prompt, excesso de iniciativa do modelo ou uma instrução ruim do usuário (Anthropic).

Auto mode se encaixa aqui, mas não é mágica. A Anthropic diz que auto mode usa um classificador separado para revisar ações antes que elas rodem, e a documentação chama isso de research preview, não de substituto para revisão em operações sensíveis (Claude Code docs). Essa distinção importa. Auto mode reduz prompts. Containers reduzem consequências.

Esta é a postura que recomendo para times:

ModeUse paraNão use para
planrepos desconhecidos, mudanças arriscadasedições longas sem supervisão
acceptEditstrabalho normal de featuredeploys, segredos, mudanças de infra
autodev containers isolados com controle de egresssistemas de produção ou repos desconhecidos
bypassPermissionsVMs descartáveis apenaslaptops de desenvolvedores

A documentação da Anthropic diz que auto mode exige Claude Code v2.1.83 ou posterior. Na Anthropic API, os modelos suportados incluem Claude Opus 4.6 ou posterior e Sonnet 4.6. No Bedrock, Vertex AI e Microsoft Foundry, a documentação lista apenas Opus 4.7 e Opus 4.8 para auto mode (Claude Code docs).

Monte o Dev Container

Crie três arquivos no seu repo:

.devcontainer/
  devcontainer.json
  Dockerfile
  managed-settings.json

Comece com .devcontainer/devcontainer.json:

{
  "name": "claude-code-safe",
  "build": {
    "dockerfile": "Dockerfile"
  },
  "remoteUser": "node",
  "mounts": [
    "source=claude-code-config-${devcontainerId},target=/home/node/.claude,type=volume"
  ],
  "runArgs": [
    "--cap-add=NET_ADMIN",
    "--cap-add=NET_RAW"
  ],
  "containerEnv": {
    "CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC": "1",
    "DISABLE_AUTOUPDATER": "1",
    "ANTHROPIC_BASE_URL": "https://api.onehop.ai/anthropic",
    "ANTHROPIC_API_KEY": "${localEnv:ONEHOP_API_KEY}"
  },
  "postCreateCommand": "sudo /usr/local/bin/init-firewall.sh"
}

A documentação de dev container da Anthropic recomenda rodar Claude Code dentro de um container para que os comandos executem longe do host, enquanto as edições ainda aparecem no repo montado (Claude Code docs). Ela também alerta para não montar segredos do host, como ~/.ssh ou arquivos de credenciais de cloud. Siga esse conselho. Se Claude precisar de um token do GitHub com escopo do repo, passe um token de vida curta pelo ambiente. Não faça bind mount do seu diretório home inteiro só porque é conveniente.

Agora o Dockerfile:

FROM mcr.microsoft.com/devcontainers/javascript-node:22

RUN npm install -g @anthropic-ai/claude-code@latest

COPY managed-settings.json /etc/claude-code/managed-settings.json
COPY init-firewall.sh /usr/local/bin/init-firewall.sh

RUN chmod +x /usr/local/bin/init-firewall.sh

A documentação da Anthropic também oferece um Dev Container Feature, mas instalar pelo Dockerfile deixa política e versionamento mais fáceis de entender em um repo de time. Se quiser reprodutibilidade, fixe @anthropic-ai/claude-code em uma versão específica e mantenha DISABLE_AUTOUPDATER=1.

Trave as Permissões Antes de Ativar Auto Mode

Crie .devcontainer/managed-settings.json:

{
  "permissions": {
    "defaultMode": "auto",
    "disableBypassPermissionsMode": "disable",
    "deny": [
      "Read(./.env)",
      "Read(./.env.*)",
      "Read(./secrets/**)",
      "Read(./config/credentials.json)",
      "Bash(curl *)",
      "Bash(wget *)",
      "Bash(git push *)",
      "Bash(kubectl *)",
      "Bash(terraform apply *)",
      "WebFetch(domain:169.254.169.254)"
    ],
    "ask": [
      "Bash(npm publish *)",
      "Bash(docker push *)",
      "Bash(gh release *)"
    ],
    "allow": [
      "Bash(npm install)",
      "Bash(npm test *)",
      "Bash(npm run lint *)",
      "Bash(git diff *)",
      "Bash(git status *)"
    ]
  },
  "autoMode": {
    "environment": {
      "trustedDomains": [
        "registry.npmjs.org",
        "github.com"
      ]
    }
  }
}

Dois detalhes aqui fazem trabalho de verdade.

Primeiro, disableBypassPermissionsMode bloqueia bypassPermissions e desativa a flag --dangerously-skip-permissions quando aplicado por managed settings. A Anthropic documenta exatamente esse controle na referência de settings (Claude Code docs).

Segundo, regras de deny continuam importando em auto mode. A Anthropic diz que auto mode bloqueia ações que escalam além do pedido, miram infraestrutura não reconhecida ou parecem conduzidas por conteúdo hostil, mas você não deve terceirizar a política do seu time para um classificador. Se ninguém deve rodar terraform apply a partir de uma sessão de agente, codifique isso como uma regra de deny.

Uma ressalva: política gerenciada pelo repositório pode ser editada por qualquer pessoa que consiga editar o repo. A documentação da Anthropic diz que /etc/claude-code/managed-settings.json tem alta precedência dentro do Linux, mas para uma política que desenvolvedores não possam contornar editando arquivos do repo, use settings gerenciadas no servidor ou MDM (Claude Code docs). Para um time de startup, política versionada no repo ainda é uma boa linha de base. Para rollout corporativo, não pare aí.

Painel comparativo antes e depois: à esquerda, Claude Code em um laptop host com acesso ao diretório home, chaves SSH,

Restrinja Egress Com uma Allowlist Pequena

Adicione .devcontainer/init-firewall.sh:

#!/usr/bin/env bash
set -euo pipefail

ALLOWED_HOSTS=(
  api.onehop.ai
  api.anthropic.com
  claude.ai
  platform.claude.com
  registry.npmjs.org
  github.com
  raw.githubusercontent.com
)

iptables -P OUTPUT DROP
iptables -A OUTPUT -o lo -j ACCEPT
iptables -A OUTPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

for host in "${ALLOWED_HOSTS[@]}"; do
  for ip in $(getent ahostsv4 "$host" | awk '{print $1}' | sort -u); do
    iptables -A OUTPUT -p tcp -d "$ip" --dport 443 -j ACCEPT
  done
done

iptables -A OUTPUT -p udp --dport 53 -j ACCEPT
iptables -A OUTPUT -p tcp --dport 53 -j ACCEPT

Isto é propositalmente simples. Ele resolve os hostnames permitidos na inicialização e libera TCP 443 para esses IPs. Para controle em nível de produção, coloque o container atrás de um proxy e registre cada request. Mas mesmo essa regra básica de deny por padrão é melhor do que deixar um agente de coding autônomo falar com a internet inteira.

A documentação de rede da Anthropic lista domínios necessários como api.anthropic.com, claude.ai, platform.claude.com, downloads.claude.ai, storage.googleapis.com e raw.githubusercontent.com, dependendo do caminho de instalação e autenticação (Claude Code docs). Se você instala via npm e desativa auto-updates, talvez não precise dos domínios de download em runtime. Mantenha a lista enxuta, depois adicione domínios só quando builds falharem por um motivo conhecido.

Rode:

export ONEHOP_API_KEY=oh_your_key_here
code .
# VS Code: Dev Containers: Rebuild and Reopen in Container
claude --permission-mode auto

Dentro do container, verifique:

whoami
claude --version
curl -I https://api.onehop.ai
curl -I https://example.com

A request para o OneHop deve funcionar. A request para example.com deve falhar, a menos que você tenha adicionado o domínio.

Roteie Claude Fable 5 Pelo OneHop

A Anthropic lançou Claude Fable 5 e Claude Mythos 5 em 9 de junho de 2026, com Fable 5 custando US$ 10 por milhão de tokens de entrada e US$ 50 por milhão de tokens de saída, menos da metade do preço do Mythos Preview (Anthropic). O OneHop lista Claude Fable 5 como anthropic/claude-fable-5, com preço oficial exibido como US$ 10/M de entrada e US$ 50/M de saída, e preço do OneHop exibido como US$ 3/M de entrada e US$ 15/M de saída, além de US$ 10 de crédito grátis para novos usuários sem exigir cartão (OneHop).

Nota operacional atual: a página do Fable 5 no OneHop diz que o modelo está temporariamente indisponível, embora continue listado. Mantenha a configuração pronta, mas espere usá-la quando sua conta e região tiverem acesso.

Para uma chamada direta à Anthropic Messages pelo OneHop, use o endpoint compatível com Anthropic que o OneHop publica para este modelo:

from anthropic import Anthropic

client = Anthropic(
    base_url="https://api.onehop.ai/anthropic",
    api_key="oh_your_key_here",
)

message = client.messages.create(
    model="anthropic/claude-fable-5",
    max_tokens=1024,
    messages=[{"role": "user", "content": "Summarize this repo's test strategy."}],
)

print(message.content[0].text)

Se o seu app já usa o gateway compatível com OpenAI do OneHop, a mudança de uma linha na base URL é:

client = OpenAI(base_url="https://api.onehop.ai/v1", api_key="oh_your_key_here")

Para Claude Code especificamente, use a base URL compatível com Anthropic em ANTHROPIC_BASE_URL, porque Claude Code fala a Anthropic Messages API. A página do modelo Fable 5 no OneHop atualmente lista Anthropic Messages como disponível em https://api.onehop.ai/anthropic, enquanto OpenAI Chat Completions está marcado como não suportado para este modelo (OneHop).

Gráfico compacto de comparação de preços com três barras por modelo: preço de lista da Anthropic para Fable 5 a US$ 10 entrada e US$ 50 saída,

O Modelo Operacional: Confie Menos, Entregue Mais Rápido

A melhor configuração de Claude Code não é a mais permissiva. É aquela em que erros saem barato.

Use o modo plan quando Claude estiver explorando uma base de código nova. Troque para auto só depois que a tarefa estiver bem delimitada. Mantenha bypassPermissions desativado por política. Negue leituras de segredos. Negue deploys, pushes para branches protegidas, mutações em cloud e endpoints de metadados. Coloque o agente em um dev container não-root. Bloqueie egress por padrão. Revise o diff antes do merge.

Isso pode soar mais lento do que o modo YOLO. Na prática, é mais rápido porque ninguém precisa ficar cuidando de 40 prompts triviais nem se perguntando se uma aprovação acabou de deixar um modelo exfiltrar um token. O próprio post de contenção da Anthropic diz que o dev container de referência existe para que Claude Code possa rodar sem supervisão sem aprovações por ação (Anthropic). A peça que falta é a política do time.

Se você quer o caminho mais curto para experimentar trabalho de coding de classe Fable sem reconstruir sua stack de provedores, roteie por Claude Fable 5 no OneHop. Novas contas podem começar com US$ 10 grátis. A mudança de base URL é a parte fácil. O ganho real é combiná-la com um container que torna a autonomia segura o bastante para usar.