03. Permissões e Policies¶
🎯 Objetivo¶
Controlar o que o agente pode fazer com permissões (por agente, com ask/deny) e policies (binárias, nunca perguntam, só restringem).
🧩 Permissões vs Policies¶
Permissões (permissions) |
Policies (policies) |
|
|---|---|---|
| Efeitos | allow, ask, deny |
allow, deny (nunca pergunta) |
| Escopo | Regras por ação/ferramenta | Podem extinguir provider/MCP/skill/plugin |
| Papel | Decide o fluxo do agente | Aperta o que permissões permitiriam |
📋 Permissões — regras ordenadas¶
{
"permissions": [
{ "action": "shell", "resource": "git push *", "effect": "ask" },
{ "action": "read", "resource": ".env*", "effect": "deny" }
]
}
- A última regra que casa vence → regras amplas primeiro, exceções depois
*casa zero ou mais caracteres;?casa um
Ações comuns¶
| Ação | Cobre |
|---|---|
shell |
Comandos de shell |
edit |
Editar/criar/patch |
read, glob, grep |
Descoberta local |
subagent |
Agentes filhos |
webfetch, websearch |
Ferramentas de web |
skill |
Carregar skills |
external_directory |
Acesso fora do projeto/worktree |
⚠️ Na V2,
external_directoryé permitido por padrão (diferente da V1). Para exigir aprovação:{ "action": "external_directory", "resource": "*", "effect": "ask" }.
Por agente¶
As mesmas regras podem ficar sob agents.<id>.permissions para valer só num agente.
🛡️ Policies — restrição binária¶
{
"policies": [
{ "action": "provider.use", "resource": "*", "effect": "deny" },
{ "action": "provider.use", "resource": "anthropic", "effect": "allow" },
{ "action": "tool.use", "resource": "shell:git push *", "effect": "deny" },
{ "action": "integration.use", "resource": "mcp:*", "effect": "deny" }
]
}
| Ação | Resource | Extingue |
|---|---|---|
provider.use |
ID do provider | Provider (some do catálogo, mesmo com credencial) |
tool.use |
<action>:<valor> |
Uma checagem de permissão específica |
integration.use |
mcp:<nome>, skill:<id>, plugin:<pkg> |
Integração |
Precedência (políticas invertem a regra normal)¶
Configuração mais ampla é avaliada por último, vencendo regras específicas:
- Console conectado (maior autoridade)
- macOS managed preferences
- Sistema (
/etc/opencode) - Global (
~/.config/opencode) opencode.jsondireto.opencode/opencode.json(menor)
Ou seja: um repositório não consegue reabilitar um provider que você negou globalmente.
~/.config/opencode/opencode.jsonc
{ "policies": [{ "action": "provider.use", "resource": "openai", "effect": "deny" }] }
❓ Desafio prático¶
- Force
askemgit push *e teste que o push pede aprovação - Negue leitura de
.env*e confirme que o agente não consegue lê-lo - Crie um policy que negue
shell:*para um agente de revisão e permita sóshell:git status * - Negue um provider por policy e veja que ele desaparece de
/models
📚 Fonte oficial¶
Próximo passo: Aula 04 — Ferramentas · Voltar ao módulo