← Tous les articles
Guide

Exécuter Claude Code en sécurité dans un conteneur de dev avec le mode auto et des permissions verrouillées

A secure developer workstation scene: a laptop connected to an isolated container box, outbound network arrows passing t

Anthropic a mis un chiffre brutal sur un problème que tout gros utilisateur de Claude Code connaît déjà : les utilisateurs approuvent environ 93 % des demandes d’autorisation, et l’entreprise explique que l’attention baisse quand les demandes s’empilent (Anthropic). C’est de la fatigue d’approbation, et ça transforme le “humain dans la boucle” en “humain qui appuie sur Entrée.”

La mauvaise réponse, c’est de lancer --dangerously-skip-permissions sur votre laptop et d’espérer que le modèle se tienne bien. La bonne réponse, c’est l’ingénierie sécurité ennuyeuse : mettre Claude Code dans un conteneur de dev, ne lui donner que le repo, limiter le trafic sortant, désactiver le mode bypass par politique, et n’utiliser le mode auto que là où il est réellement pris en charge.

Ce guide montre une configuration exécutable que vous pouvez déposer dans un repo dès aujourd’hui. Il couvre aussi le débat actuel dans la communauté : les développeurs veulent des agents plus autonomes, mais ils ne veulent ni garde-fous invisibles ni exploration opaque des fichiers. La réponse pratique n’est pas “faites encore plus confiance à Claude.” C’est “réduisez assez le rayon d’explosion pour que l’autonomie devienne acceptable.”

Croquis d’architecture façon couverture montrant un éditeur hôte, un conteneur de dev, Claude Code exécuté par un utilisateur non-root, un manage

Le Débat Porte Surtout Sur l’Observabilité et le Rayon d’Explosion

Le fil Hacker News autour de “Anthropic tries to hide Claude’s AI actions” n’est pas juste un théâtre de plaintes. Un commentaire résumait bien la peur des développeurs : si un agent commence à ouvrir une vieille config ou à fouiller des fichiers hors sujet, l’opérateur doit le voir assez vite pour l’arrêter (Hacker News). Un autre fil sur l’exécution “dangereuse” de Claude Code convergeait vers le même schéma pratique : laisser l’agent agir librement, mais uniquement dans une sandbox avec un accès limité aux fichiers et au réseau (Hacker News).

Le billet d’ingénierie d’Anthropic arrive au même endroit. Il sépare les défenses en trois catégories : environnement, modèle et contenu externe. L’environnement est la partie que vous pouvez rendre déterministe. Si les identifiants n’entrent jamais dans la sandbox, Claude ne peut pas les exfiltrer, que la cause soit une injection de prompt, un débordement du modèle ou une mauvaise instruction utilisateur (Anthropic).

Le mode auto a sa place ici, mais ce n’est pas de la magie. Anthropic indique que le mode auto utilise un classificateur séparé pour examiner les actions avant leur exécution, et sa documentation le présente comme un aperçu de recherche, pas comme un substitut à la revue pour les opérations sensibles (Claude Code docs). Cette distinction compte. Le mode auto réduit les prompts. Les conteneurs réduisent les conséquences.

Voici la position que je recommande aux équipes :

ModeÀ utiliser pourÀ ne pas utiliser pour
planrepos inconnus, changements risquéslongues modifications sans surveillance
acceptEditstravail produit normaldéploiements, secrets, changements d’infra
autoconteneurs de dev isolés avec contrôle des sorties réseausystèmes de production ou repos inconnus
bypassPermissionsVM jetables uniquementlaptops de développeurs

La documentation d’Anthropic indique que le mode auto nécessite Claude Code v2.1.83 ou ultérieur. Sur l’API Anthropic, les modèles pris en charge incluent Claude Opus 4.6 ou ultérieur et Sonnet 4.6. Sur Bedrock, Vertex AI et Microsoft Foundry, la documentation ne liste que Opus 4.7 et Opus 4.8 pour le mode auto (Claude Code docs).

Construire le Conteneur de Dev

Créez trois fichiers dans votre repo :

.devcontainer/
  devcontainer.json
  Dockerfile
  managed-settings.json

Commencez par .devcontainer/devcontainer.json :

{
  "name": "claude-code-safe",
  "build": {
    "dockerfile": "Dockerfile"
  },
  "remoteUser": "node",
  "mounts": [
    "source=claude-code-config-${devcontainerId},target=/home/node/.claude,type=volume"
  ],
  "runArgs": [
    "--cap-add=NET_ADMIN",
    "--cap-add=NET_RAW"
  ],
  "containerEnv": {
    "CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC": "1",
    "DISABLE_AUTOUPDATER": "1",
    "ANTHROPIC_BASE_URL": "https://api.onehop.ai/anthropic",
    "ANTHROPIC_API_KEY": "${localEnv:ONEHOP_API_KEY}"
  },
  "postCreateCommand": "sudo /usr/local/bin/init-firewall.sh"
}

