Saltar al contenido
Menú
¿Lo necesito?Lo que un agente puede alcanzar en tu máquinaCómo funcionaLas capas entre el agente y tu sistemaCompararSandboxes integrados, Docker y VMsConfigurarAbre solo lo que la tarea necesitaSeguridadEl modelo de amenazas y sus límitesInstalar
Configurar

Cerrada por defecto. Los interruptores son tuyos.

Sin opciones, el agente recibe solo tu proyecto, sin red, sin login y sin claves. Abres lo que la tarea necesita, un interruptor a la vez, y también puedes cerrar más la jaula.

Tres lugares de donde puede venir un ajuste

Los ajustes vienen de un archivo dentro del proyecto, de un archivo en tu directorio home y de los flags que escribes. Están ordenados de menor a mayor autoridad.

Tres fuentes alimentan la jaula. El archivo .ai-jail del proyecto solo puede endurecerla. El archivo global ~/.ai-jail es de confianza. Los flags de la línea de comandos mandan sobre ambos. Dentro de la jaula está el agente detrás de una fila de interruptores, la mayoría apagados.
Un repositorio que clonaste no puede abrir su propia jaula.

.ai-jail del proyecto

ai-jail lo trata como no confiable: puede endurecer la jaula y nunca abrirla. ai-jail nunca lo sigue a través de un symlink, y el agente ve un archivo vacío en su lugar.

~/.ai-jail global

Es tuyo, así que ai-jail confía en él. Contiene una tabla base para todas las ejecuciones, más tablas [commands.<name>] que se eligen por la primera palabra del comando.

Flags del comando

Los flags tienen la mayor autoridad. La mayoría de los interruptores vienen en pares, como --network y --no-network, así que un flag también puede cerrar lo que un archivo abrió.

En una tabla de comando, los valores simples reemplazan a los de la base y las listas, como los mapeos y las máscaras, se suman a ella.

~/.ai-jail
# base: se aplica a todos los comandoshide_dotdirs = [".my_secrets"]mask = [".env", ".env.*"] # solo cuando el comando empieza con "claude"[commands.claude]network = trueagent_state = trueenv_pass = ["ANTHROPIC_BASE_URL"]mask = ["*.pem"]

Los interruptores

Cada fila está apagada hasta que lo pidas, y cada flag de capacidad tiene un gemelo --no- que la vuelve a cerrar. Una etiqueta roja marca un interruptor que debilita la jaula. Seguridad tiene la lista completa y los motivos.

Red y servicios

FlagClave de configuraciónQué haceRiesgo
--networknetwork = trueAcceso a la red sin restricciones. Todo lo que el agente puede leer, lo puede enviar fuera.Debilita la jaula
--sshssh = trueTu ~/.ssh, en solo lectura, y el socket de tu agente SSH, para que git push funcione.Abre una cosa
--dockerno_docker = falseEl socket de Docker. En la práctica es root en tu máquina, porque el daemon puede arrancar contenedores que montan el host.Debilita la jaula
--tailscaletailscale = trueEl socket de Tailscale.Abre una cosa
--systemd-usersystemd_user = trueEl bus de usuario de systemd. El agente puede pedirle a tu gestor de usuario que ejecute servicios en el host. Solo Linux.Debilita la jaula

Agente y entorno

FlagClave de configuraciónQué haceRiesgo
--agent-stateagent_state = trueEl login y los ajustes del propio agente, como ~/.claude o ~/.codex. Cualquier cosa dentro de la jaula puede entonces usar esas credenciales.Abre una cosa
--claude-dir <PATH>claude_dir = "..."Usa el directorio indicado como estado de Claude y define CLAUDE_CONFIG_DIR.Abre una cosa
--env <NAME[=VALUE]>ningunaPasa una variable de tu shell, o define una con NAME=VALUE. Se puede repetir y nunca se guarda en disco.Abre una cosa
--inherit-envinherit_env = truePasa todo el entorno de tu shell, con cada secreto que contenga. Evítalo.Debilita la jaula
ningunaenv_pass = ["NAME"]Lo mismo que --env, solo desde el archivo global. Si un archivo de proyecto la define, se ignora.Abre una cosa

Escritorio y hardware

