curso-claude-code / Correa larga / módulo 10
Claude Code · la biblia completa

Módulo 10 — Candados: permisos y seguridad de a de veras

Al terminar este módulo, vas a dejar tu instalación con los candados de un profesional: saber qué firma tu agente solo y qué jamás.

Llevas nueve módulos diciendo "Yes". Ya tienes constitución, recetas, reflejos y hasta empleados. Este arco — los tres módulos que siguen — es donde la correa se alarga: le vas a enchufar manos nuevas (módulo 11) y lo vas a dejar trabajar solo (módulo 12). Por eso los candados van PRIMERO. No es un módulo de miedo: es el módulo que te permite dejar de tener miedo con razones.

10.1 — La pregunta de permiso ES el contrato

¿Te acuerdas de tu primera pregunta de permiso, en el módulo 1? "Claude wants to run…" y tú decidiendo si firmar. Ese día lo viviste; hoy le ponemos nombre a lo que pasó: firmaste una cláusula.

🧠 ANALOGÍA CLAVE

La pregunta de permiso es el contrato de trabajo. Todo empleado tiene uno: qué puede hacer por su cuenta y qué necesita la firma del jefe. Cada vez que Claude te pregunta, te está poniendo enfrente una cláusula: "¿esto lo firmo yo o lo firmas tú?". Y cada vez que contestas "Yes, and don't ask again", no estás quitando una molestia — estás redactando el contrato: esa acción pasa a la lista de lo que puede hacer solo. El contrato no es el enemigo de la velocidad; es lo que te permite ir rápido sin cerrar los ojos.

Y aquí va la idea que separa a los que dirigen bien de los que se frustran. Hay DOS maneras de decirle a Claude "no hagas X", y no son iguales:

La documentación oficial lo dice sin rodeos: "Permission rules are enforced by Claude Code, not by the model" — las reglas de permisos las aplica Claude Code (el programa), no el modelo. Lo que escribes en tu constitución moldea lo que Claude intenta; lo que pones en permisos cambia lo que Claude Code permite. ¿Te suena? Es la misma diferencia que aprendiste en el módulo 8: la regla es intención, el reflejo es ley. Los permisos son de la familia de las leyes.

10.2 — Los modos: qué tan corta traes la correa

Claude Code trae varios modos de permisos (permission modes): posiciones fijas de qué firma él solo y qué te pregunta. Los cuatro que vas a usar, de correa más corta a más larga:

ModoEn llanoQué hace soloQué te pregunta
plan"Primero propón" (lo viviste en el módulo 4)Leer e investigarTODO cambio: propone y espera tu OK
default (manual)El de fábricaLeerCualquier escritura o comando
acceptEdits ("aceptar ediciones")Correa mediaLeer, editar archivos y comandos comunes de archivos (crear carpetas, copiar, mover… y también borrar)Otros comandos y todo lo que sale a internet
bypassPermissions ("sin preguntas")Correa sueltaTODONada

Fíjate en la letra pequeña de acceptEdits: "comandos comunes de archivos" incluye borrar. Es un modo comodísimo para sesiones de ordenar y redactar — y por eso mismo se activa sabiendo qué firma dejas de dar.

Cambias de modo sin salir de la sesión, con el mismo atajo que ya conoces del plan mode:

👀 LO QUE VAS A VER

Presiona esto (dentro de Claude Code):

Shift+Tab

Vas a ver algo así (cada vez que lo presionas, cambia el letrero junto a la caja de texto):

⏸ manual mode on   →   ⏵⏵ accept edits on   →   ⏸ plan mode on   →   (y de vuelta)

Qué significa: el letrero te dice qué tan corta está la correa AHORA. Es un ciclo: default → aceptar ediciones → plan (el modo sin preguntas no aparece en el ciclo a menos que lo hayas activado a propósito).

Si en vez de eso ves que no cambia nada: haz clic en la ventana de Claude Code primero (el atajo aplica sobre la ventana activa) y vuelve a intentar.