La documentation d’Anthropic sur les conteneurs de dev recommande d’exécuter Claude Code dans un conteneur afin que les commandes s’exécutent à l’écart de l’hôte, tout en laissant les modifications apparaître dans le repo monté (Claude Code docs). Elle avertit aussi de ne pas monter les secrets de l’hôte, comme ~/.ssh ou les fichiers d’identifiants cloud. Suivez ce conseil. Si Claude a besoin d’un token GitHub limité au repo, passez-en un à courte durée de vie via l’environnement. Ne bind-montez pas tout votre répertoire home juste parce que c’est pratique.

Maintenant le Dockerfile :

FROM mcr.microsoft.com/devcontainers/javascript-node:22

RUN npm install -g @anthropic-ai/claude-code@latest

COPY managed-settings.json /etc/claude-code/managed-settings.json
COPY init-firewall.sh /usr/local/bin/init-firewall.sh

RUN chmod +x /usr/local/bin/init-firewall.sh

La documentation d’Anthropic fournit aussi une Dev Container Feature, mais l’installation via le Dockerfile rend la politique et le versioning plus faciles à raisonner dans un repo d’équipe. Si vous voulez de la reproductibilité, épinglez @anthropic-ai/claude-code à une version précise et gardez DISABLE_AUTOUPDATER=1.

Verrouiller les Permissions Avant d’Activer le Mode Auto

Créez .devcontainer/managed-settings.json :

{
  "permissions": {
    "defaultMode": "auto",
    "disableBypassPermissionsMode": "disable",
    "deny": [
      "Read(./.env)",
      "Read(./.env.*)",
      "Read(./secrets/**)",
      "Read(./config/credentials.json)",
      "Bash(curl *)",
      "Bash(wget *)",
      "Bash(git push *)",
      "Bash(kubectl *)",
      "Bash(terraform apply *)",
      "WebFetch(domain:169.254.169.254)"
    ],
    "ask": [
      "Bash(npm publish *)",
      "Bash(docker push *)",
      "Bash(gh release *)"
    ],
    "allow": [
      "Bash(npm install)",
      "Bash(npm test *)",
      "Bash(npm run lint *)",
      "Bash(git diff *)",
      "Bash(git status *)"
    ]
  },
  "autoMode": {
    "environment": {
      "trustedDomains": [
        "registry.npmjs.org",
        "github.com"
      ]
    }
  }
}

Deux détails font le vrai travail ici.

D’abord, disableBypassPermissionsMode bloque bypassPermissions et désactive le flag --dangerously-skip-permissions lorsqu’il est imposé via les paramètres gérés. Anthropic documente exactement ce contrôle dans sa référence des paramètres (Claude Code docs).

Ensuite, les règles de refus restent importantes en mode auto. Anthropic indique que le mode auto bloque les actions qui dépassent la demande, ciblent une infrastructure non reconnue ou semblent provoquées par du contenu hostile, mais vous ne devriez pas externaliser la politique de votre équipe à un classificateur. Si personne ne doit lancer terraform apply depuis une session d’agent, encodez-le comme règle de refus.

Une réserve : une politique gérée dans le dépôt peut être modifiée par toute personne qui peut modifier le repo. La documentation d’Anthropic indique que /etc/claude-code/managed-settings.json a une priorité élevée sous Linux, mais pour une politique que les développeurs ne peuvent pas contourner en éditant les fichiers du repo, utilisez des paramètres gérés côté serveur ou un MDM (Claude Code docs). Pour une startup, une politique commitée reste une bonne base. Pour un déploiement enterprise, ne vous arrêtez pas là.

Panneau comparatif avant-après : à gauche, Claude Code sur un laptop hôte avec accès au répertoire home, aux clés SSH,

Restreindre les Sorties Réseau Avec une Petite Allowlist

Ajoutez .devcontainer/init-firewall.sh :

#!/usr/bin/env bash
set -euo pipefail

ALLOWED_HOSTS=(
  api.onehop.ai
  api.anthropic.com
  claude.ai
  platform.claude.com
  registry.npmjs.org
  github.com
  raw.githubusercontent.com
)

iptables -P OUTPUT DROP
iptables -A OUTPUT -o lo -j ACCEPT
iptables -A OUTPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

for host in "${ALLOWED_HOSTS[@]}"; do
  for ip in $(getent ahostsv4 "$host" | awk '{print $1}' | sort -u); do
    iptables -A OUTPUT -p tcp -d "$ip" --dport 443 -j ACCEPT
  done
done

iptables -A OUTPUT -p udp --dport 53 -j ACCEPT
iptables -A OUTPUT -p tcp --dport 53 -j ACCEPT

