As regras de permissão do Claude Code permitem que você escreva entradas allow / ask / deny no settings.json para especificar, de forma granular, quais ferramentas, comandos, arquivos e domínios são executados sem perguntar, exigem confirmação a cada vez ou ficam proibidos. Elas podem ser compartilhadas com toda a equipe, então você bloqueia o que é perigoso com certeza enquanto deixa o trabalho seguro e rotineiro rodar sem interrupções.

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

Proibido (vence tudo)

ask

Pergunta toda vez

allow

Executa sem perguntar

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

O Claude Code usa um sistema de permissões em camadas. Leituras (visualização de arquivos, Grep, etc.) não precisam de aprovação; comandos Bash e edições de arquivo precisam — e, por cima desse patamar base, as regras permitem especificar exceções granulares (fonte: "Configure permissions", documentação oficial do Claude Code).

É fácil confundir regras com modos de permissão. Modos são o patamar amplo de "com que frequência ele pergunta" (default/acceptEdits/auto, etc.); regras são especificações por ferramenta e por comando. Eles trabalham juntos — o modo define o patamar base e as regras o sobrescrevem com "sempre permitir isto" ou "nunca permitir aquilo".

💡 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 a ferramenta. Vence qualquer allow, e um deny em qualquer nível sempre prevalece.

As regras são avaliadas na ordem deny → ask → allow. A primeira correspondência decide o resultado, e a especificidade da regra não altera essa ordem. Um deny amplo como Bash(aws *) vence um allow mais específico como Bash(aws s3 ls). A questão: um deny não pode carregar exceções de lista de permissão.

⚠️ 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

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 comandos seguros, bloqueia git push
{
  "permissions": {
    "allow": [
      "Bash(npm run *)",
      "Bash(git commit *)"
    ],
    "deny": [
      "Bash(git push *)"
    ]
  }
}

Atenção aos comandos compostos. O Claude Code entende separadores como && || ; |, e cada subcomando precisa corresponder de forma independente. Bash(safe-cmd *) não permite safe-cmd && rm -rf .. Note que comandos somente leitura (ls/cat/grep/find/pwd, etc.) rodam sem pergunta em todos os modos, e wrappers como timeout/nice/nohup são removidos antes da correspondência.

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

FormaÂncoraExemplo
//pathAbsoluto no sistema de arquivosRead(//tmp/x)
~/pathHomeRead(~/.ssh/**)
/pathRaiz do projetoEdit(/src/**)
path / ./pathDiretório atualRead(.env)

/Users/... NÃO é absoluto — é relativo à raiz do projeto. Use //Users/... (barra dupla) para caminhos absolutos. Read(.env) equivale a Read(**/.env) e corresponde a todos os .env abaixo.

4. Hierarquia e prioridade do settings.json

As regras ficam no settings.json. Há vários arquivos, e os níveis mais altos são mais fortes. A regra-chave: um deny em qualquer nível sempre vence um allow em qualquer outro nível.

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). Para ler/editar fora do diretório de trabalho, adicione caminhos a additionalDirectories.

5. Receitas práticas

Combinações comuns. A forma básica: bloqueie o perigoso com certeza, permita a rotina segura para automatizá-la.

🔒 Proteger arquivos secretos

deny: ["Read(.env)", "Read(**/secrets/**)", "Read(~/.ssh/**)"]. Bloqueie as leituras totalmente.

🚀 Sempre confirmar operações arriscadas

ask: ["Bash(git push *)", "Bash(rm *)"]. Força uma confirmação mesmo no modo auto.

⚡ Automatizar o trabalho rotineiro

allow: ["Bash(npm run *)", "Bash(git commit *)"]. Testes/builds/commits rodam sem interrupção.

Restringir URLs por padrões de argumento do Bash é frágil (curl http://github.com/ * é facilmente burlado por -X GET ou expansão de variáveis). Em vez disso, bloqueie curl/wget e permita domínios específicos com WebFetch(domain:...). Para um controle mais rígido, valide as URLs em um hook PreToolUse.

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.
  • O deny de Read/Edit não consegue impedir o acesso indireto. Ele se aplica às ferramentas de arquivo nativas e a cat/head/sed, mas não a um script Python ou Node que abre arquivos por conta própria. Para aplicação em nível de SO, use também sandboxing.
  • 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 sobrescrevem regras. Um hook PreToolUse pode estender permissões, mas deny/ask são avaliados independentemente do que o hook retorna (a regra de deny-primeiro não muda).

※ O comportamento segue a documentação oficial do Claude Code (Configure permissions / Settings), em junho 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 (vence a primeira correspondência; a especificidade é irrelevante). Um deny em qualquer nível sempre vence. Níveis: gerenciado > CLI > local > projeto > usuário.
  • 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.

"Bloqueie o perigoso com certeza, automatize a rotina segura" é o coração do design de regras. Combine isso com os modos de permissão, os hooks e a configuração de esforço para rodar o Claude Code com segurança e fluidez.

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 garanto que o .env nunca seja lido?

A. Defina deny: ["Read(.env)", "Read(**/secrets/**)"]. Note que isso se aplica às ferramentas de arquivo nativas e a comandos do tipo cat, mas não a leituras indiretas via script. Para aplicação em nível de SO, habilite também o sandboxing.

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

A. Não de forma confiável. curl http://github.com/ * é facilmente burlado por opções ou expansão de variáveis. Para limitar URLs, bloqueie curl/wget e use WebFetch(domain:...), ou valide em um hook PreToolUse.