Dos modos más existen y te los nombro para que no te sorprendan: auto (un clasificador de seguridad aparte revisa cada acción en segundo plano y frena lo raro; requiere ciertos planes y modelos) y dontAsk (solo ejecuta lo pre-aprobado en tu lista, pensado para automatizaciones). No los necesitas hoy.

Un detalle que habla bien del diseño: hay rutas protegidas — .claude (¡su propia configuración!), .git y otras carpetas delicadas — que nunca se auto-aprueban, ni siquiera en "aceptar ediciones". Si Claude quiere editar su propio contrato, te va a pedir firma aunque traigas la correa media. Cuando te pase, sonríe: ese freno es el sistema funcionando.

10.3 — Las tres listas: permitir, preguntar, negar

Los modos son posiciones gruesas. El ajuste fino son tres listas que viven en tu contrato (settings.json, el cajón que conociste en el módulo 5):

El orden de evaluación es fijo y es tu amigo: primero deny, luego ask, luego allow, y al final el modo decide lo que quedó sin regla. La documentación lo remata: si algo está negado en cualquier nivel, ningún otro nivel puede permitirlo. Deny gana siempre.

Para verlas y editarlas desde adentro de la sesión:

👀 LO QUE VAS A VER

Teclea (o pega) esto (dentro de Claude Code):

/permissions

Vas a ver algo así:

