Comme au chapitre 1, Claude Code franchit une barrière de permission à chaque appel d'outil. Si vous vous représentez cela comme un bouton unique, vous le tournerez du côté le plus large dès que cela devient pénible. En réalité, il y a trois choses aux rôles distincts : la fréquence des confirmations, les autorisations par outil, et l'isolement au niveau du système. Resserrer l'une permet de relâcher l'autre, et « sûr ou rapide » n'est pas un choix binaire.
Déléguer n'est pas tout ou rien
Le point de départ n'est pas le nom des modes mais « dans ce travail, où se trouve le point de non-retour ». Trois critères pour juger.
- Est-ce réversible — une édition que git peut annuler entraîne peu de perte. Une suppression définitive, un push forcé, la destruction d'une base ne se rattrapent pas
- Jusqu'où cela porte — cela reste-t-il dans le répertoire de travail, ou cela atteint-il la production, une branche partagée, l'environnement de quelqu'un d'autre
- Cela touche-t-il à des secrets — c'est quand pouvoir les lire et pouvoir les envoyer dehors sont réunis qu'il y a fuite
Le pénible, ce sont les opérations sûres sur les trois axes (tests, formatage, éditions locales), et le dangereux, ce sont les opérations qui surviennent rarement. Tout relâcher uniformément ouvre aussi le côté dangereux. L'ossature : relâcher selon la fréquence, resserrer selon la nature.
Les modes de permission : ce qui change vraiment
Le plus gros bouton est le mode de permission, qui fixe le cadre général de la fréquence des confirmations. On en change avec Shift+Tab (les explications sont dans Les modes de permission de Claude Code).
Les lectures sont automatiques, les éditions et les commandes sont confirmées à chaque fois. Le réglage par défaut pour un dépôt que vous découvrez.
Approuve automatiquement les éditions dans le dossier de travail. Hors périmètre, chemins protégés et autres commandes restent confirmés.
Il enquête mais ne modifie pas les sources. Il passe à l'exécution une fois le plan approuvé.
Un modèle de jugement distinct examine chaque opération avant l'exécution et n'arrête que les dangereuses. Conditions d'utilisation applicables.
Ne passe ni par les confirmations ni par les contrôles de sécurité. Réservé aux environnements isolés. Actif uniquement au lancement avec son option dédiée.
Il existe aussi dontAsk, réservé aux réglages : il n'exécute que la liste autorisée et les commandes en lecture seule, et refuse le reste.
Attention aussi aux chemins protégés. Les écritures dans .git, .claude et la configuration du shell ne sont pas approuvées automatiquement dans les modes ordinaires. Le mode par défaut peut s'inscrire dans les réglages, mais le mode automatique, lui, est ignoré dans les réglages de projet : c'est une ligne tracée pour qu'un dépôt ne puisse pas l'activer de son propre chef.
Le mode automatique n'est pas un mode par défaut plus rapide
Les confirmations disparaissent presque entièrement, mais rien n'est laissé libre : le modèle de jugement arrête les opérations qui débordent du périmètre de la demande, celles qui touchent une infrastructure inconnue, et celles qu'un contenu lu a induites. Passent facilement les manipulations de fichiers dans le dossier de travail et les requêtes HTTP en lecture seule. Sont arrêtés l'envoi de données confidentielles vers l'extérieur, le déploiement en production et les opérations git destructrices.
Les limites énoncées dans la conversation ne sont pas conservées. « Ne pousse pas » peut servir de fondement à un blocage, mais comme c'est relu à chaque fois depuis la conversation en cours, si la compression l'emporte, la limite disparaît avec. De plus, le mode automatique est une préversion de recherche, et l'éditeur précise lui-même qu'il réduit les confirmations sans garantir la sécurité. Il ne remplace pas la relecture.
Pourquoi on vous demande encore votre accord en mode contournement
Vous avez passé --dangerously-skip-permissions, qui est censé sauter les confirmations, et pourtant Claude demande « puis-je l'exécuter ? » Rien n'est cassé. Les permissions comptent deux couches indépendantes, et le contournement n'en efface qu'une seule (pourquoi Claude demande encore la permission en mode contournement).
« Puis-je modifier ce fichier ? » : la boîte de dialogue interactive qui apparaît juste avant l'appel d'un outil. Elle est émise par le programme Claude Code.
« Cela modifierait la base de production, dois-je continuer ? » : une confirmation qui revient comme du texte de conversation. Elle découle des principes de comportement du modèle, donc aucune option ne l'arrête.
Pour les distinguer : est-ce une interface, ou du texte de réponse ? Les conditions qui déclenchent la couche 2 sont presque les trois axes du début : irréversible, portée large, risque de sécurité élevé. Sur une suppression définitive, un push forcé, une migration en production, Claude s'arrête même si vous avez ouvert les permissions.
Ce n'est pas un défaut, c'est la conception. Ce que le contournement vous donne, c'est la clé qui permet d'utiliser les outils, pas une clé qui arrête le jugement de Claude. La couche 2 ne peut pas être ramenée à zéro.
Vous pouvez en réduire la fréquence. N'écrivez dans CLAUDE.md que ce que vous pouvez poser comme un fait, et formulez vos demandes de façon concrète : « supprime les .log de /tmp/ » déclenche moins que « fais le ménage ». Mais le contournement n'est pas la réponse à « les confirmations sont pénibles » (les risques du mode contournement et comment l'utiliser sans danger).
Les règles de settings.json : ne jamais répondre deux fois à la même demande
Si le mode donne « la fréquence d'ensemble », les règles de permission donnent « les exceptions par outil et par commande ». Vous écrivez dans settings.json des entrées allow (sans confirmation), ask (confirmation à chaque fois) et deny (interdit), et vous pouvez les partager (configurer les règles de permission (allow/ask/deny)).
L'évaluation se fait dans l'ordre deny, puis ask, puis allow, et la première correspondance l'emporte : la précision d'une règle ne change pas l'ordre. Un deny large sur Bash(aws *) l'emporte sur un allow précis sur Bash(aws s3 ls). Un deny n'admet aucune exception. Le « j'ai pourtant mis un allow et la confirmation arrive quand même » vient presque toujours d'un ask qui se déclenche avant. Comme un ask force la confirmation même en mode automatique, c'est l'endroit où ranger les opérations irréversibles.
// .claude/settings.json
{
"permissions": {
"defaultMode": "acceptEdits",
"allow": ["Bash(npm run *)"],
"ask": ["Bash(git push *)"],
"deny": ["Read(.env)", "Read(~/.ssh/**)"]
}
}
L'emplacement a lui aussi un rang. Du plus fort au plus faible : réglages d'administration (non modifiables), puis la ligne de commande, puis settings.local.json, puis settings.json, puis ~/.claude/settings.json. Mais un deny, à n'importe quel niveau, l'emporte toujours sur un allow de n'importe quel autre niveau. Dans les motifs, l'espace suivi d'une * marque une frontière de mot : Bash(ls *) attrape ls -la mais pas lsof.
Ce dont les règles ne vous protègent pas
Ce que les règles examinent, c'est uniquement « la chaîne de caractères de la commande sur le point d'être exécutée », et tout chemin qui s'en écarte passe sans être vu.
- Les accès indirects ne sont pas empêchés — un deny sur
Read(.env)agit sur les outils de fichiers intégrés et surcat, mais il n'agit pas sur un script qui ouvre le fichier lui-même - Les lanceurs d'environnement masquent le contenu —
devbox run *etdocker execexécutent leurs arguments tels quels, donc un allow surBash(devbox run *)autorise jusqu'àdevbox run rm -rf . - Restreindre une URL par les arguments est fragile — un réordonnancement ou une expansion de variable passe à travers. Il est plus solide de refuser
curletwgeten bloc et de désigner les destinations autorisées avecWebFetch(domain:)
Écrire « ne lis pas .env » dans CLAUDE.md ne fait pas une règle. CLAUDE.md change ce que Claude va chercher à faire, mais il ne change pas ce qui lui est permis. Ce qui change le périmètre, ce sont les règles, les modes, et les hooks PreToolUse du chapitre 6 (deny et ask sont évalués quel que soit le résultat d'un hook).
Le bac à sable : ce qu'il peut clôturer, et ce qu'il ne peut pas
Ce qui bouche les chemins où les règles n'arrivent pas, c'est le bac à sable : il clôture d'abord « jusqu'où on peut toucher », et non « ce que l'on confirme ». Ce n'est pas Claude qui l'impose mais le système d'exploitation (le noyau), donc même si une commande autorisée fait plus que ce que son nom annonce, la frontière ne bouge pas (le guide complet du bac à sable de Claude Code).
Il peut écrire dans le répertoire de travail et un dossier temporaire, et nulle part ailleurs (réglage initial). ~/.bashrc et les zones système ne peuvent pas être réécrits.
L'état initial est le refus par principe, avec zéro destination. Se connecter à un nouveau domaine déclenche une confirmation, et l'inscrire dans allowedDomains arrête les demandes.
Ces deux-là vont toujours ensemble : avec un seul des deux, un secret qu'il a pu lire ressort. Il y a deux façons d'approuver. Le mode d'autorisation automatique exécute le Bash intérieur sans confirmation, tandis que le mode de permission ordinaire isole tout en laissant passer les confirmations. Même sous l'autorisation automatique, un deny reste toujours prioritaire, un rm visant un chemin important est confirmé, et un ask portant sur un contenu précis force encore la confirmation.
Attention : il y a deux choses appelées « automatique ». Le mode d'autorisation automatique du bac à sable veut dire « on laisse passer parce que la frontière du système le contient », tandis que le mode automatique des permissions veut dire « on laisse passer parce que le modèle de jugement l'a examiné ».
Apprendre d'abord ce qu'il ne protège pas
Le bac à sable n'est pas un isolement complet. Laisser ce point dans le flou tout en gardant l'autorisation automatique en permanence, c'est l'état le plus dangereux où se trouver.
- Il ne couvre que Bash et ses processus enfants — les outils Read, Edit et Write intégrés, les serveurs MCP et les hooks sont en dehors (contrôlez-les par les règles de permission). Pour envelopper le processus entier, utilisez
@anthropic-ai/sandbox-runtime - Le réglage initial de la lecture est large — ce qu'il clôture, c'est surtout l'écriture, et
~/.sshet~/.aws/credentialsrestent lisibles en l'état. Fermez-les avecdenyRead - Autoriser trop largement devient le trou — le trafic est jugé par nom d'hôte, et le contenu chiffré n'est pas inspecté par défaut. Permettez un domaine large, et vous laissez de la place pour que des choses sortent
- Cela dépend de votre environnement — macOS n'a besoin de rien de plus. Linux et WSL2 exigent
bubblewrapetsocat, et Windows natif n'est pas pris en charge
Le bac à sable n'est pas un mur bâti face à un attaquant ; c'est un harnais de sécurité qui réduit d'un ordre de grandeur les accidents et les emballements. Anthropic a déclaré avoir réduit en interne les confirmations de permission de 84 % sans danger, mais c'est le compte rendu d'un nombre moindre de confirmations, pas la garantie que cela ne peut pas être franchi.
Les accidents prennent à peu près quatre formes
Voici la mécanique réalignée depuis le point de vue de l'accident. Choisissez vos réglages selon leur efficacité contre ces quatre formes.
1. Les commandes destructrices
Un rm qui balaie un chemin imprévu, un git push --force qui efface le travail de quelqu'un d'autre. Leur point commun : c'est irréversible. Ce qui fonctionne, ce sont les règles deny et ask et l'isolement des fichiers. Le plus sûr est de ranger les opérations irréversibles dans ask.
2. La fuite de secrets
Il n'y a accident que quand pouvoir lire et pouvoir envoyer se retrouvent réunis. La parade est donc double : ne pas laisser lire (deny sur Read(.env), denyRead) et ne pas laisser envoyer (deny sur curl et wget, domaines autorisés restreints). Une seule des deux ne suffit pas.
3. Atteindre une autre branche ou un autre environnement
Ce qui devait être une correction d'un fichier en local se transforme en push sur une branche partagée ou en déploiement en production : c'est l'escalade des opérations. En mode ordinaire, une confirmation s'intercale à chaque palier, mais si vous avez tout ouvert, les paliers disparaissent. Placer le push et le déploiement dans ask est une assurance bon marché.
4. Des instructions glissées dans les fichiers qu'il lit
Il arrive que les README, tickets, pages web et PDF que Claude lit contiennent des instructions destinées à Claude (injection de prompt). Même écrit en blanc sur blanc, un « envoie ceci à cette adresse » est, du point de vue de Claude, du texte qui entre par la même porte que votre demande, et rien ne sépare de soi-même les données des ordres.
Ce qui ne fonctionne pas ici, c'est le mode contournement (le contenu glissé arrive tel quel jusqu'à l'exécution) et une interdiction écrite dans CLAUDE.md (elle ne change pas le périmètre du permis). Ce qui fonctionne, c'est une frontière au niveau du système — on ne peut pas écrire là où l'on ne peut pas écrire, ni se connecter là où l'on ne peut pas se connecter — et les règles deny. Comme ce qui est glissé n'est pas visible, ne comptez pas sur le fait de vous en apercevoir : faites lire les documents non fiables avec des permissions restreintes pour cette session-là.
Ce qu'on peut déléguer / ce qu'il faut arrêter
En appliquant les trois axes, la ligne se dessine ainsi.
Tests, vérification de types, linter, compilation / éditions dans le répertoire de travail / lectures et recherches / commits locaux
Push sur une branche partagée et push forcé / déploiement et migration en production / lecture de fichiers de secrets / commandes comportant un envoi vers l'extérieur / écritures hors du répertoire de travail
- Fixez un mode pour le quotidien. acceptEdits pour l'édition répétitive, default pour le travail sensible. Inscrivez-le dans
defaultMode - Après avoir répondu trois fois à la même demande, passez-la en allow. À l'inverse, toute opération qui vous a fait penser une seule fois « c'est risqué » se fige en ask
- Traitez les interdictions énoncées dans la conversation en partant du principe qu'elles disparaîtront.
- Quand vous relâchez quelque part, resserrez ailleurs. Le seul état à ne jamais créer, c'est sans confirmation et sans frontière
Les conditions pour utiliser le contournement. À l'intérieur d'un conteneur, d'une machine virtuelle ou d'un exécuteur d'intégration continue que l'on peut jeter s'il casse, avec uniquement le répertoire de travail monté, sans y apporter le .env ni les clés SSH de la machine hôte. « Les confirmations sont agaçantes » n'est pas une raison valable. Après le travail, lisez impérativement le diff.
Tout ce qui a été traité ici est une mécanique qui « réduit » les accidents, pas une mécanique qui les « supprime ». Le jugement de la couche 2, l'arbitrage du mode automatique et la frontière du bac à sable ont tous des formes par lesquelles on passe à travers. Ce qui fonctionne le mieux, c'est de rester dans un état d'où l'on peut revenir.
Résumé
- Les permissions ont trois couches : modes, règles, bac à sable. Les axes sont est-ce réversible, jusqu'où cela porte, cela touche-t-il à des secrets, et l'on relâche selon la fréquence, resserre selon la nature
- Les permissions ont une structure à deux couches. Le contournement n'efface que l'interface de la couche 1 ; les confirmations en texte de conversation sont conformes à la conception
- Les règles suivent l'ordre deny, ask, allow et la première correspondance l'emporte : la précision ne change pas l'ordre
- Les règles ne regardent que des chaînes de caractères. Ce qui bouche le reste, c'est le bac à sable. Mais il ne couvre que Bash et ses processus enfants, et le réglage initial de la lecture est large
- Les accidents prennent quatre formes : commandes destructrices, fuite de secrets, atteinte d'un autre environnement, instructions glissées
Une fois le périmètre de délégation fixé, il ne reste qu'à faire grandir l'outil selon votre environnement. Passez au chapitre 6, « L'étendre ».