Pular para o conteúdo
Menu
Preciso disso?O que um agente alcança na sua máquinaComo funcionaAs camadas entre o agente e o seu sistemaCompararSandboxes embutidos, Docker e VMsConfigurarAbra só o que a tarefa precisaSegurançaO modelo de ameaças e seus limitesInstalar
Configurar

Fechado por padrão. Quem liga é você.

Sem nenhuma opção, o agente recebe só o seu projeto, sem rede, login ou chaves. Você abre o que a tarefa precisa, uma opção de cada vez, e também pode fechar a jaula ainda mais.

Três lugares de onde vem uma configuração

As configurações vêm de um arquivo dentro do projeto, de um arquivo no seu diretório home e das flags que você digita. A lista vai da menor para a maior autoridade.

Três fontes alimentam a jaula. O arquivo .ai-jail do projeto só consegue apertá-la. O arquivo global ~/.ai-jail é confiável. As flags de linha de comando têm prioridade sobre os dois. Dentro da jaula fica o agente, atrás de uma fileira de interruptores, a maioria desligada.
Um repositório que você clonou não consegue abrir a própria jaula.

.ai-jail do projeto

O ai-jail trata esse arquivo como não confiável: ele pode apertar a jaula, nunca abrir. O ai-jail nunca o segue através de um symlink, e o agente vê um arquivo vazio no lugar dele.

~/.ai-jail global

É seu, então o ai-jail confia nele. Ele guarda uma tabela base para todas as execuções, mais tabelas [commands.<name>] escolhidas pela primeira palavra do comando.

Flags de linha de comando

As flags têm a maior autoridade. A maioria das opções vem em pares, como --network e --no-network, então uma flag também fecha o que um arquivo abriu.

Numa tabela de comando, valores simples substituem os da base, e listas como mapeamentos e máscaras são somadas a ela.

~/.ai-jail
# base: vale para todos os comandoshide_dotdirs = [".my_secrets"]mask = [".env", ".env.*"] # só quando o comando começa com "claude"[commands.claude]network = trueagent_state = trueenv_pass = ["ANTHROPIC_BASE_URL"]mask = ["*.pem"]

As opções

Cada linha fica desligada até você pedir, e cada flag de recurso tem uma gêmea --no- que fecha de novo. Um selo vermelho marca uma opção que enfraquece a jaula. Segurança tem a lista completa e os motivos.

Rede e serviços

FlagChave de configuraçãoO que fazRisco
--networknetwork = trueAcesso irrestrito à rede. Tudo o que o agente consegue ler, ele consegue enviar para fora.Enfraquece a jaula
--sshssh = trueO seu ~/.ssh, somente leitura, e o socket do seu agente SSH, para o git push funcionar.Abre uma coisa
--dockerno_docker = falseO socket do Docker. Na prática é root na sua máquina, porque o daemon pode subir containers que montam o host.Enfraquece a jaula
--tailscaletailscale = trueO socket do Tailscale.Abre uma coisa
--systemd-usersystemd_user = trueO barramento de usuário do systemd. O agente pode pedir ao seu gerenciador de usuário para rodar serviços no host. Só no Linux.Enfraquece a jaula

Agente e ambiente

FlagChave de configuraçãoO que fazRisco
--agent-stateagent_state = trueO login e as configurações do próprio agente, como ~/.claude ou ~/.codex. A partir daí, tudo o que roda na jaula pode usar essas credenciais.Abre uma coisa
--claude-dir <PATH>claude_dir = "..."Usa o diretório informado como estado do Claude e define CLAUDE_CONFIG_DIR.Abre uma coisa
--env <NAME[=VALUE]>nenhumaRepassa uma variável do seu shell, ou define uma com NAME=VALUE. Pode ser repetida e nunca é salva em disco.Abre uma coisa
--inherit-envinherit_env = trueRepassa o ambiente inteiro do seu shell, com todos os segredos que houver nele. Evite.Enfraquece a jaula
nenhumaenv_pass = ["NAME"]O mesmo que --env, só a partir do arquivo global. Um arquivo de projeto que defina essa chave é ignorado.Abre uma coisa

Desktop e hardware

