O Claude Code usa regras de permissão com allow / ask / deny no settings.json para definir quais ferramentas, comandos, arquivos e domínios são permitidos sem confirmação, exigem aprovação ou são proibidos. Equipes podem compartilhá-las para rejeitar chamadas correspondentes e reduzir aprovações de tarefas comuns já revisadas. Elas não bloqueiam uniformemente outras formas de invocar o mesmo programa nem acessos por scripts.

Este guia cobre o que são as regras de permissão (e em que elas diferem dos modos de permissão), a prioridade entre allow/ask/deny, a sintaxe das regras, a hierarquia do settings.json e receitas práticas — tudo com base na especificação oficial.

CLAUDE CODE · REGRAS DE PERMISSÃO

Controle granular com allow / ask / deny

Avaliado deny → ask → allow (vence a primeira correspondência)

⛔

deny

Avalia primeiro as regras deny correspondentes

❓

ask

Pergunta toda vez

✅

allow

Executa sem perguntar

1. O que são as regras de permissão (vs. modos)

O Claude Code utiliza um sistema de permissões em camadas. Tomando Manual como referência, leituras na área de trabalho normalmente não exigem confirmação, enquanto edições e execução de Bash normalmente exigem, com exceções como comandos integrados somente de leitura e regras allow. Sobre essa base, as regras especificam exceções individuais (fonte: “Configure permissions”, documentação oficial do Claude Code).

É fácil confundir regras com modos de permissão. Os modos definem a política geral de confirmação (default, acceptEdits, auto etc.); as regras especificam ferramentas e comandos individuais. Eles se complementam: os modos definem a base e as regras a modificam com instruções como “sempre permita isto” ou “negue esta chamada”.

💡 As regras são aplicadas pelo Claude Code, não pelo modelo. Seu prompt ou o CLAUDE.md moldam o que o Claude tenta fazer, mas não o que é permitido. Conceda ou revogue acesso pelo /permissions, por regras, pelos modos ou por um hook PreToolUse.

2. allow / ask / deny e a ordem de prioridade

Existem três tipos de regra. O comando /permissions lista e edita essas regras (e mostra de qual settings.json cada uma vem).

ALLOW

Executa sem perguntar

A ferramenta/comando especificado é executado sem aprovação manual.

ASK

Pergunta toda vez

Pede confirmação a cada uso. Um ask correspondente pergunta mesmo que um allow mais amplo também corresponda.

DENY

Proibido (prioridade máxima)

Bloqueia o uso. Tem prioridade sobre allow: entre as regras de configuração, allow não pode anular um deny correspondente.

As regras são avaliadas na ordem deny → ask → allow. Entre as regras comuns de configuração, a primeira correspondência decide, e a especificidade não muda a ordem. Um deny amplo Bash(aws *) bloqueia até um allow mais específico Bash(aws s3 ls). O ponto principal é que allow não pode anular um deny correspondente. A negação em caminhos relativos de Read/Edit é um recurso separado.

⚠️ Duas formas de deny se comportam de modo diferente: um nome de ferramenta isolado como Bash remove a ferramenta inteiramente do contexto do Claude (o Claude nunca a vê). Uma regra com escopo como Bash(rm *) mantém a ferramenta disponível e bloqueia apenas as chamadas que correspondem.

3. Sintaxe das regras (Tool(specifier))

O formato é Tool (tudo) ou Tool(specifier) (específico). Cada ferramenta tem seu próprio estilo de specifier.

FerramentaExemploSignificado
BashBash(npm run *)Comandos que começam com npm run (o * ao final = limite de palavra)
Read / EditRead(./.env)Lê o .env no diretório atual (caminho no estilo gitignore)
WebFetchWebFetch(domain:example.com)Acessos a example.com
MCPmcp__github__get_*As ferramentas get_ do servidor github
AgentAgent(Explore)O subagente Explore

As regras de MCP valem apenas para o servidor que elas nomeiam. A partir da v2.1.299 (14 de outubro de 2026), mcp__a não permite outros servidores chamados a__b ou a_. Para um servidor cujo nome contenha __ ou termine com _, escreva o nome normalizado completo seguido de __*, como em mcp__reports__v2__* (documentação oficial e histórico de alterações, verificado em 18 de outubro de 2026).

Curingas do Bash podem aparecer em qualquer lugar. Bash(ls *) (espaço + *) corresponde a ls -la mas não a lsof (limite de palavra); Bash(ls*) (sem espaço) corresponde a ambos. Um :* ao final equivale a *.

// Permite ou nega chamadas específicas; não bloqueia todas as vias para o mesmo programa
{
  "permissions": {
    "allow": [
      "Bash(npm run *)",
      "Bash(git commit *)"
    ],
    "deny": [
      "Bash(git push *)"
    ]
  }
}

Comandos compostos são avaliados por subcomando, e invólucros reconhecidos são removidos antes da avaliação. Porém, outras formas de invocar o mesmo programa nem sempre correspondem: Bash(git push *) não corresponde a git -C . push. Comandos integrados somente de leitura normalmente dispensam confirmação, mas restrições de leitura fora da área de trabalho e esperas pelo classificador de auto são condições separadas.