C’est volontairement simple. Le script résout les noms d’hôte autorisés au démarrage et autorise TCP 443 vers ces IP. Pour un contrôle de niveau production, placez le conteneur derrière un proxy et journalisez chaque requête. Mais même cette règle basique de refus par défaut vaut mieux que de laisser un agent de code autonome parler à tout Internet.

La documentation réseau d’Anthropic liste les domaines requis comme api.anthropic.com, claude.ai, platform.claude.com, downloads.claude.ai, storage.googleapis.com et raw.githubusercontent.com, selon le chemin d’installation et d’authentification (Claude Code docs). Si vous installez via npm et désactivez les mises à jour automatiques, vous n’aurez peut-être pas besoin des domaines de téléchargement à l’exécution. Gardez la liste serrée, puis ajoutez des domaines uniquement quand des builds échouent pour une raison connue.

Lancez-le :

export ONEHOP_API_KEY=oh_your_key_here
code .
# VS Code: Dev Containers: Rebuild and Reopen in Container
claude --permission-mode auto

Dans le conteneur, vérifiez :

whoami
claude --version
curl -I https://api.onehop.ai
curl -I https://example.com

La requête OneHop devrait fonctionner. La requête vers example.com devrait échouer, sauf si vous l’avez ajoutée.

Router Claude Fable 5 via OneHop

Anthropic a lancé Claude Fable 5 et Claude Mythos 5 le 9 juin 2026, avec Fable 5 tarifé à 10 $ par million de tokens d’entrée et 50 $ par million de tokens de sortie, soit moins de la moitié du prix de Mythos Preview (Anthropic). OneHop liste Claude Fable 5 comme anthropic/claude-fable-5, avec un prix officiel affiché à 10 $/M en entrée et 50 $/M en sortie, et un prix OneHop affiché à 3 $/M en entrée et 15 $/M en sortie, plus 10 $ de crédit gratuit pour les nouveaux utilisateurs sans carte bancaire requise (OneHop).

Note opérationnelle actuelle : la page OneHop de Fable 5 indique que le modèle est temporairement indisponible tout en restant listé. Gardez la configuration en place, mais attendez-vous à l’utiliser lorsque votre compte et votre région y auront accès.

Pour un appel Anthropic Messages direct via OneHop, utilisez l’endpoint compatible Anthropic que OneHop publie pour ce modèle :

from anthropic import Anthropic

client = Anthropic(
    base_url="https://api.onehop.ai/anthropic",
    api_key="oh_your_key_here",
)

message = client.messages.create(
    model="anthropic/claude-fable-5",
    max_tokens=1024,
    messages=[{"role": "user", "content": "Summarize this repo's test strategy."}],
)

print(message.content[0].text)

Si votre app utilise déjà la passerelle compatible OpenAI de OneHop, le changement de base URL tient en une ligne :

client = OpenAI(base_url="https://api.onehop.ai/v1", api_key="oh_your_key_here")

Pour Claude Code spécifiquement, utilisez la base URL compatible Anthropic dans ANTHROPIC_BASE_URL, parce que Claude Code parle l’API Anthropic Messages. La page du modèle Fable 5 de OneHop liste actuellement Anthropic Messages comme disponible à https://api.onehop.ai/anthropic, tandis que OpenAI Chat Completions est marqué comme non pris en charge pour ce modèle (OneHop).

Graphique compact de comparaison des prix avec trois barres par modèle : prix catalogue Anthropic pour Fable 5 à 10 $ en entrée et 50 $ en sortie,

Le Modèle Opérationnel : Moins Faire Confiance, Livrer Plus Vite

La meilleure configuration Claude Code n’est pas la plus permissive. C’est celle où les erreurs coûtent peu.

Utilisez le mode plan quand Claude explore une nouvelle base de code. Passez à auto seulement une fois la tâche bornée. Gardez bypassPermissions désactivé par politique. Refusez les lectures de secrets. Refusez les déploiements, les pushes vers les branches protégées, les mutations cloud et les endpoints de métadonnées. Mettez l’agent dans un conteneur de dev non-root. Bloquez les sorties réseau par défaut. Relisez le diff avant de merger.

Ça peut sembler plus lent que le mode YOLO. En pratique, c’est plus rapide, parce que personne n’a à surveiller 40 prompts triviaux ni à se demander si une approbation vient de permettre à un modèle d’exfiltrer un token. Le propre billet d’Anthropic sur le confinement dit que le conteneur de dev de référence existe pour que Claude Code puisse tourner sans surveillance, sans approbations action par action (Anthropic). La pièce manquante, c’est la politique d’équipe.

Si vous voulez le chemin le plus court pour essayer du travail de code de classe Fable sans reconstruire votre pile fournisseur, routez via Claude Fable 5 sur OneHop. Les nouveaux comptes peuvent commencer avec 10 $ gratuits. Le changement de base URL, c’est la partie facile. Le vrai gain, c’est de l’associer à un conteneur qui rend l’autonomie assez sûre pour être utilisée.