FlagChave de configuraçãoO que fazRisco
--gpuno_gpu = falseOs dispositivos de GPU, e com eles a superfície de ataque do driver. Só no Linux.Abre uma coisa
--displayno_display = falseO socket do Wayland e mais nada da sua sessão. Só no Linux.Abre uma coisa
--x11x11 = trueO socket do X11. O X11 permite que um programa capture teclas e tire screenshots.Enfraquece a jaula
--audioaudio = trueOs sockets do PipeWire e do PulseAudio e o /dev/snd. Tudo o que roda na jaula pode gravar e reproduzir áudio. Só no Linux.Abre uma coisa
--host-shmhost_shm = trueO /dev/shm do host, que abre memória compartilhada com processos de fora da jaula.Abre uma coisa
--picturespictures = trueO seu ~/Pictures, somente leitura.Abre uma coisa
--browser[=hard|soft]browser_profile = "hard"Um perfil de navegador separado. hard (o padrão) não guarda nada entre execuções, soft mantém um perfil em ~/.local/share/ai-jail/browsers.Abre uma coisa

Arquivos

FlagChave de configuraçãoO que fazRisco
--map <PATH|SOURCE:DEST>ro_maps = [...]Monta mais um caminho como somente leitura. Escreva SOURCE:DEST para montar em outro lugar. Pode ser repetida.Abre uma coisa
--rw-map <PATH|SOURCE:DEST>rw_maps = [...]Monta mais um caminho com leitura e escrita. Pode ser repetida.Abre uma coisa
--overlay-map <PATH>overlay_maps = [...]Monta um caminho em copy-on-write: o que o agente escreve vai para uma camada à parte e o original fica intacto. Só no Linux; no macOS vira uma montagem somente leitura.Abre uma coisa
--hide-dotdir <NAME>hide_dotdirs = [...]Nunca monta o diretório oculto indicado, por exemplo .my_secrets. Pode ser repetida.

Camadas que você pode desligar, e não deveria

FlagChave de configuraçãoO que fazRisco
--no-landlockno_landlock = trueDesliga o Landlock, a cópia das regras de arquivo que fica no próprio kernel. É recusada com --lockdown.Enfraquece a jaula
--no-seccompno_seccomp = trueDesliga o filtro que bloqueia chamadas de sistema perigosas.Enfraquece a jaula
--no-rlimitsno_rlimits = trueDesliga os limites que seguram processos fora de controle.Enfraquece a jaula
--no-private-homeprivate_home = falseAbre mão do diretório home novo. É acesso amplo ao seu home real. Prefira --map para o único caminho de que você precisa.Enfraquece a jaula

Como funciona explica o que cada camada faz.

Utilitários

FlagO que faz
--dry-runImprime o comando de sandbox e não roda nada. Nunca grava arquivo de configuração.
--initGrava ou atualiza o .ai-jail do projeto e sai.
--cleanIgnora o .ai-jail do projeto nesta execução.
--bootstrapGera configurações de permissão para as próprias ferramentas de IA.
statusMostra a configuração atual do .ai-jail.
-v, --verboseMostra cada montagem enquanto a jaula é construída.

Rode ai-jail --help para ver o resto: a barra de status, worktrees, mise e opções de terminal.

Esconda segredos dentro do projeto

Seu arquivo .env mora no projeto, e o projeto tem leitura e escrita. Com a rede ligada, o agente pode enviar para fora o que conseguir ler ali. Mascarar tira esses arquivos do alcance dele.

Uma pasta de projeto. O agente alcança src, package.json e README.md. O arquivo .env está mascarado e a pasta secrets está negada: os dois aparecem apagados e gradeados, e nenhuma linha do agente chega até eles.
O resto do projeto continua como estava.

--mask <PATH|GLOB>

Substitui cada arquivo que bate com o padrão por um placeholder vazio. O agente vê que o arquivo existe e não recebe conteúdo nenhum, então ferramentas que só checam a existência dele continuam funcionando.

--deny-path <PATH|GLOB>

Transforma cada caminho que bate com o padrão num erro de permissão.

--mask-except e --deny-path-except

Tiram um caminho de dentro de uma regra. Elas enfraquecem a proteção, então um arquivo de projeto não pode defini-las.