Caminhos de Read/Edit seguem a semântica do gitignore com quatro âncoras:

FormaÂncoraExemplo
//pathAbsoluto no sistema de arquivosRead(//tmp/x)
~/pathHomeRead(~/.ssh/**)
/pathA âncora do arquivo de configuração (raiz do projeto nas configurações do projeto, ~/.claude nas do usuário)Edit(/src/**)
path / ./pathDiretório atualRead(.env)

* /Users/... NÃO é absoluto — é relativo à âncora do arquivo de configuração (a raiz do projeto nas configurações do projeto). Nas configurações do usuário, Read(/secrets/**) aponta para ~/.claude/secrets/**; para uma regra que valha em todos os projetos, use // ou ~/. Use //Users/... (barra dupla) para caminhos absolutos. Read(.env) equivale a Read(**/.env) e corresponde a todos os .env abaixo.

A negação em regras deny de caminhos relativos é um recurso separado. Em uma lista da mesma fonte, colocar Read(!sample.env) depois de Read(*.env) exclui sample.env do escopo dessa regra. Isso não remove um deny de outra fonte, uma regra ancorada com /, ~/ ou //, nem a negação de um diretório inteiro. Não confunda isso com anular deny por allow. Documentação oficial: padrões de negação.

4. Hierarquia e prioridade do settings.json

Os valores das configurações são resolvidos pela hierarquia. Para regras de permissão, um deny correspondente é avaliado antes de allow. A tabela descreve a prioridade entre regras de arquivos de configuração e da CLI; não é uma garantia absoluta que também abranja mudanças de decisão por mods.

PrioridadeLocalUso
1 (mais forte)Configurações gerenciadasPolítica da organização. Não pode ser sobrescrita por usuários/CLI
2Argumentos de linha de comandoSobrescritas temporárias da sessão
3.claude/settings.local.jsonConfigurações pessoais do projeto (no gitignore)
4.claude/settings.jsonConfigurações compartilhadas do projeto (commitadas)
5~/.claude/settings.jsonConfigurações do usuário em todos os projetos
// .claude/settings.json (compartilhado pela equipe)
{
  "permissions": {
    "defaultMode": "acceptEdits",
    "allow": ["Bash(npm run *)", "WebFetch(domain:docs.example.com)"],
    "deny": ["Read(.env)", "Read(**/secrets/**)", "Bash(git push *)"],
    "additionalDirectories": ["../shared-lib"]
  }
}

O modo de permissão padrão também é definido aqui, como defaultMode (detalhes dos modos). Mas auto e bypassPermissions não têm efeito nas configurações de projeto (.claude/settings.json, .claude/settings.local.json); coloque-os nas configurações de usuário ou gerenciadas. Para ler/editar fora do diretório de trabalho, adicione caminhos a additionalDirectories.

5. Receitas práticas

Comece por restringir allow a chamadas comuns revisadas e usar ask/deny nas chamadas que deseja limitar. Isso não controla automaticamente outras formas de realizar a mesma operação nem tudo o que ocorre dentro de um script permitido.

🔒 Proteger arquivos secretos

deny: ["Read(.env)", "Read(**/secrets/**)", "Read(~/.ssh/**)"]. Restringe ferramentas de arquivo integradas e comandos de arquivo cujos caminhos de destino podem ser reconhecidos. Outras vias permanecem, incluindo buscas recursivas, scripts arbitrários e MCP.

🚀 Adicione confirmação a chamadas específicas

ask: ["Bash(git push *)", "Bash(rm *)"]. Adiciona confirmação a chamadas correspondentes mesmo em auto. Atenção a outras formas de invocação e a mudanças de decisão por mods.

⚡ Automatizar o trabalho rotineiro

allow: ["Bash(npm run *)", "Bash(git commit *)"]. Testes/builds/commits rodam sem interrupção. Mas no modo automático uma regra ampla de execução do gerenciador de pacotes como Bash(npm run *) é retirada e esses comandos passam pelo classificador.

A correspondência de argumentos Bash não basta para impor restrições de URL. Mesmo uma política que negue curl/wget e use WebFetch deixa vias por caminhos absolutos, sh -c e outros programas. Regras de domínio do WebFetch controlam essa ferramenta, não todo o tráfego de Bash. Para impor destinos, combine controles como a lista de destinos permitidos do sandbox e gerencie separadamente ferramentas e novas tentativas fora do sandbox.

