EN · Read in English Explorar gratis

Checklist · Intermedio · 15 min

Antes de darle permisos a Claude Code: checklist de seguridad

Diez comprobaciones antes de dar más permisos a Claude Code o abrirlo en un repo ajeno: modos, deny, ask y allow, confianza, sandbox y bypass.

Portada: Antes de darle permisos a Claude Code: checklist de seguridad

Probado con Claude Code 2.1.316 · revisado

Ver los archivos en GitHub Gratis · licencia MIT

Para qué sirve

Una lista de diez comprobaciones para hacer antes de darle más permisos a Claude Code o de abrirlo en un repositorio que no es tuyo. Ordena lo que dice la documentación oficial: dónde vive cada regla y cuál gana (deny → ask → allow, en cualquier ámbito), qué aplica un proyecto antes y después de aceptar la confianza en la carpeta, por qué auto y bypassPermissions no funcionan desde los ajustes del proyecto, por qué bloquear curl no corta la red y cómo cerrarte la puerta del modo bypass. Cada punto trae su porqué y cómo comprobarlo. Para la sintaxis de las reglas, mira la receta de permisos.

La lista

# Prueba real: un repo ajeno ejecuta su hook con claude -p (1-nov-2026, Claude Code 2.1.316)
# Repo de prueba con un hook SessionStart en .claude/settings.json que hace touch de un archivo
$ claude -p "di hola" < /dev/null
Ignoring 2 permissions.allow entries from .claude/settings.json: this workspace has not been trusted. ...
Not logged in · Please run /login
$ ls ../HOOK-EJECUTADO
../HOOK-EJECUTADO          # el hook se ejecutó: sin confianza y sin sesión iniciada

# Las tres formas de evitarlo (el hook NO se ejecutó en ninguna):
$ claude -p "di hola" --setting-sources user
$ claude -p "di hola" --bare
$ claude -p "di hola" --settings '{"disableAllHooks": true}'
{
  "permissions": {
    "disableBypassPermissionsMode": "disable"
  }
}
{
  "sandbox": {
    "enabled": true,
    "failIfUnavailable": true,
    "allowUnsandboxedCommands": false,
    "network": {
      "allowedDomains": ["github.com", "*.github.com", "registry.npmjs.org"]
    },
    "filesystem": {
      "denyRead": ["~/.ssh", "~/.aws"]
    }
  }
}

Tus candados personales, en un solo archivo que vale en todos tus proyectos (~/.claude/settings.json):

{
  "$schema": "https://json.schemastore.org/claude-code-settings.json",
  "permissions": {
    "disableBypassPermissionsMode": "disable",
    "blockWritesOutsideWorkingDirectories": true,
    "deny": [
      "Read(~/.ssh/**)",
      "Read(~/.aws/**)",
      "Read(~/.config/gh/**)"
    ]
  }
}

Y la revisión de un repo ajeno antes de abrir Claude en él:

# ¿Qué configuración de Claude trae?
ls -la .claude/ .mcp.json CLAUDE.md AGENTS.md 2>/dev/null
# Hooks, env y helpers que se ejecutarían
python3 -m json.tool .claude/settings.json 2>/dev/null | grep -nE '"(hooks|env|apiKeyHelper|allow|additionalDirectories|enableAllProjectMcpServers)"'
# Skills con allowed-tools (no dependen de la confianza)
grep -rn 'allowed-tools' .claude/skills 2>/dev/null
# Servidores MCP que pediría conectar
claude mcp list   # los de .mcp.json salen «⏸ Pending approval» hasta que los apruebes

El repositorio trae esta revisión como revisar-repo-ajeno.sh (solo lee archivos: en lugar de claude mcp list muestra el .mcp.json) y los dos JSON de ejemplo. Si empiezas un proyecto desde cero, la plantilla de proyecto ya trae estos permisos puestos.

Errores típicos

Qué probamos y qué falta

En este PC (Linux, Claude Code 2.1.316), con una configuración aislada (CLAUDE_CONFIG_DIR) y sin iniciar sesión: en un repo de prueba con allow en el proyecto, claude -p y claude doctor muestran «Ignoring 2 permissions.allow entries… not been trusted», y el aviso desaparece al marcar hasTrustDialogAccepted; un hook SessionStart del proyecto se ejecutó con claude -p sin confianza y antes de «Not logged in», y con --setting-sources user, --bare y --settings '{"disableAllHooks": true}' no se ejecutó (lo repetimos el 1-nov con el mismo resultado); un .mcp.json autoaprobado por el repo aparece «⏸ Pending approval» en claude mcp list. No pudimos probar: el sandbox de red (este PC tiene bwrap pero no socat), que bypass y auto se ignoren desde el proyecto, ni disableBypassPermissionsMode y blockWritesOutsideWorkingDirectories en una sesión real (sin sesión iniciada la CLI se detiene antes en «Not logged in»). Esos puntos se apoyan en la documentación oficial del 1-nov-2026.

Preguntas frecuentes

¿Por qué Claude Code ignora el deny de mi settings.json?

Casi siempre es una de tres: el JSON no es válido (comentarios o comas al final; claude doctor muestra «Invalid settings»), la ruta no está escrita como crees (en el archivo de usuario, /ruta empieza en ~/.claude/; usa ~/ruta o //ruta/absoluta) o el comando no coincide literalmente (Bash(curl *) no frena /usr/bin/curl). Revisa con /permissions de qué archivo sale cada regla.

¿Un repo puede aprobarse sus propios servidores MCP?

En una sesión interactiva no: enableAllProjectMcpServers o enabledMcpjsonServers en el .claude/settings.json del repo se ignoran en una carpeta sin confianza, y claude mcp list los muestra como «⏸ Pending approval». Lo comprobamos en este PC. Pero con claude -p, en una carpeta nunca confiada, los servidores de .mcp.json se conectan sin preguntar, aprobados o no; usa --setting-sources user o --bare en repos ajenos.

¿El modo auto es seguro para trabajar en mi máquina?

Es mucho más seguro que bypassPermissions, porque un clasificador revisa los comandos y las peticiones de red y tus reglas ask y deny siguen valiendo. Pero decide un modelo, no tú, y la documentación recomienda sumar un sandbox o un contenedor como defensa adicional. Para código o repos que no conoces, empieza en plan o Manual.

¿--dangerously-skip-permissions en un contenedor está bien?

Es el uso para el que existe: la documentación lo indica para contenedores, máquinas virtuales o el sandbox runtime, y en Linux y macOS como usuario no root. Aun así, si el contenedor tiene tus credenciales o acceso a la red, un error o una inyección de instrucciones puede usarlas.

¿Qué diferencia hay entre deny y un hook PreToolUse?

Las dos las aplica Claude Code. El deny es declarativo y compara el patrón de la herramienta; el hook es un programa tuyo que puede mirar cualquier cosa (por ejemplo, la rama en la que estás) y bloquear con exit 2. El hook bloquea aunque haya un allow, y un allow que devuelva el hook no anula un deny ni un ask.

Toda la biblioteca