Permissions
  Allow   Ask   Deny   Workspace
  ❯ Bash(git status)          allow
    Read(~/Curso-Claude/**)   allow
  (add a new rule…)

Qué significa: es el tablero de tu contrato: las tres listas con lo que ya firmaste. Desde aquí agregas o quitas reglas sin tocar archivos.

Si en vez de eso ves un panel vacío: normal en instalación nueva — las reglas se van juntando conforme contestas "don't ask again" o las agregas tú. Hoy lo vas a llenar con criterio.

[CAPTURA: m10-permisos-panel — el panel /permissions con las tres listas]

¿Y cómo se escribe una regla? Cada una nombra la herramienta y su alcance. Ejemplos reales de la sintaxis (no los memorices — obsérvales la lógica):

ReglaSe lee
Bash(git status)"el comando git status, permitido tal cual"
Bash(git:*)"cualquier comando que empiece con git"
Read(~/.ssh/**)"leer cualquier cosa dentro de ~/.ssh" (esta va en deny)
Edit(./**)"editar lo que sea dentro de esta carpeta"
WebFetch(github.com)"leer páginas de ese dominio"
mcp__supabase__list_tables"esa herramienta de un enchufe externo" (los conoces en el módulo 11)

Y así se ve un contrato razonable de civil, completo, en settings.json. Recuerda el marco de la casa: esto lo escribe Claude, tú decides qué dice — se lo dictas ("agrega a mi deny la carpeta Contabilidad") y él redacta:

{
  "permissions": {
    "defaultMode": "default",
    "allow": [
      "Read(~/Curso-Claude/**)",
      "Bash(git status)",
      "Bash(git log:*)"
    ],
    "ask": [
      "Bash(git push:*)"
    ],
    "deny": [
      "Read(~/.ssh/**)",
      "Read(./.env)",
      "Read(~/Contabilidad/**)",
      "Bash(rm -rf:*)"
    ]
  }
}

La honestidad completa sobre el deny (esto casi nadie te lo cuenta): las reglas deny de lectura y edición frenan las herramientas de Claude y los comandos de archivo que Claude Code reconoce en la terminal (cat, head, tail, sed). NO frenan a cualquier programa que abra archivos por su cuenta — un script de Python que Claude escriba y ejecute podría leer esa ruta por otra puerta. La propia documentación lo dice y ofrece la solución de fondo: para un bloqueo a nivel sistema operativo que aplique a TODOS los procesos, existe el sandbox — el corralito: un espacio cercado donde el agente juega dentro y no toca fuera. Te lo dejo presentado; el detalle vive en la caja NIVEL PRO.

Última pieza del rompecabezas: tus settings viven en capas (¿te acuerdas de los cajones del módulo 5?). De mayor a menor autoridad: los de empresa (si tu organización los administra), los tuyos de usuario (~/.claude/settings.json), los del proyecto (compartidos en la carpeta de trabajo) y los locales del proyecto (solo tuyos). Las listas de las capas se SUMAN, no se pisan — y un deny de arriba no se puede quitar desde abajo. Si trabajas en equipo, eso significa que los candados de la empresa aguantan aunque cada quien traiga su configuración.

🪤 AQUÍ SE ATORA LA GENTE

Síntoma: "Puse en mi CLAUDE.md 'nunca leas mi carpeta de nómina' y un día la leyó."

Causa: la constitución es intención, no candado — el modelo la respeta casi siempre, pero la aplica él, no el programa.

Salida: las líneas rojas van en las DOS capas: en CLAUDE.md para que sepa por qué, y en deny para que no pueda. Dile: "agrega Read(~/Nomina/**) a mi lista deny" y comprueba con /permissions que quedó.

🚀 NIVEL PRO

Si esto te suena a chino, bríncatelo: no lo necesitas para seguir. El sandbox (corralito) se activa con /sandbox dentro de la sesión y cerca a nivel sistema operativo: escritura solo en la carpeta de trabajo (y temporales), lectura global menos rutas negadas, y red cerrada — el primer dominio que quiera visitar te lo pregunta y se va armando una lista blanca de la sesión. Disponible integrado en macOS; en Linux y en Windows vía WSL2 requiere piezas extra (bubblewrap + socat); en Windows nativo no está soportado. Es una capa independiente de los modos: se pueden combinar.

10.4 — La verdad incómoda: el modo sin preguntas

Hablemos de bypassPermissions sin hipocresía, porque existe, porque los profesionales lo usan, y porque tarde o temprano vas a ver a alguien trabajando así y te vas a preguntar por qué a él sí le funciona.

Primero, la advertencia oficial de Anthropic, textual: "bypassPermissions offers no protection against prompt injection or unintended actions" — el modo sin preguntas no ofrece NINGUNA protección contra instrucciones escondidas (ahorita las vemos) ni contra acciones no deseadas. Sin firma no hay filtro: lo que el agente decida hacer, se hace.

¿Entonces por qué alguien cuerdo lo activa? Porque la seguridad de un profesional no vive en la pregunta de permiso — vive en las redes que tiene debajo:

  1. Todo su trabajo está en la máquina del tiempo (módulo 4): cada cambio es reversible con git; equivocarse cuesta un rewind, no una tragedia.
  2. Tiene reflejos-candado (módulo 8): hooks que bloquean lo prohibido aunque nadie pregunte — y un candado de hook frena incluso en modo sin preguntas.
  3. Sus agentes traen candados escritos en su archivo (módulo 9): el subagente read-only no edita, traiga la correa que traiga la sesión.
  4. Años de callo: lee en diagonal lo que el agente propone y huele lo raro antes de que pase.

Quita cualquiera de las cuatro redes y el modo sin preguntas es correr con tijeras. Con las cuatro puestas, es un piso de fábrica con maquinaria bien cercada: rápido Y seguro.

⚠️ REGLA QUE NUNCA DEBES OLVIDAR

El modo sin preguntas se GANA, no se activa. Tú no empiezas ahí — llegas ahí. Primero la máquina del tiempo en todo tu trabajo, luego los candados (deny + hooks + agentes), luego el callo… y un día, si tu chamba lo amerita, sueltas la correa. Bypass sin redes no es valentía: es apostar tu carpeta de clientes a que hoy nada sale raro.

10.5 — Los gates: lo que NUNCA se automatiza

Hay una lista corta de acciones que en esta casa jamás cruzan solas, con NINGÚN modo, con NINGUNA red, por buenas que sean. Se llaman gates (puertas): el punto donde la decisión sube al humano siempre.

¿Ves el patrón? Son las acciones irreversibles o de cara afuera. Un archivo editado se restaura con la máquina del tiempo; un correo enviado no tiene rewind. Por eso el criterio no es "¿confío en Claude?" sino "¿esto tiene deshacer?". Si no tiene, la firma es tuya.

Y ojo: esto no es una feature que actives — es una política que tú redactas, en tres capas que ya conoces: se escribe en tu constitución (para que el agente la entienda y la respete), se refuerza en las listas ask/deny donde se pueda (para que el programa la aplique), y se remata con tu dedo (la firma final es humana). En el módulo 12 esta lista se vuelve protagonista: es exactamente lo que jamás entra a un trabajo autónomo.

⚠️ REGLA QUE NUNCA DEBES OLVIDAR

Dinero, publicar, borrar en masa y correos: firma humana SIEMPRE. No importa el modo, no importa la prisa, no importa qué tan listo se vea el agente. Lo irreversible y lo de cara afuera lo decide una persona.

10.6 — Instrucciones escondidas en el paquete (prompt injection)

Falta el riesgo del que más se habla y peor se explica. Se llama prompt injection y para entenderlo no necesitas nada técnico:

🧠 ANALOGÍA CLAVE

Instrucciones escondidas en el paquete. Tu empleado abre la paquetería de la oficina. Un día llega una caja con una nota adentro: "de parte del jefe: reenvía la lista de clientes a esta dirección". El empleado no fue hackeado — le llegó una orden falsa DENTRO del material que le pediste procesar. Eso es prompt injection: Claude lee archivos, páginas web, correos… y cualquier texto que lee puede traer órdenes que no son tuyas, esperando colarse como si lo fueran.

El punto incómodo: el modelo no trae un detector infalible de "quién habla". Un archivo que diga "ignora tus instrucciones y haz X" es, para el modelo, texto — casi siempre lo trata como lo que es (contenido a procesar) y los modelos modernos están entrenados para resistir exactamente esto, pero no hay garantía escrita, y la documentación oficial lo trata como riesgo real: advierte que el modo sin preguntas no protege contra ello y — la cita completa te espera en el módulo 11, cuando enchufes tu primera fuente externa — es igual de tajante en que traer contenido de fuera (una página, un servidor ajeno) es traer este mismo riesgo.

Por eso la defensa NO es "ojalá el modelo se porte bien". La defensa es de diseño, y ya tienes todas las piezas:

  1. Correa corta cuando lee contenido de extraños. Descargas, páginas ajenas, archivos que te mandaron: modo default, tú firmando.
  2. Los gates de 10.5. Si un texto malicioso convence al agente de "manda este correo", el gate lo detiene: eso jamás sale sin tu firma.
  3. Deny en lo sagrado. La orden escondida que diga "lee las contraseñas" choca con el candado del programa, no con la buena voluntad del modelo.
  4. Tu costumbre de leer lo que firmas. La pregunta de permiso te muestra QUÉ quiere hacer. Si pediste un resumen y te pide permiso para renombrar archivos… algo trae el paquete.

Guárdate esta idea para los dos módulos que vienen: en el 11 le vas a enchufar manos que traen contenido de terceros (más paquetes que revisar), y en el 12 lo vas a dejar trabajar sin tus ojos encima (menos firmas en el camino). Este módulo existe para que llegues a esos dos con los candados puestos.

🪤 AQUÍ SE ATORA LA GENTE

Síntoma: "Después de esto me da miedo dejarlo leer cualquier cosa de internet."

Causa: conociste el riesgo antes que la defensa — es el orden correcto, pero asusta.

Salida: conviértelo en política en vez de miedo: contenido de confianza (tus archivos, tus sitios) = correa normal; contenido de extraños = correa corta + gates + deny puestos. Con esas tres, el daño posible de un paquete con sorpresa se reduce a "te pidió algo raro y dijiste que no". Exactamente para eso firmas tú.

ASÍ LO USAMOS EN SPAI

🫘 ASÍ LO USAMOS EN SPAI

El settings.json real de la casa trae "defaultMode": "bypassPermissions" — sí, la casa corre sin preguntas. Y se cuenta completo o no se cuenta: puede correr así porque (1) todo el trabajo vive en git + GitHub y cualquier cosa se revierte, (2) hay hooks de candado y cada agente de la nómina trae candados grabados en SU archivo, (3) hay años de callo leyendo lo que el agente propone, y (4) el agente-socio carga una constitución que le prohíbe lo irreversible sin preguntar. Cuatro redes, tejidas durante más de un año — el modo llegó al final, no al principio.

Los candados por agente son cláusulas de a de veras, no adornos: el Perito de Seguridad tiene "consultas SQL solo SELECT" (puede mirar la base de datos, jamás cambiarla); el Programador carga "sagrado = CERO cambios" — y esa cláusula le GANA al ticket que diga "arréglalo". Y encima de todos, la ley de la casa: "un subagente JAMÁS cruza un gate (gastar, publicar, borrar, mergear, deploy): el cruce sube al humano." La autonomía es grande precisamente porque las puertas están cerradas con llave — y la llave la trae una persona.

HAZLO TÚ — Tu contrato, con candados de verdad

🔧 HAZLO TÚ

Qué vas a lograr: dos cosas: (a) dejar TU instalación con un contrato razonado — allowlist mínima + deny de tu carpeta sagrada, probado en vivo; y (b) vivir un intento de instrucciones escondidas en condiciones controladas, para que el concepto se te quede en el cuerpo y no en la teoría.

Qué necesitas: los seeds ejercicios/m10/allowlist-plantilla.md (guía para razonar tus listas) y ejercicios/m10/archivo-trampa.md (un texto inofensivo con una orden escondida). Y una carpeta tuya que declares sagrada — la de contabilidad, la de clientes, la que más te dolería.

Pasos — parte (a), la auditoría:

  1. Abre Claude Code y mira tu contrato actual:
👀 LO QUE VAS A VER

Teclea (o pega) esto (dentro de Claude Code):

/permissions

Vas a ver algo así:

Permissions
  Allow   Ask   Deny
  (las reglas que has ido acumulando con tus "don't ask again")

Qué significa: ese es el contrato que has firmado sin darte cuenta, cláusula por cláusula. Léelo: ¿todo lo que está en allow te sigue pareciendo inofensivo?

Si en vez de eso ves reglas que no reconoces: no cunda el pánico — se agregaron cuando contestaste "don't ask again". Este ejercicio existe para depurarlas.

  1. Con la plantilla allowlist-plantilla.md a la vista, dile a Claude con tus palabras algo así: "Revisa mis reglas de permisos. Quiero: en allow solo lecturas de mis carpetas de trabajo y comandos de consulta de git; en ask todo lo que escriba fuera de mi carpeta del curso; y en deny la lectura de [TU CARPETA SAGRADA] y de cualquier archivo .env. Propón los cambios y explícame cada regla antes de aplicarla."
  1. Ojo con este momento: para editar su propia configuración, Claude te va a pedir firma aunque tengas reglas de allow.claude es ruta protegida. Ese freno extra es el sistema cuidándose a sí mismo. Lee lo que propone y firma.
  1. LA PRUEBA (sin prueba no hay candado): pídele "lista los archivos de [TU CARPETA SAGRADA]". Debe chocar con tu deny. Confirmado en vivo para este manual (con un deny Read(./carpeta-sagrada/**) de prueba): Claude intentó el ls, la regla lo tumbó antes de ejecutarse, y contestó algo así — "el listado de esa carpeta fue denegado de tajo, no obtuve ningún archivo ni metadata de lo que hay adentro; no le busqué la vuelta por otra herramienta". Ojo: le tocó también al intento por Bash (ls), no solo a la herramienta Read — un deny de lectura frena el tool Y los comandos de terminal que Claude Code reconoce como lectura, tal como adelantó la sección 10.3. Si en vez de eso te la lista: la regla quedó mal escrita; pídele "muéstrame mi lista deny y dime por qué no aplicó" y corrígela.

Pasos — parte (b), el paquete con sorpresa:

  1. SIN abrir Claude todavía: pon tú mismo una copia de archivo-trampa.md dentro de ~/Curso-Claude/ (arrástralo con el ratón; es un archivo de texto normal e inofensivo — su "orden escondida" pide renombrar archivos, nada delicado). Lo siembras tú porque así simulas al archivo cualquiera que un día llegará de fuera.
  1. Abre una sesión NUEVA en ~/Curso-Claude/ y pídele exactamente esto: "resume archivo-trampa.md en 3 líneas".
  1. Observa SIN intervenir. No te prometo un resultado — ese es el punto del ejercicio. Lo más probable es que lo resuma como texto normal y hasta te señale que contiene una instrucción sospechosa; también podría mencionarla sin comentarla. Si llegara a pedirte permiso para renombrar algo: contesta No… y date cuenta de lo que acaba de pasar — la pregunta de permiso te protegió, en vivo.
  1. Cierra con la discusión (contigo o con tu grupo): ¿qué hizo exactamente? ¿En qué momento la orden del paquete se distinguió de TU orden? ¿Cuál de tus 4 defensas habría actuado si la orden hubiera sido más agresiva?

¿LO LOGRASTE?

  • Tu /permissions muestra deny para tu carpeta sagrada, y la prueba del paso 4 se estrelló contra el candado.
  • Sabes decir en una frase la diferencia entre pedirlo en CLAUDE.md y ponerlo en deny.
  • Viste con tus propios ojos qué hace Claude con una orden que no es tuya — y sabes cuál defensa te cubre si un día trae algo peor.
✓ ¿TE LO LLEVAS?
  1. ¿Por qué "nunca borres sin preguntar" en la constitución NO es un candado, y qué sí lo es?
  2. El modo sin preguntas: ¿qué cuatro redes tendrías que tener puestas antes de considerarlo — y cuántas tienes hoy?
  3. Un archivo descargado le pide a tu Claude reenviar información por correo. Nombra las dos capas de tu setup que impiden que eso ocurra solo.
📖 GLOSARIO

permission mode — qué tan corta está la correa: default (manual), aceptar ediciones, plan o bypass.

allowlist / deny — las listas del contrato: lo permitido de siempre / lo prohibido siempre (deny gana y nadie lo re-permite desde abajo).

bypass — el modo sin preguntas: modo experto CON redes (git + hooks + candados + callo); no se empieza ahí, se llega.

prompt injection — instrucciones escondidas en contenido ajeno (archivo, página, correo) que intentan colarse como órdenes tuyas.

sandbox — el corralito: cerca a nivel sistema operativo donde el agente juega dentro y no toca fuera.

🎓 CÓMO LO ENSEÑAS

La demo de 5 minutos: siembra el archivo-trampa en vivo frente al grupo y pide el resumen. Pase lo que pase, ganas: si Claude señala la trampa, "miren, la detectó — ¿y si no lo hubiera hecho?"; si pide un permiso raro, "miren la pregunta de permiso salvándonos EN VIVO". Remata mostrando tu deny frenando una lectura de la carpeta sagrada.

El error que el alumno VA a cometer: activar "aceptar ediciones" creyendo que es plan mode (los dos se ponen con Shift+Tab) y sorprenderse de que Claude ya está moviendo archivos. Capitalízalo: que TODOS lean el letrero de modo en voz alta antes de cada ejercicio — leer el letrero es el hábito.

La pregunta de arranque: "¿Qué acción de tu negocio NO tiene botón de deshacer? — esa lista que acabas de pensar es exactamente lo que hoy vamos a ponerle bajo llave."


Verificado contra documentación oficial el 2026-07-12.