6. Pegadinhas e confusões comuns

  • O deny é aplicado pelo Claude Code, não pelo modelo. Escrever "não leia isto" no seu prompt ou no CLAUDE.md não o impedirá sem uma regra.
  • Deny de Read/Edit não impede acesso indireto. Aplica-se a ferramentas de arquivo integradas e a cat/head/sed, mas não a scripts Python ou Node que abrem arquivos por conta própria. Outra exceção são operações recursivas como grep -r pattern ., que não nomeiam o arquivo de destino. Restrições do sistema operacional se aplicam a processos dentro do sandbox; Read integrado, MCP e outras vias precisam de controles separados.
  • Cuidado com executores de ambiente. devbox run *, npx e docker exec executam seus argumentos como um comando, então Bash(devbox run *) também permite devbox run rm -rf .. Escreva regras que incluam o comando interno.
  • Hooks não anulam regras. Um hook PreToolUse pode ampliar permissões, mas deny/ask são avaliados independentemente do resultado. Porém, tool.check de um mod pode substituir a decisão em uma etapa posterior. Pode aprovar ask e, em ambientes pessoais sem configurações gerenciadas, também deny. Em dispositivos gerenciados e Team/Enterprise, deny tem prioridade por padrão, embora configurações da organização possam mudar isso. É preciso decidir se você confia nos mods instalados.
  • No modo automático, até um comando da sua lista allow pode passar pelo classificador. Ao entrar no modo automático, as regras allow amplas que permitem executar código arbitrário (Bash(*) irrestrito, interpretadores com curinga como Bash(python*), comandos run de gerenciadores de pacotes, regras Agent etc.) são retiradas e voltam quando você sai do modo; regras estreitas como Bash(npm test) continuam valendo. As regras só coincidem como estão escritas, então Bash(git push *) não coincide com git -C . push, e um comando sem regra correspondente é julgado pelo classificador. Escritas em caminhos protegidos também passam pelo classificador, mesmo com uma regra allow. Se uma ação legítima for bloqueada, dá para tentar de novo pelo Recently blocked (Recently denied antes da v2.1.314) em /permissions (veja modos de permissão). Também há issues no GitHub relatando comandos permitidos que foram bloqueados (por exemplo, #95996). Este item segue a documentação oficial (Choose a permission mode) em 9 de outubro de 2026.

* O comportamento segue a documentação oficial do Claude Code (Configure permissions / Settings files and precedence / Choose a permission mode), em 9 de outubro de 2026. Ele pode mudar — consulte a documentação oficial para a versão mais recente.

Resumo

Três pontos essenciais sobre as regras de permissão do Claude Code.

  • O que são: allow/ask/deny no settings.json para conceder/perguntar/proibir por ferramenta, comando, arquivo e domínio. Os modos definem o patamar base; as regras cuidam dos detalhes.
  • Prioridade: deny → ask → allow (a primeira correspondência vence; a especificidade não importa). Entre regras de configuração, allow não pode anular um deny correspondente. Níveis: managed > CLI > local > project > user.
  • Sintaxe: Tool(specifier). Bash usa curingas (espaço + * é um limite de palavra), Read/Edit usam caminhos no estilo gitignore, WebFetch usa domain:. Comandos compostos exigem que cada subcomando corresponda.

Entenda a que cada regra corresponde e reduza apenas as aprovações que precisa reduzir. Combine regras com modos de permissão e hooks. Considere um sandbox quando precisar de restrições efetivas de arquivos ou rede. Distinga qual camada cobre cada via.

Se você quer investigar o estado atual e receber orientação sem alterar o código, consulte como usar Codex e Claude Code apenas para investigar. O guia inclui os passos no aplicativo, no IDE e na CLI, além de uma instrução para impedir que o agente passe à implementação.

FAQ

Q. Como as regras de permissão diferem dos modos?

A. Os modos são o patamar amplo de confirmação (default/acceptEdits/auto, etc.); as regras são especificações por ferramenta e por comando. Eles trabalham juntos, e as regras sobrescrevem os modos (por exemplo, regras ask/deny continuam valendo no modo auto).

Q. Eu permiti — por que ele ainda pergunta?

A. Porque a avaliação é deny → ask → allow. Se um ask (ou deny) separado também corresponder à chamada, ele vence mesmo um allow mais específico. A especificidade não altera a ordem.

Q. Onde coloco o settings.json?

A. Compartilhado pela equipe: .claude/settings.json (commitado). Pessoal: .claude/settings.local.json (no gitignore). Em todos os projetos: ~/.claude/settings.json. Para aplicação em toda a organização, use as configurações gerenciadas (não podem ser sobrescritas).

Q. Como posso restringir a leitura de .env?

A. deny: ["Read(.env)", "Read(**/secrets/**)"] restringe ferramentas de arquivo integradas e comandos de arquivo reconhecíveis. Não garante bloquear todas as vias, incluindo buscas recursivas que não nomeiam o caminho de destino, Python/Node e MCP. Para o shell, confira permissões de leitura do sistema operacional ou denyRead dentro do sandbox; confira separadamente as permissões de outras ferramentas.

Q. Posso restringir URLs ou arquivos por argumentos do Bash?

A. A correspondência de strings de comandos não bloqueia outras formas de invocação nem operações equivalentes de rede e arquivos por outros programas. Regras de domínio do WebFetch se aplicam ao WebFetch. Para impor limites, combine isolamento de arquivos e rede do shell com controles separados do acesso fora do sandbox.

O alcance e as exceções das permissões e do isolamento foram novamente conferidos na documentação oficial original em 9 de outubro de 2026. Não foram alteradas configurações do dispositivo nem realizados testes de inicialização.