- Empêcher les mods des utilisateurs de se charger, avec ou sans vos propres mods : Arrêter le chargement des mods installés par les utilisateurs
- Voir ce que vos utilisateurs obtiennent quand vous ne changez rien : Savoir ce qui se passe par défaut
- Laisser les mods activés avec d’autres limites : Choisir le niveau d’autorisation
Ces cas sont couverts sur d’autres pages :
- Vous n’avez jamais déployé de paramètres gérés auparavant : commencez par Déployer les paramètres gérés
- Vous souhaitez contrôler les plugins que les utilisateurs peuvent installer : voir Gérer les plugins pour votre organisation
Arrêter le chargement des mods installés par les utilisateurs
Pour empêcher chaque mod que vos utilisateurs apportent de se charger, définissez l’optionallowManagedModsOnly sur la garde intégrée, un mod de politique que Claude Code charge avant chaque mod qu’un utilisateur installe. L’option se trouve dans les paramètres gérés sous pluginConfigs, indexée par cc-plugin-sec-default@builtin :
managed-settings.json
- Aucun mod qu’un utilisateur apporte ne se charge : cela couvre un mod dans un plugin que l’utilisateur a installé, un mod chargé avec
--plugin-dir, et un mod que Claude a écrit pendant une session - Les mods de votre organisation se chargent toujours : un mod qui compte comme celui de votre organisation n’est pas vérifié. Tous les autres mods comptent comme ceux d’un utilisateur et ne se chargent pas. Cela inclut un mod dans un plugin que vous activez à partir d’une place de marché GitHub ou autre distante, et un que votre organisation active pour ses membres sur claude.ai. Si aucun ne compte comme le vôtre, aucun mod installé ne se charge.
- Les utilisateurs ne peuvent pas l’annuler : la garde lit l’option uniquement à partir des paramètres gérés, donc la même entrée dans un fichier de paramètres utilisateur, projet ou local, ou dans un fichier passé avec
--settings, ne change rien - Un fichier ou une politique MDM couvre chaque fournisseur : quand vous livrez l’option sous forme de fichier ou via MDM, elle fonctionne de la même manière sur Amazon Bedrock, la plateforme Agent de Google Cloud, et Microsoft Foundry. Pour la livraison depuis la console d’administration claude.ai, voir Disponibilité de la plateforme
- Les autres personnalisations des utilisateurs continuent de fonctionner : leurs hooks dans les fichiers de paramètres, les lignes d’état, et
/goalne sont pas affectés - Les mods intégrés continuent de s’exécuter : les mods intégrés à Claude Code, comme le support
AGENTS.md, ont chacun leur propre commutateur
--plugin-dir et le chemin d’un répertoire qui contient un mod, comme claude --plugin-dir ./first-mod. Les hooks du mod ne s’exécutent pas, et la transcription et le journal de débogage contiennent le message de la garde, qui nomme le mod et allowManagedModsOnly. Si le mod se charge, voir Vérifier qu’une politique est en vigueur et les règles qui décident si une option prend effet.
Si vous avez défini CLAUDE_CODE_ENABLE_FUNCTION_HOOKS à 0 lors de l’accès anticipé, remplacez-le par cette option. Claude Code v2.1.287 et versions ultérieures ignorent la variable à n’importe quelle valeur, donc un 0 là-bas laisse les mods activés.
Savoir ce qui se passe par défaut
Sans vos propres paramètres de mod, voici ce que vos utilisateurs obtiennent :-
Les mods sont activés. Un utilisateur peut installer un plugin qui contient un mod à partir de n’importe quelle place de marché que vos paramètres de plugin autorisent, ou en charger un à partir d’un répertoire avec
--plugin-dir. -
Une garde intégrée s’exécute en premier. Claude Code charge un mod intégré nommé
sec-default@builtinavant chaque mod qu’un utilisateur installe. Les utilisateurs ne peuvent pas l’éteindre./pluginet le journal de débogage le listent commecc-plugin-sec-default. La garde se charge quand l’une de ces conditions est vraie :- La machine a des paramètres gérés
- L’utilisateur est connecté à Claude Code avec un plan Team ou Enterprise
-
La garde protège ce que vous gérez. Le mod d’un utilisateur ne peut pas changer ce que vos hooks gérés reçoivent ou décident, l’invite système, votre
CLAUDE.mdgéré et autres instructions gérées, ce que n’importe quel mod lit comme paramètres, ou les outils et descriptions de vos serveurs MCP gérés. - Tout le reste est autorisé. La garde n’ajoute aucune autre restriction. Le mod d’un utilisateur peut toujours lire et écrire des fichiers, démarrer des processus, faire des demandes réseau, réécrire les appels d’outils et les invites, refuser un appel d’outil, approuver un qui demanderait autrement, et dessiner dans l’interface, tout avec les permissions de cet utilisateur.
-
Les règles de refus et vos hooks gérés ont la priorité. Là où la garde se charge, le mod d’un utilisateur ne peut pas approuver un appel qu’une règle
denyrefuse, quel que soit le fichier de paramètres qui contient la règle. Un bloc d’un hookPreToolUsedans les paramètres gérés est aussi final. Les deux s’appliquent aux appels d’outils de Claude. Aucun ne s’applique aux appels$.fset$.processpropres à un mod : avecRead(.env)refusé, un mod peut toujours lire ce fichier avec$.fs.readou démarrer un programme qui le fait. Pour limiter ces appels, empêchez le mod de se charger ou accrochez l’appel dans un mod de politique. -
Les autres vérifications de permission peuvent être contournées. Le mod d’un utilisateur qui approuve les appels d’outils peut approuver un appel qu’une règle
askdemanderait, ou qu’un hookPreToolUseen dehors des paramètres gérés a bloqué. En mode auto, un appel que le mod approuve s’exécute sans vérification de classificateur.
mods/sec-default du référentiel Claude Code.
Savoir quels contrôles s’appliquent toujours
Les mods ne remplacent pas les contrôles que vous avez déjà :- Les hooks de paramètres continuent de fonctionner. Les hooks de commande, HTTP, d’invite, et d’agent dans les fichiers de paramètres et dans le
hooks/hooks.jsondes plugins s’exécutent comme avant, aux côtés des mods. Rien à leur sujet n’est déprécié. - Les règles de refus ont la priorité là où la garde se charge. Le mod d’un utilisateur ne peut pas approuver un appel qu’une règle
denyrefuse, sauf si vous définissezallowModsToOverrideDenyRules. - Les hooks gérés s’exécutent en premier. Un hook
PreToolUsedans les paramètres gérés s’exécute avant que n’importe quel mod ne voie l’appel d’outil, et son bloc est final. Si un mod réécrit ensuite l’appel, vos hooks gérés s’exécutent à nouveau sur l’appel réécrit, donc un bloc s’applique toujours. Les hooksPreToolUsed’autres fichiers de paramètres et de plugins s’exécutent après le dernier mod, donc un mod qui retourne son propre résultat à la place d’exécuter l’outil les empêche de s’exécuter. Voir L’ordre dans lequel les mods s’exécutent. - La politique réseau couvre
$.http.fetch. Si votre organisation désactive la récupération web, ou si le trafic réseau non essentiel est désactivé pour la session, Claude Code refuse une demande réseau qu’un mod fait avec$.http.fetch. La politique ne couvre pas un programme que le mod démarre avec$.process.run. Ce programme atteint le réseau avec l’accès propre de l’utilisateur. - Les contrôles de plugin couvrent les mods. Un mod est un plugin, donc les paramètres qui limitent ce que les utilisateurs peuvent installer, comme
strictKnownMarketplaces, décident s’il peut être installé du tout. - Les mods ne peuvent pas changer l’invite de permission. Un mod peut redessiner une grande partie de l’interface de Claude Code, mais pas l’invite de permission, donc il ne peut pas changer ce qu’une invite affiche. Un mod peut toujours approuver ou refuser un appel d’outil avant que l’invite n’apparaisse, comme Savoir ce qui se passe par défaut le décrit.
- Les invites de confiance viennent en premier. Dans une session interactive dans un répertoire que l’utilisateur n’a pas encore approuvé, aucun mod ne se charge jusqu’à ce qu’il réponde à l’invite de confiance.
--safe-modedésactive les mods installés, y compris les vôtres. Démarrez une session avecclaude --safe-modepour vérifier si un mod a causé un problème.
Décider de laisser les mods activés
Un mod peut faire plus que les autres parties d’un plugin car il s’exécute à l’intérieur de Claude Code. Il voit chaque invite et appel d’outil, peut les changer, et peut autoriser ou refuser un appel d’outil avant qu’une invite de permission n’apparaisse. Ce qu’un utilisateur peut charger en tant que mod dépend des contrôles de plugin que vous avez déjà :
Gérer les plugins pour votre organisation liste chaque façon dont un plugin se charge et le paramètre qui contrôle chacun.
Pour vérifier les mods dans une place de marché avant que vos utilisateurs les installent, voir Examiner ce qu’un mod peut faire. Pour empêcher les mods des utilisateurs de se charger jusqu’à ce que vous ayez fait cela, voir Arrêter le chargement des mods installés par les utilisateurs.
Examiner ce qu’un mod peut faire
Vous pouvez voir ce qu’un mod est capable de faire sans l’exécuter. Dans votre shell, exécutezclaude plugin validate sur le répertoire du plugin :
hooks: liste les événements que le mod reçoit. La ligne calls: liste les méthodes de l’API des mods que son code appelle. L’API des mods, écrite $ dans le code d’un mod, est comment un mod atteint les fichiers, processus, et réseau. Claude Code refuse de charger un mod qui utilise l’API des mods d’une manière que cette commande ne peut pas lire.
Regardez la ligne calls: pour celles-ci :
Dans la ligne
hooks:, tool.call et prompt.submit signifient que le mod voit chaque appel d’outil et chaque invite, et peut les changer. session.append signifie que le mod peut réécrire chaque ligne de la conversation avant qu’elle ne soit stockée. ui.render{component=AskUserQuestion} signifie que le mod peut redessiner la boîte de dialogue que Claude utilise pour poser une question à l’utilisateur. tool.check signifie que le mod peut approuver ou refuser un appel d’outil avant qu’une invite de permission n’apparaisse. Savoir ce qui se passe par défaut liste lesquels de vos règles et hooks ont la priorité sur sa réponse.
Choisir le niveau d’autorisation
Les politiques de mod vont d’aucun mod installé du tout à n’importe quel mod qu’un utilisateur choisit, avec votre propre mod vérifiant les autres, et chacun est quelques paramètres gérés. Trouvez la politique que vous voulez dans la première colonne et définissez ce que la deuxième colonne nomme. Déployer les paramètres gérés couvre où vivent les paramètres gérés.
Ce que chaque paramètre fait :
allowManagedModsOnly: une option sur la garde intégrée. Les mods des utilisateurs ne se chargent pas, et leurs hooks de paramètres, lignes d’état, et/goalcontinuent de fonctionner. Arrêter le chargement des mods installés par les utilisateurs liste ce qu’il couvre.allowManagedHooksOnly: un paramètre plus large. Seuls les mods de votre organisation et les mods intégrés à Claude Code se chargent. Un mod qu’un utilisateur a installé lui-même ne se charge pas. Le paramètre bloque aussi les hooks dans les fichiers de paramètres propres des utilisateurs. Lisez Ce qui s’exécute sousallowManagedHooksOnlyavant de le définir.disableAllHooks: le paramètre le plus large. Dans les paramètres gérés, il arrête les mods dans chaque plugin installé, y compris les vôtres, et désactive chaque hook dans les fichiers de paramètres, donc un hookPreToolUsedans vos paramètres gérés ne bloque plus rien. Les lignes d’état personnalisées et/goalcessent aussi de fonctionner. LisezdisableAllHooksavant de le définir.disableSideloadFlags: rejette--plugin-diret--plugin-urlau démarrage, donc personne ne charge un mod à partir d’un répertoire, et empêche les mods que Claude écrit pendant une session de se charger. Le paramètre rejette aussi--agentset--mcp-config. LisezdisableSideloadFlagsavant de le définir.
AGENTS.md, ne sont pas affectés par ces paramètres. Chacun a son propre commutateur.
Un utilisateur dont le mod ne s’est pas chargé trouve la raison dans son journal de débogage. Messages de refus liste les lignes pour allowManagedHooksOnly et disableAllHooks, et Messages de la garde intégrée a la ligne pour allowManagedModsOnly.
Définir les options sur la garde intégrée
La garde intégrée prend deux options. Définissez-les dans les paramètres gérés souspluginConfigs, indexées par cc-plugin-sec-default@builtin, comme l’exemple dans Arrêter le chargement des mods installés par les utilisateurs le fait.
Le tableau donne ce que vos utilisateurs obtiennent avec chaque option non définie et avec elle définie à true :
Ces règles décident si une option prend effet :
- L’id a une seule orthographe ici : Claude Code lit les options uniquement sous
cc-plugin-sec-default@builtin.prependPluginsaccepte aussisec-default@builtin, etpluginConfigsne le fait pas. - Seuls les paramètres gérés comptent : la même entrée dans un fichier de paramètres utilisateur, projet ou local, ou dans un fichier passé avec
--settings, ne définit ni ne desserre une option - La garde doit se charger : si vous définissez
prependPlugins, nommez la garde dans la liste. Là où la garde ne se charge pas, aucune option ne s’applique. - La garde échoue fermée : si la garde ne peut pas lire les paramètres gérés, elle refuse tous les mods des utilisateurs au chargement. Si elle ne peut pas vérifier les règles de refus pour un appel qu’un mod d’utilisateur a approuvé, elle refuse l’appel.
Exécuter les mods de votre organisation
Vous pouvez déployer des mods de votre côté à chaque utilisateur, choisir où ils s’exécutent par rapport aux mods des utilisateurs, et en utiliser un pour appliquer une politique.Installer les mods de votre organisation et définir l’ordre
Les mods de votre organisation se chargent là où les mods des utilisateurs ne le font pas et peuvent s’exécuter avant eux, donc Claude Code doit pouvoir dire qu’un mod vient de vous. Il traite un mod comme celui de votre organisation uniquement quand tous ceux-ci sont vrais :- Les
enabledPluginsgérés définissent le plugin du mod àtrue - Les paramètres gérés nomment la place de marché du plugin comme un répertoire sur la machine de l’utilisateur, par chemin absolu. Une entrée
extraKnownMarketplacesle fait et enregistre aussi la place de marché pour l’utilisateur. - La place de marché liste le plugin par un chemin relatif, donc Claude Code le charge sur place à partir de ce répertoire
/opt/acme/claude-plugins/.claude-plugin/marketplace.json
enabledPlugins gérés l’activent. Cela couvre chaque plugin à partir d’une source GitHub, git, URL, ou npm. Son mod s’exécute parmi les mods des utilisateurs, prependPlugins et appendPlugins le sautent, et il ne se charge pas sous allowManagedModsOnly ou allowManagedHooksOnly. Le journal de débogage de l’utilisateur a une ligne qui commence par l’id du plugin et is enabled by managed settings, but.
Claude Code lève un événement chaque fois qu’il est sur le point d’agir, comme exécuter un outil, et le passe à chaque mod à tour de rôle. Un mod qui compte comme le vôtre s’exécute avant les mods des utilisateurs même quand vous ne le listez nulle part. Pour définir sa place, listez son id dans l’un de deux paramètres. L’id est le nom du plugin, @, et le nom de la place de marché, comme acme-guard@acme-tools.
prependPlugins: votre mod voit chaque événement avant n’importe quel mod d’utilisateur et chaque résultat après. Il peut changer l’événement, le refuser, ou sauter les mods des utilisateurs.appendPlugins: votre mod s’exécute après chaque mod d’utilisateur, donc il voit uniquement les événements que ces mods transmettent, sous la forme qu’ils les transmettent
acme-tools à /opt/acme/claude-plugins, active acme-guard à partir de celle-ci, et exécute ce mod en premier, avec la garde intégrée après :
managed-settings.json
extraKnownMarketplaces: nomme le répertoire qui contient la place de marchéacme-tools.pathest le chemin absolu du répertoire qui contient.claude-plugin/marketplace.json.enabledPlugins: activeacme-guardpour chaque utilisateur qui reçoit ces paramètres gérésprependPlugins: metacme-guarden premier et la garde intégrée en deuxième, tous deux avant n’importe quel mod qu’un utilisateur installe. Claude Code suit l’ordre que vous listez.
claude --debug et recherchez dans le journal de débogage l’id du mod :
hooks module acme-guard@acme-tools loaded, avectier prepend: le mod compte comme celui de votre organisation et s’exécute en premier- La même ligne avec
tier user: Claude Code le traite comme un mod d’utilisateur. Une deuxième ligne,prependPlugins names acme-guard@acme-tools, which is not an enabled managed plugin with a hooks module; skipped, dit que la liste l’a sauté.
- La liste remplace la valeur par défaut : quand vous définissez
prependPluginsdans les paramètres gérés, nommezsec-default@builtindans celle-ci pour garder la garde intégrée. La garde est intégrée et n’a besoin d’aucune entréeenabledPlugins. - Vos propres ids doivent compter comme les vôtres : dans les paramètres gérés, Claude Code saute un id dont le plugin ne respecte pas les trois conditions pour un mod d’organisation
- Les référentiels ne peuvent pas les définir : Claude Code lit les deux paramètres uniquement à partir des paramètres gérés et jamais à partir du fichier de paramètres d’un référentiel. Un utilisateur peut les définir dans
~/.claude/settings.jsonpour ordonner uniquement ses propres mods sur une machine sans paramètres gérés, et uniquement quand il n’est pas connecté avec un plan Team ou Enterprise. N’importe où ailleurs, Claude Code ignore les deux clés dans les paramètres utilisateur. Une liste là-bas n’ajoute ni ne supprime la garde intégrée.
Appliquer une politique avec un mod de votre côté
Pour empêcher tous les mods d’un utilisateur de se charger, vous n’avez pas besoin d’un mod de votre côté. DéfinissezallowManagedModsOnly. Écrivez un mod de politique quand vous voulez admettre certains mods d’utilisateurs et en refuser d’autres, ou pour enregistrer ce que les mods font.
Chaque fois qu’un autre mod est sur le point de se charger, votre mod reçoit la liste que claude plugin validate imprime, dans un événement nommé plugin.register. Un mod dans prependPlugins peut lire cette liste et refuser le mod. Il peut aussi accrocher n’importe quel appel de l’API des mods par nom pour enregistrer ou refuser cet appel pour tous les autres mods. Le nom est la méthode sans le $., donc un crochet sur fs.write voit chaque appel $.fs.write.
Ce mod de politique refuse n’importe quel mod d’utilisateur dont le propre code appelle $.process.run ou $.process.spawn. Il garde aussi un journal d’audit, écrivant chaque appel d’outil et chaque fichier qu’un mod écrit dans le journal de débogage. Parce qu’il s’exécute en premier, le journal enregistre ce qui a été demandé, avant que n’importe quel mod d’utilisateur ne le change. Enregistrez-le comme acme-guard/hooks/register.js :
acme-guard/hooks/register.js
plugin.register: décide si un autre mod se charge. Il refuse un mod d’utilisateur qui appelle une méthode bloquée et transmet tous les autres mods.tool.call: écrit une ligne commeaudit tool.call Bashdans le journal de débogage pour chaque appel d’outil, et ne change rienfs.write: écrit une ligne commeaudit fs.write by reader "/tmp/notes.md"pour chaque appel$.fs.writequ’un autre mod fait, et ne change rien. Le nom du mod vient en premier et le chemin est entre guillemets, donc un chemin qu’un mod choisit ne peut pas passer pour un autre champ de la ligne.
plugin.register lit deux champs de l’événement :
e.tier: où le mod s’exécuterait, l’un deprepend,user,append, oubuiltin. Chaque mod qu’une personne installe estuser.e.uses.calls: les méthodes de l’API des mods que le mod appelle, chacune orthographiéenamespace.methodcommeprocess.run, sans le$.queclaude plugin validateimprime
$.process.run, le mod ne se charge pas, et son journal de débogage a une ligne qui se termine par refused by acme-guard: et votre raison. Le refus atteint aussi la transcription dans une session qui recharge à chaud un répertoire de plugin. Pour bloquer un appel sans refuser le mod entier, retournez { deny: 'your reason' } d’un crochet sur le nom de cet appel.
Pour envoyer les lignes d’audit quelque part d’autre que le journal de débogage, appelez $.http.fetch à partir des mêmes crochets.
Une session peut s’exécuter sans votre mod. Si le thread de travail qui exécute les mods installés plante trois fois, Claude Code décharge tous les mods qui ne sont pas intégrés, y compris le vôtre, jusqu’à ce que l’utilisateur exécute /reload-plugins ou démarre une nouvelle session. Et un utilisateur qui démarre Claude Code avec --safe-mode s’exécute sans mods installés, y compris les vôtres.
Créer un mod couvre les fichiers qu’un mod a besoin. Tester un mod qui juge d’autres mods a un fichier de test pour ce mod de politique.
Refuser les mods quand votre vérification échoue
Si votre crochetplugin.register lève une exception ou dépasse sa limite de temps, Claude Code saute le crochet, donc la vérification échoue ouvertement et le mod qu’il vérifiait se charge. Pour échouer fermé et refuser les mods des utilisateurs, déplacez la vérification dans une fonction nommée et ajoutez un gestionnaire .catch qui retourne le refus. Cette version du fichier montre uniquement le crochet plugin.register, donc gardez les deux crochets d’audit de la première version dans register :
acme-guard/hooks/register.js
refused by acme-guard: Acme policy check failed, so this mod was not loaded. Le gestionnaire transmet chaque mod en dehors du tier user à next(e), donc une vérification échouée n’arrête pas les mods que votre organisation liste. Gérer un crochet qui échoue couvre .catch pour d’autres événements.
Étapes suivantes
- Sécurité des plugins : ce que n’importe quel plugin peut faire sur la machine d’un utilisateur, et comment en examiner un avant qu’il ne soit installé
- Aperçu des mods : ce qu’est un mod et comment il se compare aux crochets, compétences, et serveurs MCP
- L’ordre dans lequel les mods s’exécutent : comment
prependPluginsetappendPluginss’adaptent aux mods des utilisateurs - Paramètres et variables d’environnement : chaque paramètre nommé sur cette page dans un tableau