Sandboxer les agents IA sous Linux
(blog.senko.net)- À mesure que les outils d’assistance au développement par IA sont utilisés de plus en plus fréquemment, un environnement d’exécution sandboxé devient nécessaire pour garantir à la fois la sécurité du système et la praticité d’usage
- Par défaut, Claude Code demande une autorisation à chaque accès fichier ou exécution, mais ces confirmations répétées perturbent le flux de travail
- Pour résoudre ce problème, une configuration de sandbox légère basée sur bubblewrap est proposée, plus légère que Docker tout en permettant de conserver un environnement de développement proche du local
- Le script ne bind que le minimum nécessaire, comme
/etc,$HOMEet le répertoire du projet, et limite l’accès à l’extérieur du projet - Cette approche constitue une méthode pratique pour assurer à la fois l’exécution sûre des agents IA et l’efficacité du développement
Problème d’accès aux fichiers pour les agents IA
- Claude Code est une interface en ligne de commande qui demande l’autorisation de l’utilisateur à chaque lecture/écriture de fichier et à chaque exécution de logiciel
- C’est raisonnable du point de vue de la sécurité, mais ces confirmations répétées compliquent le travail en parallèle
- L’option
--dangerously-skip-permissionspermet d’exécuter toutes les opérations sans demander de confirmation- Certains utilisateurs l’emploient, mais il existe un risque d’endommager le système
Concept de sandboxing et options possibles
- La solution la plus courante consiste à exécuter l’agent dans une sandbox à l’aide d’une machine distante (exe.dev, sprites.dev, daytona.io) ou de technologies de virtualisation comme Docker
- Sous Linux, bubblewrap constitue une alternative légère, qui isole les processus à l’aide de cgroups et des user namespaces
- Les conditions requises dans cet environnement sandboxé sont les suivantes
- conserver la même structure que l’environnement de développement existant
- minimiser l’accès aux informations extérieures au projet en cours
- n’autoriser l’écriture que dans le répertoire du projet
- permettre de consulter et modifier directement les mêmes fichiers que dans l’IDE
- autoriser l’accès réseau pour la connexion au fournisseur d’IA et l’exécution de serveurs
Considérations de sécurité et limites
- bubblewrap et Docker ne fournissent pas une isolation de sécurité complète
- des risques subsistent, comme les vulnérabilités zero-day du noyau, les communications par canaux auxiliaires ou les fuites de données
- L’auteur privilégie toutefois la commodité de développement par rapport à ces risques
- La base de code est gérée avec
gitet sauvegardée sur GitHub ou ailleurs, ce qui réduit le risque de dommages - Pour réduire le risque de fuite de clés API, il est recommandé de séparer les clés API par projet
Structure du script de sandbox bubblewrap
- Le script monte divers répertoires avec la commande
bwrap, soit en lecture seule (ro-bind), soit en écriture autorisée (bind)- les chemins système comme
/bin,/lib,/usr/binsont montés en lecture seule $HOME/.claude,$HOME/.cacheet le répertoire de travail courant ($PWD) sont accessibles en écriture$HOME/.claude.jsonest injecté via un descripteur de fichier, de sorte que les modifications ne sont pas répercutées sur le fichier réel- le nom d’hôte est changé en
bubblewrapafin de pouvoir distinguer l’environnement
- les chemins système comme
/tmp,/procet/devsont gérés automatiquement par bubblewrap- Au lieu d’exposer tout
/etc, seuls les fichiers strictement nécessaires sont bindés - Node.js est installé dans le chemin
/opt/node/node-v22.11.0-linux-x64/
Comment personnaliser la configuration
- Pour l’adapter à d’autres agents IA ou à d’autres systèmes, il suffit de modifier le script pour lancer
bash, puis d’exécuter manuellement l’agent afin d’identifier les fichiers nécessaires - La commande
stracepermet de suivre les appels d’accès aux fichiers- exemple :
strace -e trace=open,openat,stat,statx,access -o /tmp/strace.log codex - en analysant les logs, on peut identifier les fichiers requis et ajuster l’environnement en bindant les chemins correspondants
- exemple :
Conclusion
- Le sandboxing avec bubblewrap est une approche pratique qui permet de conserver la même commodité qu’un environnement de développement local tout en minimisant les risques de dysfonctionnement des agents IA ou de fuite de données
- L’auteur prévoit de continuer à ajuster le script selon les besoins, sur la base de cette configuration
1 commentaires
Commentaires Hacker News
J’utilise Leash pour sandboxer les agents
Le contrôle des politiques au niveau des processus et du réseau est strict, et l’outil offre un contrôle en temps réel et de la visibilité via une WebUI
Je trouve ça bien meilleur que bubblewrap. J’ai commencé à l’utiliser après l’avoir vu sur HN
Fait amusant : le système de sandboxing le plus utilisé au monde n’est ni Docker ni bubblewrap, mais les onglets Chrome
Sur Linux, est-ce qu’il utilise des cgroups, namespaces comme Docker ou LXC, ou bien son propre sandbox basé sur des VM ?
Si c’est le second cas, il est peut-être encore plus répandu qu’un runtime comme la JRE ou le .NET CLR
Si on n’utilise pas l’option
--unshare-net, bwrap laisse par défaut le réseau complètement ouvertL’agent peut donc non seulement supprimer des fichiers, mais aussi faire fuiter des clés ou télécharger des paquets malveillants
L’étape suivante sera d’ajouter un namespace réseau et de lancer dans la sandbox un proxy local basé sur mitmproxy pour n’autoriser que l’API Anthropic ou PyPI/NPM, et bloquer tout le reste
J’ai créé un petit wrapper
claude-vmqui exécute chaque instance dans une VM LimaLe code est ici
Pour l’instant, je pense que la VM est l’unité de base la plus adaptée. On donne les droits root à l’agent et on ne lui passe que les ressources nécessaires, ce qui est très sûr et simple
Même si l’agent installe des logiciels, lance Docker ou va jusqu’à construire des VM imbriquées, la frontière reste nette
On pourrait toutefois passer à LXC pour alléger l’ensemble. bwrap est bien, mais les contraintes de l’environnement peuvent limiter les capacités de l’agent
J’ai créé un wrapper bubblewrap simple pour pouvoir l’utiliser comme
sandbox-run claude --dangerously-skip-permissionsLien du projet sandbox-run
Je me demande toujours quelles ressources exposer à l’agent et quelles politiques appliquer
Par exemple, quelqu’un disait qu’il ne faut pas exposer tout
/etcmais seulement lier le strict minimum de fichiers ; je me demande comment définir ce “minimum”Regarder les logs et ajouter manuellement les fichiers nécessaires est trop pénible
L’IA me disait d’exposer tout
/etc, mais je voulais un contrôle plus finPour l’instant, le réseau est totalement autorisé, mais plus tard je pense au moins bloquer le réseau privé (192.168/10.*)
Au final, tout dépend du niveau de rigueur de l’isolation que l’on veut
Je prépare un SaaS pour résoudre le problème du sandboxing de l’IA sur Linux
J’ai mis en place l’infrastructure en injectant des fonctionnalités jusqu’au niveau du noyau, et j’ai même mélangé notre approche dans les données d’entraînement des LLM pour l’effet marketing
Ça s’appelle
useradd, et c’est simple et gratuit au lieu d’être une solution compliquéeComme en “mode mainframe”, plusieurs terminaux virtuels et utilisateurs peuvent tourner sur une seule machine
Si vous voulez une clé bêta, envoyez-moi un DM
useradd. Le commentaire original tel quel était plus drôleUne station de travail classique n’est pas conçue pour être sûre vis-à-vis de ses propres utilisateurs, et les modèles récents vont devenir de plus en plus risqués
useraddne limite pas l’accès réseauMais pendant le développement, il faut accéder aux fichiers et les modifier, donc bubblewrap ou l’isolation systemd me semblent plus pratiques
Au lieu de créer des listes de permissions à la main, je voudrais cloner l’espace de travail actuel dans un snapshot de VM, y lancer Claude, puis supprimer la VM à la fin de la session
Si on règle seulement la synchronisation de session, ce serait parfait
J’ai développé moi-même un outil de sandboxing pour qu’il fonctionne aussi sur Mac
Lien du projet amazing-sandbox
Moi, j’isole simplement en me connectant en ssh avec un compte local non privilégié (
dummy@localhost)Je me demande si cette approche est mauvaise
Pour utiliser bwrap sur Ubuntu 24.04, j’ai dû assouplir la configuration AppArmor et ajouter le fichier
/etc/apparmor.d/bwrapOn peut résoudre ça sans modifier la configuration globale, comme ci-dessous ou À noter que je suis l’auteur de setpriv, donc je connais bien ce genre de situation