Conteúdo
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.
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).
Executa sem perguntar
A ferramenta/comando especificado é executado sem aprovação manual.
Pergunta toda vez
Pede confirmação a cada uso. Um ask correspondente pergunta mesmo que um allow mais amplo também corresponda.
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.
| Ferramenta | Exemplo | Significado |
|---|---|---|
| Bash | Bash(npm run *) | Comandos que começam com npm run (o * ao final = limite de palavra) |
| Read / Edit | Read(./.env) | Lê o .env no diretório atual (caminho no estilo gitignore) |
| WebFetch | WebFetch(domain:example.com) | Acessos a example.com |
| MCP | mcp__github__get_* | As ferramentas get_ do servidor github |
| Agent | Agent(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 | Âncora | Exemplo |
|---|---|---|
//path | Absoluto no sistema de arquivos | Read(//tmp/x) |
~/path | Home | Read(~/.ssh/**) |
/path | Raiz do projeto | Edit(/src/**) |
path / ./path | Diretório atual | Read(.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.
| Prioridade | Local | Uso |
|---|---|---|
| 1 (mais forte) | Configurações gerenciadas | Política da organização. Não pode ser sobrescrita por usuários/CLI |
| 2 | Argumentos de linha de comando | Sobrescritas temporárias da sessão |
| 3 | .claude/settings.local.json | Configurações pessoais do projeto (no gitignore) |
| 4 | .claude/settings.json | Configurações compartilhadas do projeto (commitadas) |
| 5 | ~/.claude/settings.json | Configuraçõ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 *,npxedocker execexecutam seus argumentos como um comando, entãoBash(devbox run *)também permitedevbox 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.jsonpara 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.