FlagClave de configuraciónQué haceRiesgo
--gpuno_gpu = falseLos dispositivos de GPU y, con ellos, la superficie de ataque del driver. Solo Linux.Abre una cosa
--displayno_display = falseEl socket de Wayland y nada más de tu sesión. Solo Linux.Abre una cosa
--x11x11 = trueEl socket de X11. X11 permite que un programa registre pulsaciones de teclas y tome capturas de pantalla.Debilita la jaula
--audioaudio = trueLos sockets de PipeWire y PulseAudio y /dev/snd. Cualquier cosa dentro de la jaula puede grabar y reproducir audio. Solo Linux.Abre una cosa
--host-shmhost_shm = trueEl /dev/shm del host, que abre memoria compartida con procesos de fuera de la jaula.Abre una cosa
--picturespictures = trueTu ~/Pictures, en solo lectura.Abre una cosa
--browser[=hard|soft]browser_profile = "hard"Un perfil de navegador aparte. hard (el valor por defecto) no conserva nada entre ejecuciones, soft conserva un perfil en ~/.local/share/ai-jail/browsers.Abre una cosa

Archivos

FlagClave de configuraciónQué haceRiesgo
--map <PATH|SOURCE:DEST>ro_maps = [...]Monta una ruta más en solo lectura. Escribe SOURCE:DEST para montarla en otro lugar. Se puede repetir.Abre una cosa
--rw-map <PATH|SOURCE:DEST>rw_maps = [...]Monta una ruta más en lectura y escritura. Se puede repetir.Abre una cosa
--overlay-map <PATH>overlay_maps = [...]Monta una ruta en copy-on-write: las escrituras del agente van a una capa aparte y el original queda intacto. Solo Linux; en macOS pasa a ser un montaje de solo lectura.Abre una cosa
--hide-dotdir <NAME>hide_dotdirs = [...]Nunca monta el directorio oculto indicado, por ejemplo .my_secrets. Se puede repetir.

Capas que puedes apagar, y no deberías

FlagClave de configuraciónQué haceRiesgo
--no-landlockno_landlock = trueApaga Landlock, la copia de las reglas de archivos que tiene el propio kernel. Con --lockdown se rechaza.Debilita la jaula
--no-seccompno_seccomp = trueApaga el filtro que bloquea las llamadas al sistema peligrosas.Debilita la jaula
--no-rlimitsno_rlimits = trueApaga los límites que frenan los procesos desbocados.Debilita la jaula
--no-private-homeprivate_home = falseRenuncia al directorio home nuevo. Es un acceso amplio a tu home real. Mejor usa --map para la única ruta que necesitas.Debilita la jaula

Cómo funciona explica qué hace cada capa.

Utilidades

FlagQué hace
--dry-runImprime el comando de sandbox y no ejecuta nada. Nunca escribe un archivo de configuración.
--initEscribe o actualiza el .ai-jail del proyecto y termina.
--cleanIgnora el .ai-jail del proyecto en esta ejecución.
--bootstrapGenera configuraciones de permisos para las propias herramientas de IA.
statusMuestra la configuración actual de .ai-jail.
-v, --verboseMuestra cada montaje mientras se construye la jaula.

Ejecuta ai-jail --help para ver el resto: la barra de estado, los worktrees, mise y las opciones de terminal.

Oculta los secretos dentro del proyecto

Tu archivo .env vive en el proyecto, y el proyecto se puede leer y escribir. Con la red activada, el agente puede enviar fuera todo lo que pueda leer ahí. Enmascarar le quita esos archivos.

Una carpeta de proyecto. El agente llega a src, package.json y README.md. El archivo .env está enmascarado y la carpeta secrets está denegada: ambos aparecen atenuados y tras barrotes, y ninguna línea del agente llega hasta ellos.
El resto del proyecto queda como estaba.

--mask <PATH|GLOB>

Reemplaza cada coincidencia por un marcador vacío. El agente ve que el archivo existe y no recibe contenido, así que las herramientas que solo comprueban su existencia siguen funcionando.

--deny-path <PATH|GLOB>

Convierte cada coincidencia en un error de permisos.

--mask-except y --deny-path-except