Como flags
# coloque os globs entre aspas para o ai-jail receber o padrão, e não a expansão do seu shellai-jail --mask .env --mask '.env.*' --mask '*.pem' --deny-path secrets/ claude ai-jail --mask '.env.*' --mask-except .env.example claude
.ai-jail
# um arquivo de projeto pode apertar, então isto também funciona no repositóriomask = [".env", ".env.*", "*.pem"]deny_paths = ["secrets/"]

Lockdown: o agente lê o código e não pode alterar nada

--lockdown serve para revisões e auditorias. O agente lê o projeto e responde perguntas sobre ele, mas não consegue alterar nenhum arquivo.

Dois painéis. No modo normal, o agente fica dentro do muro ao lado de uma pasta de projeto em que pode ler e escrever e de uma pasta /tmp. No lockdown o muro é mais grosso, a pasta do projeto é somente leitura e /tmp é o único lugar gravável.
O agente e o projeto são os mesmos, e só um diretório temporário é gravável.

O que muda

  • O projeto é montado como somente leitura
  • Só o /tmp é gravável no Linux. No macOS, nada é
  • Nenhum diretório oculto do seu home, nenhum mapeamento extra, nenhum overlay
  • O ambiente é limpo e o PATH fica fixo nos diretórios do sistema
  • O Landlock é obrigatório: se não puder ser aplicado, a inicialização falha
  • Limites mais apertados de processos, arquivos abertos e tamanho de arquivo
  • Sem tela, áudio, GPU, Docker, agente SSH ou mise, não importa o que mais você tenha passado
terminal
ai-jail --lockdown claude

Receitas

Copie uma. Para ver o que ela monta, rode antes com --dry-run.

Um agente em nuvem, no dia a dia

Um modelo hospedado precisa da rede para chegar à API e do próprio login para autenticar. Coloque os dois no arquivo global e o comando continua curto.

~/.ai-jail
# uma vez, em ~/.ai-jail[commands.claude]network = trueagent_state = true # depois, em qualquer projetoai-jail claude

Git push via SSH

--ssh monta ~/.ssh como somente leitura e encaminha o socket do seu agente SSH. O push também precisa da rede.

terminal
ai-jail --network --ssh --agent-state claude

Toolchains do mise

O diretório home novo não tem nenhuma instalação do mise, então o ai-jail pula o mise. Mapeie os dois diretórios do mise para dentro, somente leitura.

~/.ai-jail
[commands.claude]ro_maps = ["~/.config/mise", "~/.local/share/mise"]

Um navegador para o agente

--browser sozinho entrega um navegador que não carrega página nem abre janela. No Linux ele também precisa de --network e --display, e um navegador X11 precisa de --x11 no lugar de --display.

terminal
# Waylandai-jail --browser=soft --network --display chromium# X11ai-jail --browser=soft --network --x11 chromium

Perfis separados do Claude

Mantenha o login do trabalho e o pessoal separados apontando cada execução para um diretório do Claude próprio.

terminal
ai-jail --network --claude-dir ~/.claude-work claude

Teste um refactor arriscado numa cópia

Um overlay guarda o que o agente escreve numa camada à parte, em .ai-jail-overlays dentro do projeto. Depois compare com o original e fique com o que gostar. Só no Linux.

terminal
ai-jail --network --agent-state --overlay-map ~/Projects/my-app/src claude

Configs antigas continuam funcionando

Compatibilidade retroativa é regra do projeto: nenhuma flag ou chave de configuração é removida. Chaves desconhecidas são ignoradas e as que faltam assumem o valor padrão, então um arquivo escrito para uma versão antiga ainda carrega.

As opções mais antigas mantêm os nomes invertidos, em que true desliga a coisa: no_gpu, no_docker, no_display, no_mise, no_landlock, no_seccomp, no_rlimits. É por isso que --gpu é salvo como no_gpu = false. As opções mais novas usam nomes diretos, como network = true.

Coloque seu agente atrás das grades

O ai-jail é um binário único que não precisa de daemon nem de root. Você acrescenta uma palavra na frente do comando que já usa.

terminal
brew tap akitaonrails/tap && brew install ai-jailai-jail claude