Permisos y Seguridad Operativa
Los modos de permiso y las reglas deny/ask/allow: qué puede hacer el agente sin preguntar.
La pregunta que define este artículo es simple: ¿cuánto confiás en lo que Claude va a hacer sin preguntar? Claude Code separa esa respuesta en dos capas que conviene entender por separado: los modos (comportamiento por defecto) y las reglas (excepciones puntuales).
Los 6 modos de permiso
| Modo | Qué permite | Cuándo usarlo |
|---|---|---|
| default, mostrado como “Manual” desde v2.1.200 | Solo lectura sin preguntar; cualquier edición o comando pide aprobación | Trabajo sensible, repos desconocidos |
| acceptEdits | Lee y edita archivos sin interrupciones | Estás iterando sobre código que vos mismo revisás activamente después |
| plan | Solo lectura, ni edita ni ejecuta | Explorar un codebase nuevo o planificar un refactor antes de tocar nada |
| auto | Todas las acciones, con un clasificador automático que verifica en segundo plano | Tareas largas donde querés reducir la fatiga de aprobar todo el tiempo |
| dontAsk | Solo ejecuta herramientas pre-aprobadas explícitamente | Pipelines CI/CD y scripts automatizados |
| bypassPermissions | Todo sin verificaciones | Únicamente en contenedores o VMs aisladas — nunca en tu máquina principal |
Cómo se cambia:
# Durante una sesión: Shift+Tab rota entre los modos disponibles.
# bypassPermissions solo entra en el ciclo si arrancaste con
# --dangerously-skip-permissions.
claude --permission-mode plan
claude --permission-mode acceptEdits
claude --permission-mode auto
claude --permission-mode dontAsk # pensado para CI
claude --permission-mode bypassPermissions # solo en entornos aislados
Hay dos valores que no se aceptan desde .claude/settings.json ni settings.local.json: auto se ignora, y bypassPermissions hace que la sesión arranque en Manual. Es deliberado: son decisiones de quien lanza la sesión, no de un archivo commiteado en el repo.
Reglas personalizadas: deny → ask → allow
Además de los modos, hay un sistema de reglas granulares por herramienta. Se evalúan en este orden, y gana la primera regla que coincide:
01. ¿Coincide con una regla deny?
02. ¿Coincide con una regla ask?
03. ¿Coincide con una regla allow?
deny siempre gana: ni bypassPermissions puede anular un deny de configuración administrada, ni acceptEdits puede levantar un Edit(...) denegado.
Sintaxis: Herramienta o Herramienta(especificador).
{
"permissions": {
"allow": [
"Bash(npm test*)", // cualquier comando que empiece con "npm test"
"Bash(docker compose *)",
"Bash(git log*)"
],
"deny": [
"Read(./.env)",
"Read(~/.ssh/*)",
"WebFetch(domain:vault.miempresa.internal)"
]
}
}
Algunos detalles que conviene tener presentes:
- El espacio antes de
*importa:Bash(ls *)exige un espacio o fin de cadena después dels(no coincide conlsof);Bash(ls*)sí coincide con ambos.Bash(ls:*)es la sintaxis moderna equivalente aBash(ls *). - Los operadores de shell se evalúan por separado: una regla
Bash(comando-seguro *)no habilitacomando-seguro && comando-peligroso, porque Claude Code entiende&&,||y;y evalúa cada subcomando. Read/Editusan sintaxis estilo.gitignore://rutaes absoluta desde la raíz del filesystem,~/rutadesde tu home,/rutaes relativa a la raíz del proyecto (ojo, no del filesystem —/Users/alice/filees relativo al proyecto, no una ruta absoluta real) yrutao./rutaes relativa al directorio actual.- Límite importante: las reglas
denydeRead/Editbloquean las herramientas internas de Claude, pero no bloquean lo que hagas víaBash(uncat .enven Bash no lo frena una reglaRead(./.env)). Para bloqueo real a nivel de sistema operativo hace falta un sandbox, que combina las reglasdenycon su propia lista de dominios permitidos para la red.
Qué agrega cada modo por encima de las reglas
Los modos son el interruptor general; las reglas son el filtro fino. Un ejemplo de cómo interactúan:
- En plan, aunque tengas
Edit(/src/**)enallow, el modo no permite editar nada — es más restrictivo que las reglas permisivas. - En auto, al entrar al modo se descartan automáticamente reglas
allowpeligrosas comoBash(*)oAgent(*), porque darían ejecución arbitraria antes de que el clasificador las evaluara. Las reglas específicas (Bash(npm test)) se mantienen. Al salir, se restauran. - En dontAsk, incluso las reglas
askse convierten en denegación — todo lo que no está explícitamente enallowse rechaza. Ideal para CI.
Este es uno de los rincones de Claude Code que más rápido evoluciona. Antes de fijar una política de permisos para todo el equipo, conviene confirmar el comportamiento vigente en la documentación oficial.
Documentación relacionada: sintaxis completa de reglas y referencia de settings.json, donde viven todas estas reglas en disco.