Vuelven a sacar una ruta de una regla. Debilitan la protección, así que un archivo de proyecto no puede definirlos.

Como flags
# pon los globs entre comillas para que ai-jail reciba el patrón y no la expansión de tu shellai-jail --mask .env --mask '.env.*' --mask '*.pem' --deny-path secrets/ claude ai-jail --mask '.env.*' --mask-except .env.example claude
.ai-jail
# un archivo de proyecto puede endurecer, así que esto también funciona en el repositoriomask = [".env", ".env.*", "*.pem"]deny_paths = ["secrets/"]

Lockdown: que un agente lea código que no debe cambiar

--lockdown es para revisiones y auditorías. El agente puede leer el proyecto y responder preguntas sobre él, pero no puede cambiar ni un archivo.

Dos paneles. En modo normal el agente está dentro del muro junto a una carpeta de proyecto que puede leer y escribir, y una carpeta /tmp. En lockdown el muro es más grueso, la carpeta del proyecto es de solo lectura y /tmp es el único lugar escribible.
El agente y el proyecto son los mismos, y solo un directorio temporal es escribible.

Qué cambia

  • El proyecto se monta en solo lectura
  • En Linux solo /tmp es escribible. En macOS, nada
  • Sin directorios ocultos de tu home, sin mapeos extra, sin overlays
  • El entorno se limpia y PATH queda fijado a los directorios del sistema
  • Landlock es obligatorio: si no se puede aplicar, el arranque falla
  • Límites más estrictos de procesos, archivos abiertos y tamaño de archivo
  • Sin pantalla, audio, GPU, Docker, agente SSH ni mise, pases lo que pases
terminal
ai-jail --lockdown claude

Recetas

Copia una. Para ver qué construye, ejecútala primero con --dry-run.

Un agente en la nube, a diario

Un modelo alojado necesita la red para llegar a su API y su propio login para autenticarse. Pon ambos en el archivo global y el comando sigue siendo corto.

~/.ai-jail
# una vez, en ~/.ai-jail[commands.claude]network = trueagent_state = true # después, en cualquier proyectoai-jail claude

Git push por SSH

--ssh monta ~/.ssh en solo lectura y reenvía el socket de tu agente SSH. Para hacer push también hace falta la red.

terminal
ai-jail --network --ssh --agent-state claude

Toolchains de mise

El directorio home nuevo no tiene ninguna instalación de mise, así que ai-jail omite mise. Mapea hacia dentro los dos directorios de mise, en solo lectura.

~/.ai-jail
[commands.claude]ro_maps = ["~/.config/mise", "~/.local/share/mise"]

Un navegador para el agente

--browser por sí solo da un navegador que no puede cargar una página ni abrir una ventana. En Linux también necesita --network y --display, y un navegador X11 necesita --x11 en lugar de --display.

terminal
# Waylandai-jail --browser=soft --network --display chromium# X11ai-jail --browser=soft --network --x11 chromium

Perfiles de Claude separados

Mantén separados el login del trabajo y el personal apuntando cada ejecución a su propio directorio de Claude.

terminal
ai-jail --network --claude-dir ~/.claude-work claude

Un refactor arriesgado sobre una copia

Un overlay guarda las escrituras del agente en una capa aparte, bajo .ai-jail-overlays en el proyecto. Después compárala con el original y quédate con lo que te guste. Solo Linux.

terminal
ai-jail --network --agent-state --overlay-map ~/Projects/my-app/src claude

Tus configs antiguas siguen sirviendo

La compatibilidad hacia atrás es una regla del proyecto: nunca se elimina un flag ni una clave de configuración. Las claves desconocidas se ignoran y las que faltan toman su valor por defecto, así que un archivo escrito para una versión antigua todavía carga.

Los interruptores más antiguos conservan sus nombres invertidos, donde true apaga la cosa: no_gpu, no_docker, no_display, no_mise, no_landlock, no_seccomp, no_rlimits. Por eso --gpu se guarda como no_gpu = false. Los más nuevos usan nombres directos como network = true.

Pon a tu agente tras las rejas

ai-jail es un único binario que no necesita daemon ni root. Añades una palabra delante del comando que ya usas.

terminal
brew tap akitaonrails/tap && brew install ai-jailai-jail claude