gateway.yaml. Le fichier définit tout ce que fait la passerelle : où elle écoute, comment les développeurs se connectent, où va l’inférence et quelles politiques et télémétrie s’appliquent. Cette page est la référence pour chaque option de ce fichier.
Pour écrire votre première, commencez par le démarrage rapide, qui crée une configuration minimale fonctionnelle et l’exécute. Une fois que vous avez une configuration avec laquelle vous êtes satisfait, le guide de déploiement couvre la conteneurisation et l’hébergement sur Kubernetes, Cloud Run ou votre propre plateforme.
La passerelle lit le fichier une fois, au démarrage, avec claude gateway --config /path/to/gateway.yaml. Chaque option est validée par rapport à un schéma au démarrage, donc une configuration mal formée échoue au démarrage avec une erreur au niveau du champ plutôt qu’à la première utilisation.
L’exemple complet à la fin de cette page exerce chaque section.
Structure du fichier
Cinq sections sont requises. Chaque autre section est optionnelle, et une section omise prend ses valeurs par défaut. Les clés inconnues échouent au démarrage, donc une faute de frappe apparaît comme une erreur nommée plutôt qu’un paramètre silencieusement ignoré. Sections requises :listen: adresse de liaison, URL publique, terminaison TLSoidc: votre fournisseur d’identité (IdP), y compris l’émetteur, le client, le mappage des réclamations et qui peut se connectersession: les jetons porteurs que la passerelle émet, avec secret et durée de viestore: PostgreSQL, pour les subventions d’appareils et les compteurs de limite de débitupstreams: où l’inférence va, qu’il s’agisse d’Anthropic, Amazon Bedrock, Claude Platform sur AWS, Agent Platform de Google Cloud ou Microsoft Foundry
admin: authentification de l’API Admin et rétention pour les limites de dépensesenforcement: comportement de limite de dépenses fail-open ou fail-closedpricing: tarifs contractuels et multiplicateur de remise pour le compteur de dépenses et pour les chiffres de coût que les développeurs voientmodelsetauto_include_builtin_models: liste de modèles curée par l’administrateur et IDs par upstreammanaged: politiques de paramètres gérés par groupe IdPtelemetry: transfert OTLP vers votre pile d’observabilitéaccess_control,limits,timeouts,rate_limits: autorisation/refus IP, plafonds de taille de requête, time-to-first-byte upstream et limites de connexion par IPload_test_mode: tester en charge la passerelle sans appeler un fournisseur de modèle
Expansion des secrets
N’écrivez pas de secrets tels queclient_secret, jwt_secret ou postgres_url directement dans gateway.yaml. Référencez-les avec l’une des formes ci-dessous, et la passerelle résout la valeur au démarrage à partir d’une variable d’environnement ou d’un fichier :
Sections requises
listen
Le bloc listen contrôle où la passerelle sert : l’adresse de liaison et le port, l’origine visible en externe, et la terminaison TLS optionnelle.
oidc
Le bloc oidc connecte la passerelle à votre fournisseur d’identité et décide qui peut se connecter. Il nomme l’émetteur et le client OAuth, mappe les réclamations qui portent l’e-mail et les groupes, et restreint la connexion par domaine d’e-mail ou groupe.
OpenID Connect (OIDC) est le protocole SSO que la passerelle utilise avec votre fournisseur d’identité ; voir Configuration du fournisseur d’identité pour ce qu’il faut enregistrer du côté IdP.
Demandes IdP via un proxy de transfert
Les upstreams d’inférence honorentHTTPS_PROXY et HTTP_PROXY sur chaque version. Les propres demandes de la passerelle à l’IdP, découverte, JWKS, jeton et userinfo, vont directement sauf si vous définissez oidc.use_proxy: true, ce qui nécessite v2.1.227 ou ultérieur. Lorsqu’une variable proxy est définie, use_proxy n’est pas défini et l’émetteur n’est pas couvert par NO_PROXY, la passerelle garde ces demandes directes et enregistre un avis au démarrage vous demandant de choisir ; use_proxy: false les garde directes et fait taire l’avis.
Avec use_proxy: true, le pod résout lui-même le nom d’hôte de chaque point de terminaison IdP et demande au proxy de CONNECT à l’adresse IP résolue, donc le proxy doit accepter CONNECT à l’adresse IP de chaque hôte que le document de découverte nomme, pas seulement l’émetteur. Utilisez une URL de proxy http://. ca_cert_pem et la garde SSRF s’appliquent également sur le chemin proxifié.
Egress proxy uniquement change les deux : pendant qu’il est actif, les demandes IdP suivent le proxy sauf si vous définissez use_proxy: false, et la passerelle remet au proxy chaque nom d’hôte IdP sans le résoudre d’abord.
Egress proxy uniquement
DéfinissezCLAUDE_GATEWAY_PROXY_IS_EGRESS_BOUNDARY=1 dans l’environnement de la passerelle, à côté de HTTPS_PROXY, lorsque le pod atteint d’autres hôtes uniquement via ce proxy de transfert et ne peut pas résoudre les noms DNS publics lui-même, ou lorsque le proxy refuse CONNECT à une adresse IP. Nécessite v2.1.277 ou ultérieur. C’est une variable d’environnement plutôt qu’une clé gateway.yaml pour que rien dans le fichier de configuration ne puisse assouplir la vérification d’adresse de la passerelle.
network: au démarrage pendant que l’egress proxy uniquement est actif.
Chaque ligne ci-dessous est une classe de demande sortante sur une passerelle avec HTTPS_PROXY défini, par défaut et pendant que l’egress proxy uniquement est actif.
L’egress proxy uniquement reste désactivé sauf si l’environnement de la passerelle répond à ces trois conditions :
HTTPS_PROXYouHTTP_PROXYest défini.NO_PROXYetno_proxysont vides. Si votre plateforme injecte l’un ou l’autre dans les pods, définissez les deux sur une valeur vide sur le conteneur de la passerelle. Lister un collecteur de télémétrie dansNO_PROXYgarde l’egress proxy uniquement désactivé.CLAUDE_GATEWAY_ALLOW_LOOPBACKn’est pas activé. Un collecteur ou IdP sur la propre boucle locale du pod ne peut pas être combiné avec l’egress proxy uniquement, car une adresse loopback remise au proxy serait la propre boucle locale de l’hôte proxy, donc donnez à ces services une adresse que le proxy peut atteindre à la place. Pour la même raison, la passerelle refuse les noms de stylelocalhostdirectement pendant que l’egress proxy uniquement est actif.
oidc.use_proxy: false.
session
Le bloc session façonne les jetons porteurs que la passerelle émet après la connexion : le secret qui les signe et combien de temps ils vivent.
store
Le bloc store pointe la passerelle vers sa base de données PostgreSQL, qui contient les subventions d’appareils et les compteurs de limite de débit.
Pour le développement local, pointez
postgres_url sur un conteneur Postgres jetable, par exemple docker run --rm -p 5432:5432 -e POSTGRES_HOST_AUTH_METHOD=trust postgres.
upstreams
upstreams est une liste ordonnée. La passerelle transfère l’inférence au premier upstream qui résout le modèle demandé.
Sur 5xx, 429, 401, 403, 404, ou timeout, la passerelle bascule vers le suivant ; les autres 4xx ne le font pas, car ces erreurs sont attribuables à la demande plutôt qu’à l’upstream. Un 401 ou 403 signifie que l’identifiant propre de la passerelle a échoué contre cet upstream. Un 404 signifie que cet upstream ne sert pas le modèle demandé, donc un upstream ultérieur dans la liste peut toujours le faire.
Si vous définissez forward_user_identity: true sur un upstream, un 429 qu’il retourne à une demande qui portait l’e-mail du développeur ne bascule pas. Voir comment un déni de limite par utilisateur atteint le développeur.
Le basculement sur 404 nécessite la passerelle v2.1.198 ou ultérieure. Les versions antérieures retournaient le premier 404 au client même lorsqu’un upstream ultérieur dans la liste servait le modèle.
Plusieurs upstreams du même fournisseur doivent définir un name: distinct.
Les clients Amazon Bedrock, Claude Platform on AWS, Google Cloud’s Agent Platform et Microsoft Foundry sont construits une fois au démarrage, et leurs SDKs actualisent les identifiants en interne, donc la rotation des identifiants cloud ne nécessite pas un redémarrage. Les clés API Anthropic statiques et les porteurs sont lus au démarrage ; voir Anthropic API.
Messages d’erreur d’upstream
La passerelle retourne la réponse d’erreur d’un upstream, ou son propre502, selon la façon dont les upstreams ont répondu :
- Un upstream a retourné un statut sur lequel la passerelle ne bascule pas : la réponse de cet upstream. La passerelle n’essaie pas d’autres upstreams.
- Chaque upstream que la passerelle a essayé a échoué d’une manière sur laquelle elle bascule : le dernier
429. Lorsqu’aucun n’a retourné un429, la passerelle préfère, dans l’ordre, le dernier401ou403, le dernier404et le dernier501. Lorsqu’aucun n’a retourné l’un de ceux-ci, le propre502de la passerelle,all upstreams failed (N attempted), où N compte chaque entrée dansupstreams, y compris les entrées que la passerelle a ignorées car elles ne servent pas le modèle demandé.
400ou413dans l’enveloppe d’erreur standard d’Anthropic : le message propre de l’upstream, tel queprompt is too long. Claude Platform on AWS, Agent Platform et Microsoft Foundry retournent cette enveloppe pour les rejets d’API de modèle.400ou413dans la propre forme du fournisseur : un jetoncapability_rejected:. Lorsque la passerelle ne peut pas classer le rejet,upstream rejected the requestsur un400ourequest too large for this upstreamsur un413.- Tout autre statut : copie générique par statut, tel que
upstream rate limit exceededsur un429.
Input is too long for requested model. d’Amazon Bedrock par capability_rejected: prompt_too_long. Claude Code se compacte automatiquement sur ce jeton, comme il le fait sur prompt is too long.
Garder le message 400 ou 413 d’un upstream cloud, ou le remplacer par un jeton capability_rejected:, nécessite la passerelle v2.1.233 ou ultérieure.
Anthropic API
L’upstream Anthropic minimal est une clé API de la Console Claude :api_key: envoiex-api-key. Faites-la pivoter dans la Console Claude et mettez à jour la variable env.oauth_token: envoieAuthorization: Bearer. Utilisez la forme porteur lorsque votre organisation émet des jetons de courte durée au lieu de clés API de longue durée. Le porteur est lu une fois au démarrage, donc actualisez en remontant le secret et en redémarrant.
base_url d’un upstream provider: anthropic vers un proxy que vous exécutez au lieu de l’API Anthropic. Pour dire à ce proxy quel développeur a envoyé chaque demande, définissez forward_user_identity: true sur cet upstream. Le proxy peut alors attribuer les dépenses par développeur. Nécessite une passerelle exécutant Claude Code v2.1.233 ou ultérieur.
Par exemple, pour un proxy à upstream-gateway.internal.example.com :
Lorsque le jeton IdP ne porte pas d’e-mail, la passerelle envoie uniquement
x-claude-gateway-user-id et omet les deux en-têtes d’e-mail. Si votre IdP met l’e-mail dans une réclamation différente, définissez oidc.email_claim sur cette réclamation.
Lorsque votre proxy répond 429 à une demande qui portait l’e-mail du développeur, la passerelle retourne cette réponse au développeur telle quelle au lieu de basculer vers le prochain upstream, donc votre limite de budget ou de débit par utilisateur du proxy tient. Les autres réponses du proxy suivent les règles de basculement ordinaires. Si le jeton IdP d’un développeur ne porte pas d’e-mail, la passerelle transfère ses demandes sans les en-têtes d’e-mail, donc un 429 à l’une de ces demandes compte comme capacité d’upstream et bascule. Avant v2.1.267 sur le serveur de la passerelle, chaque 429 basculait.
Définissez forward_user_identity uniquement sur un upstream dont le base_url est un proxy que vous exploitez. La passerelle envoie les e-mails des développeurs à quel que soit le serveur que ce base_url nomme. Si le base_url est l’API Anthropic, qui est la valeur par défaut, la passerelle refuse de démarrer.
Amazon Bedrock
Pour le déploiement Bedrock côté client que la passerelle remplace ou fronts, voir Claude Code sur Amazon Bedrock. L’upstream côté passerelle :auth vide utilise la chaîne d’identifiants par défaut du SDK AWS : variables env, ~/.aws/credentials, rôle de tâche ECS, métadonnées d’instance EC2 ou IRSA sur EKS. En production, donnez au pod de la passerelle un rôle IAM au lieu d’intégrer des clés statiques dans une image de conteneur.
Les identifiants explicites doivent être complets : la passerelle échoue au démarrage lorsque aws_access_key_id et aws_secret_access_key ne sont pas définis ensemble, ou lorsque aws_session_token est défini sans eux. Avant v2.1.207, un bloc auth: partiel passait la validation.
Claude Platform on AWS
Claude Platform on AWS sert l’API Anthropic propriétaire sur l’infrastructure AWS àaws-external-anthropic.<region>.api.aws. Il utilise les IDs de modèle propriétaires, honore les en-têtes anthropic-beta tels qu’envoyés, et sert count_tokens, donc aucune des traductions spécifiques à Bedrock ne s’applique. Le fournisseur anthropicAws nécessite Claude Code v2.1.198 ou ultérieur ; les versions antérieures de la passerelle le rejettent au démarrage.
Pour le déploiement côté client de la même plateforme, voir Claude Code sur Claude Platform on AWS. L’upstream côté passerelle :
aws-external-anthropic, donc un rôle IAM limité à Bedrock ne l’autorise pas. Une clé API dans auth.api_key prend la priorité lorsque les identifiants SigV4 sont également définis. Un bloc auth vide utilise la chaîne d’identifiants par défaut du SDK AWS, la même chaîne que l’upstream Amazon Bedrock utilise.
Parce que la plateforme résout les IDs de modèle propriétaires, le catalogue intégré route vers elle sans bloc
models:. Lorsque vous organisez une liste models:, indexez l’entrée anthropicAws: avec l’ID propriétaire.
Google Cloud Agent Platform
Pour la configuration équivalente côté client, voir Claude Code sur Google Cloud. L’upstream côté passerelle :auth vide utilise les identifiants par défaut d’application : GOOGLE_APPLICATION_CREDENTIALS, métadonnées GCE ou Workload Identity GKE. Les fichiers de clé JSON de compte de service sont pris en charge mais déconseillés ; utilisez Workload Identity ou attachez un compte de service à l’instance GCE ou Cloud Run.
Définissez region: global pour utiliser le point de terminaison global d’Agent Platform au lieu d’un point de terminaison régional. Google route ensuite chaque demande vers une région disponible, donc vous ne suivez pas la disponibilité du modèle par région. Définir une région spécifique épingle chaque demande à celle-ci.
Microsoft Foundry
Pour le déploiement Foundry côté client, voir Claude Code sur Microsoft Foundry. L’upstream côté passerelle :use_azure_ad: true résout via DefaultAzureCredential : Managed Identity sur AKS, ACI ou App Service ; l’Azure CLI ; ou les identifiants d’environnement. Les clés API fonctionnent mais sont à l’échelle du projet et ne pivotent pas automatiquement. Le point de terminaison de Foundry est dérivé de resource: ; définissez le base_url optionnel pour le remplacer pour les clouds souverains tels que Azure Government.
En-têtes statiques sur les demandes d’upstream
Pour ajouter des en-têtes fixes aux demandes que la passerelle envoie à un upstream, définissezheaders: sur cet upstream. Utilisez-le lorsqu’un proxy que vous exécutez devant le fournisseur route ou attribue le trafic par un en-tête.
headers: nécessite Claude Code v2.1.277 ou ultérieur sur le serveur de la passerelle. Une passerelle antérieure refuse de démarrer lorsqu’elle trouve la clé. Mettez à niveau chaque réplique avant d’ajouter la clé, et supprimez la clé avant de revenir à une version antérieure.
Les en-têtes vont au serveur que base_url nomme, ou au point de terminaison propre du fournisseur lorsque base_url n’est pas défini. Le fournisseur les reçoit également sauf si votre proxy les supprime.
Cet exemple atteint un upstream provider: vertex via un proxy à upstream-proxy.internal.example.com. Il définit l’en-tête x-source que le proxy lit, et envoie un jeton de la variable d’environnement PROXY_TOKEN en tant que x-proxy-token :
true ou false pour que YAML le lise comme du texte.
Pour garder un secret hors du fichier de configuration, utilisez l’expansion de secret pour charger la valeur à partir d’une variable d’environnement avec ${VAR} ou à partir d’un fichier avec ${file:/path}. Un ${VAR} qui se résout à une valeur vide arrête le démarrage de la passerelle.
headers: fonctionne sur chaque fournisseur, et chaque upstream envoie uniquement le sien.
Pas chaque demande que la passerelle envoie à un upstream les porte :
Sur un upstream Amazon Bedrock ou Claude Platform on AWS qui signe les demandes avec AWS SigV4, ces en-têtes font partie de la signature, donc votre proxy doit les transmettre inchangés.
Si vous utilisez un nom que la passerelle réserve, elle refuse de démarrer, et l’erreur de démarrage nomme l’en-tête. Les noms réservés incluent :
authorizationetx-api-keyhost,content-typeetuser-agent- Tout nom commençant par
anthropic-,x-goog-,x-amz-oux-amzn-
Plusieurs upstreams
Le même fournisseur peut apparaître plus d’une fois avec unname: distinct. Cela couvre différentes régions, différents comptes via différentes chaînes d’identifiants, débit provisionné par rapport à la demande, et basculement inter-fournisseur.
La passerelle essaie les upstreams dans l’ordre. 5xx, 429, 401, 403, 404, timeouts et point de terminaison manquant (501) basculent ; les autres 4xx ne le font pas.
429 est la capacité par upstream, donc l’épuisement du débit provisionné (PT) bascule vers la demande. Si vous définissez forward_user_identity: true sur un upstream, un 429 à une demande qui portait l’e-mail du développeur est un déni par utilisateur au lieu et ne bascule pas.
Chaque demande commence au premier upstream. Une demande atteint un upstream ultérieur uniquement lorsque chaque upstream devant lui a échoué ou ne sert pas le modèle demandé.
La passerelle ne garde aucun enregistrement des upstreams défaillants, donc pendant qu’un upstream est en panne, chaque demande qui l’atteint l’essaie toujours et attend qu’il échoue avant de passer au suivant.
Pour un upstream Anthropic API, timeouts.upstream_ttfb_ms limite l’attente sur un upstream en panne. Ce paramètre ne s’applique pas aux autres fournisseurs, où la passerelle attend jusqu’à une heure pour qu’un upstream commence à répondre.
404 est la disponibilité du modèle par upstream, donc un upstream qui n’a pas activé un modèle ne bloque pas un upstream ultérieur qui le sert. Un upstream qui ne peut pas résoudre le modèle demandé est ignoré sans un aller-retour réseau.
Cet exemple route une allocation Bedrock de débit provisionné en premier, déborde vers la demande et un deuxième compte, et revient à l’API Anthropic en dernier :
Le basculement entre les fournisseurs cloud ou vers l’API Anthropic directe change quel accord, géographie et autres conditions régissent la demande.
Le CLI applique le même contrôle de fonctionnalité aux passerelles indépendamment de quel upstream sert une demande donnée, donc le basculement n’envoie pas un champ de corps qu’un upstream rejetterait.
Sections optionnelles
admin
Optionnel. Active /v1/organizations/spend_limits, qui reflète l’API Admin publique d’Anthropic, et l’application des limites de dépenses par développeur sur /v1/messages. Consultez Limites de dépenses pour savoir comment les plafonds sont définis et appliqués ; cette section couvre les clés gateway.yaml qui activent la fonctionnalité et l’ajustent.
enforcement
Le bloc enforcement contrôle le comportement des vérifications de limite de dépenses lorsque le magasin est indisponible.
pricing
Le bloc pricing indique au compteur de dépenses quoi facturer au lieu du prix catalogue USD, afin que les plafonds et /effective reflètent vos tarifs contractuels. Les montants restent en USD et restent une estimation, pas une facture. Deux conditions préalables :
- Claude Code v2.1.227 ou ultérieur sur le serveur de passerelle. Les versions antérieures rejettent la clé inconnue au démarrage.
- Un bloc
admin:ou, dans v2.1.268 ou ultérieur, un blocmanaged:avec au moins une politique. La passerelle refuse de démarrer avecpricingdéfini et aucun bloc, car rien ne le lirait.
Comment le compteur correspond à une ligne de remplacement :
- Une ligne remplace le prix catalogue pour les demandes que
upstream, unupstreams[].name, traite pourmodel. Cela inclut le tarif mode rapide plus élevé, afin que les demandes en mode rapide et standard soient mesurées aux mêmes quatre tarifs. - Un ID intégré tel que
claude-sonnet-4-6, correspondant commemodels[].id, couvre chaque forme datée, forme régionale Amazon Bedrock, ou forme Google Cloud Agent Platform que le compteur évalue comme ce modèle. Toute autre chaîne, comme un alias ou un ARN de profil d’inférence, correspond à l’ID que le client a envoyé ou à la chaîne envoyée en amont, insensible à la casse. - Lorsque les lignes se chevauchent, le compteur choisit la ligne la plus spécifique plutôt que la première ligne : une ligne dont
modelest la chaîne de modèle exacte envoyée en amont, puis une ligne correspondant à l’ID exact que le client a envoyé, puis une ligne nommant le modèle intégré. - Un nom d’amont inconnu échoue au démarrage, tout comme deux lignes pour un amont qui nomment le même modèle, y compris deux orthographes d’un modèle intégré. La passerelle avertit au démarrage à propos d’une ligne qu’aucun modèle demandable ne peut utiliser.
- Les demandes de recherche Web restent au prix catalogue de $0,01 ; le multiplicateur s’y applique toujours.
Majorer les prix
Avec v2.1.271 ou ultérieur sur le serveur de passerelle, vous pouvez définirmultiplier au-dessus de 1, jusqu’à 10, pour mesurer plus que ce que le fournisseur facture, par exemple un tarif de rétrofacturation interne. Cet exemple mesure chaque demande à 120 % du prix :
admin:, la majoration s’applique également aux limites de dépenses. Le compteur compte 120 % du prix, afin que les développeurs atteignent leurs plafonds plus tôt. La passerelle enregistre un avertissement au démarrage qui le dit.
Le multiplicateur ne change pas ce que le fournisseur en amont facture pour les demandes.
Si la passerelle envoie également les tarifs aux clients connectés, les développeurs ont besoin de Claude Code v2.1.271 ou ultérieur pour voir la majoration. Les clients antérieurs ignorent un multiplier supérieur à 1 et affichent les coûts sans lui.
Un serveur de passerelle antérieur à v2.1.271 refuse de démarrer si vous définissez un multiplier supérieur à 1.
Envoyer les tarifs aux clients connectés
Avec v2.1.268 ou ultérieur sur le serveur de passerelle, la passerelle place également les tarifs depricing dans les politiques managed qu’elle sert, en tant que paramètre géré modelPricing. Les développeurs correspondant à une politique voient alors les tarifs pricing pour le premier amont qui sert chaque ID de modèle dans /usage, la ligne d’état et OpenTelemetry. Un développeur qui ne correspond à aucune politique ne reçoit aucun paramètre géré, afin que ses chiffres restent au prix catalogue. Les clients appliquent le paramètre dans Claude Code v2.1.242 ou ultérieur.
- Ce que la passerelle ajoute : à moins que le bloc
clid’une politique ne définisse déjàmodelPricing, la passerelle ajoute lemultiplieret, pour chaque ID de modèle qu’un client peut demander, la ligne de remplacement du premier amont qui sert cet ID. Un tarif que seul un amont de basculement facture reste sur la passerelle. - Exclure une politique : définissez
modelPricingà{}dans le blocclide cette politique, et ses développeurs restent au prix catalogue. - Conserver les tarifs propres d’une politique : une politique dont le bloc
clidéfinitmodelPricingavec son propremultiplierouoverridesconserve cemodelPricingentièrement, et la passerelle n’ajoute aucun de ses propres tarifs à celui-ci.
models
Le bloc models est une liste de modèles optionnelle organisée par l’administrateur, servie à /v1/models et utilisée pour traduire les ID de modèles par amont. Elle est obligatoire pour les régions Amazon Bedrock non-US, les ARN de débit provisionné Amazon Bedrock et les noms de déploiement Microsoft Foundry.
upstream_model doit correspondre au name d’un amont configuré, qui par défaut est le nom du fournisseur. Une clé qui ne correspond à aucun amont échoue au démarrage, donc omettez les lignes pour les fournisseurs que vous n’utilisez pas.
managed
Le bloc managed définit les politiques d’accès basées sur les rôles basées sur les groupes IdP ou le domaine de messagerie. Les politiques sont évaluées dans l’ordre ; la première correspondance est sélectionnée, puis fusionnée sur la base de capture-tout match: {}. Elles sont servies par utilisateur à GET /managed/settings avec mise en cache ETag/304.
match: {}, conventionnellement listée en dernier, est traitée comme une couche de base. Chaque autre politique hérite de toute clé qu’elle ne définit pas de la capture-tout, afin que les entrées par rôle n’aient besoin de lister que ce qui diffère de la valeur par défaut de l’organisation. Les règles de fusion dépendent du type de clé :
- Listes d’autorisation :
availableModelsetpermissions.allow. La liste d’une politique spécifique remplace entièrement celle de la base. - Listes de refus et tableaux de hooks :
permissions.deny,permissions.ask,disabledMcpjsonServers,deniedMcpServers,blockedMarketplaceset chaque tableau d’événement de typehooks. Ceux-ci prennent l’union de la base et de la politique, afin qu’un refus à l’échelle de l’organisation ou un hook d’audit ne soit pas accidentellement supprimé par un remplacement par rôle. - Clés de type enregistrement :
env,modelOverridesetskillOverrides. Ceux-ci fusionnent superficiellement, afin qu’un blocenvpar rôle remplace les clés qu’il définit et hérite du reste de la base.
availableModels est également appliqué côté serveur à /v1/messages, afin qu’un modèle refusé retourne 400 indépendamment de ce que le client envoie.
La passerelle valide la valeur model elle-même avant de relayer une demande, afin qu’une valeur mal formée n’atteigne jamais un amont. Elle rejette la demande avec un 400 dans deux cas :
- Lorsque la valeur est manquante ou vide, la passerelle rejette la demande avec le message
model is required. Cette vérification nécessite une passerelle exécutant Claude Code v2.1.228 ou ultérieur. - Lorsque la valeur est présente mais n’est pas une chaîne, la passerelle rejette la demande avec le message
model must be a string. Nécessite une passerelle exécutant Claude Code v2.1.221 ou ultérieur.
Un utilisateur authentifié qui ne correspond à aucune politique obtient les valeurs par défaut de la passerelle, ce qui signifie chaque modèle du catalogue et aucun paramètre géré. Ajoutez une capture-tout
match: {} en dernier si vous voulez une politique par défaut garantie.
La passerelle ne conserve aucun répertoire d’utilisateurs propre. Elle autorise chaque demande à partir du jeton IdP de l’utilisateur, en lisant l’appartenance au groupe à partir de la revendication
groups du jeton et en évaluant les politiques par rapport à celui-ci. Il n’y a pas de liste à énumérer et aucun compte à pré-créer, et donc aucun point de terminaison SCIM, car il n’y a rien pour que SCIM se synchronise.Exécutez la gestion du cycle de vie des utilisateurs et des groupes à la source de vérité, qui est le provisionnement SCIM natif de votre IdP ou une plateforme de gouvernance des identités dédiée. L’appartenance et la déprovision gouvernées là-bas s’écoulent dans la passerelle automatiquement via le jeton. Si vous voulez le provisionnement SCIM des comptes Claude eux-mêmes, c’est une capacité de Claude for Enterprise.Deux horloges de propagation s’appliquent :- Contenu de la politique : modifier une politique et redéployer atteint les clients connectés lors de leur prochain sondage de paramètres gérés, dans l’heure, à l’exception des modifications qui s’appliquent uniquement au prochain lancement
- Appartenance au groupe : modifier l’appartenance au groupe d’un utilisateur change la politique qui le correspond. Cela prend effet lors de la prochaine réémission de session, ce qui signifie le prochain renouvellement silencieux, limité par
session.ttl_hours.
Valeurs de correspondance qui arrêtent la passerelle au démarrage
Au démarrage, la passerelle vérifie le blocmatch de chaque politique et la liste admin_groups. L’une de ces valeurs arrête la passerelle avec une erreur qui nomme le champ :
- Une liste
groupsvide - Une entrée vide dans
groupsou dansadmin_groups - Un
email_domainvide - Un
email_domainqui contient@, un espace ou une virgule. La passerelle supprime la valeur et enlève un@initial avant cette vérification. Écrivez un domaine nu, commeexample.com.
- Un
email_domainvide : la passerelle a ignoré la vérification du domaine, afin qu’une politique avec unemail_domainvide et aucune listegroupscorresponde à chaque utilisateur authentifié - Une liste
groupsvide : la politique ne correspondait à personne - Un
email_domaincontenant@, un espace ou une virgule : la politique ne correspondait à personne - Une entrée vide dans
groupsou dansadmin_groups: l’entrée correspondait à un utilisateur uniquement lorsque la revendicationgroupsIdP de cet utilisateur contenait également une entrée vide. Dansadmin_groups, cette correspondance accordait l’accès admin. Si votre listeadmin_groupsne contenait jamais une entrée vide, personne n’a obtenu l’accès admin de cette façon.
Ce qui va dans cli
Chaque valeur cli est un document complet Claude Code managed-settings.json, le même schéma que vous déploieriez via MDM ou /etc/claude-code/managed-settings.json, exprimé ici en YAML. Le CLI applique le document livré au niveau géré, au-dessus des paramètres utilisateur et projet, à la place des paramètres gérés par le serveur. Il ignore donc les paramètres restreints aux sources de politique au niveau du système d’exploitation, comme policyHelper et wslInheritsWindowsSettings.
La passerelle valide chaque document par rapport au schéma de paramètres du CLI au démarrage, afin qu’une clé de niveau supérieur non reconnue échoue au démarrage avec une erreur nommant chaque clé contrevenante. Les parties délibérément ouvertes du schéma acceptent toujours des valeurs arbitraires, car les clients plus récents peuvent reconnaître des entrées que le schéma de la passerelle ne reconnaît pas. Ces clés ouvertes incluent env, pluginConfigs et les clés imbriquées sous permissions.
Parce que la validation utilise le schéma fourni avec la version installée de la passerelle, placer une clé de paramètres de niveau supérieur introduite par une version plus récente de Claude Code dans la configuration gérée nécessite de mettre à niveau la passerelle en premier. Testez une nouvelle politique sur un client avant de la déployer.
La référence complète des clés se trouve dans Paramètres Claude Code. Les clés que les opérateurs atteignent en premier :
Parce que ces paramètres arrivent sur le réseau, le CLI affiche à chaque développeur une boîte de dialogue d’approbation de sécurité avant d’appliquer les paramètres listés ci-dessous :
hooks- Variables
envqui nécessitent l’approbation du développeur, comme les variables de proxy et d’URL de base - Paramètres d’exécution de shell comme
apiKeyHelperetstatusLine - Les paramètres binaires du bac à sable
sandbox.bwrapPath,sandbox.socatPathetsandbox.ripgrep - Les paramètres du bac à sable qui interceptent le trafic, injectent des identifiants ou affaiblissent l’isolation, comme
sandbox.network.tlsTerminateet les paramètres du port proxy. Boîtes de dialogue d’approbation de sécurité les liste tous.
env livrées sans afficher la boîte de dialogue d’approbation au développeur, comme les paramètres de sélection de modèle et les limites numériques. D’autres variables livrées peuvent nécessiter l’approbation du développeur avant de prendre effet ; une valeur de proxy, d’URL de base ou OTEL_EXPORTER_OTLP_ENDPOINT non vide le fait toujours. Lorsqu’une variable livrée a besoin d’approbation, la boîte de dialogue la nomme.
Variables d’environnement et boîte de dialogue d’approbation a les détails, y compris quatre bascules de confidentialité dont la valeur livrée décide si elles ont besoin d’approbation. Avant v2.1.218, Claude Code appliquait moins de variables sans demander au développeur, afin que plus de variables livrées déclenchent la boîte de dialogue.
La configuration de télémétrie de la passerelle pousse OTEL_EXPORTER_OTLP_ENDPOINT, afin que la définition de telemetry.forward_to déclenche la boîte de dialogue sur chaque client interactif. La boîte de dialogue protège la machine du développeur d’une passerelle compromise ou hostile, pas l’organisation du développeur.
Une exécution non interactive avec l’indicateur -p ne peut pas afficher la boîte de dialogue. Elle applique les paramètres poussés pour cette exécution uniquement et ne les enregistre pas comme approuvés, afin que la prochaine session interactive du développeur affiche toujours la boîte de dialogue pour eux. Avant v2.1.207, une exécution non interactive enregistrait les paramètres comme approuvés et aucune session interactive ultérieure n’affichait la boîte de dialogue pour eux.
Si un développeur refuse, Claude Code quitte cette session plutôt que d’appliquer la politique. Lorsque vous poussez un nouveau hook, ou toute variable env qui déclenche la boîte de dialogue, à une politique large, Claude Code affiche donc la boîte de dialogue à chaque développeur correspondant. Il affiche la boîte de dialogue dans une session en cours lors du prochain sondage horaire, et sinon au prochain démarrage du développeur.
La clé cli s’appelait settings dans les versions antérieures. Cette orthographe est toujours acceptée comme alias, mais les nouveaux déploiements doivent utiliser cli.
Serveurs MCP dans une politique
Pour fournir des serveurs MCP aux clients Claude Code qu’une politique correspond, définissezmanagedMcpServers dans le bloc cli de cette politique. Vous avez besoin de Claude Code v2.1.259 ou ultérieur sur le serveur de passerelle et sur les clients.
La passerelle vérifie chaque entrée au démarrage avec les mêmes règles que Claude Code applique sur le client, et si une entrée échoue une vérification, la passerelle refuse de démarrer et nomme l’entrée.
Si vous écrivez une référence ${VAR} dans gateway.yaml, la passerelle la résout à partir de son environnement au démarrage via expansion de secret avant d’exécuter les vérifications d’entrée, afin que chaque client correspondant reçoive la valeur littérale et puisse la lire. L’orientation d’en-tête pour les serveurs fournis s’applique à la valeur étendue.
La passerelle rejette l’orthographe .mcp.json mcpServers dans un bloc cli, et son erreur de démarrage nomme managedMcpServers comme clé à utiliser. Avant v2.1.259, la passerelle rejetait toute définition de serveur MCP dans un bloc cli.
Superposition Claude Desktop
Si votre organisation déploie également Claude Desktop, la même passerelle sert les deux clients. PointezbootstrapUrl, dans la configuration gérée de Claude Desktop, sur <listen.public_url>/user/bootstrap. Claude Desktop dérive l’émetteur OAuth de cette URL, exécute la même connexion par code d’appareil contre cette passerelle et récupère sa configuration à partir de la réponse.
Nécessite Claude Code v2.1.203 ou ultérieur sur le serveur de passerelle, et un opt-in explicite :
/user/bootstrap retourne 404 à moins que la politique correspondant à l’utilisateur ne porte une clé desktop. Un desktop: {} vide opte une politique, et une clé desktop sur la couche de base match: {} opte chaque politique qui l’hérite. Le journal d’audit enregistre chaque demande en tant que desktop_bootstrap.serve ou desktop_bootstrap.denied.cli de la politique correspondante et de la configuration de passerelle de niveau supérieur :
-
La liste des modèles, de
availableModels -
Outils désactivés, à partir des entrées
permissions.denyde nom d’outil nu. Si vous définissezdisabledBuiltinToolsdans le blocdesktopde la politique, la passerelle sert l’union de votre valeur et de la liste dérivée, afin que vous puissiez désactiver plus d’outils de cette façon mais ne puissiez pas réactiver un que vous avez désactivé viapermissions.deny -
La liste d’autorisation de sortie, de
sandbox.network.allowedDomains. Si vous définissezcoworkEgressAllowedHostsdans le blocdesktopde la politique, la passerelle utilise cette valeur à la place de la liste dérivée -
Un point de terminaison OTLP qui pointe vers la passerelle elle-même, et les attributs d’identité de l’utilisateur connecté. La passerelle relaie les exportations qu’elle reçoit à ce point de terminaison vers vos destinations
forward_to. Elle inclut le point de terminaison et les attributs lorsque vous définissez à la foistelemetry.forward_toetlisten.public_url. Claude Desktop exporte chaque signal avec un encodage :http/protobuf, ouhttp/jsonlorsque vous définissezOTEL_EXPORTER_OTLP_PROTOCOLou l’un de ses variantes par signal àhttp/jsondans l’envde la politique. Avant Claude Code v2.1.261 sur le serveur de passerelle, la réponse définissaithttp/jsonindépendamment, afin qu’un collecteur qui accepte uniquement protobuf rejette les exportations de Claude Desktop
disabledBuiltinTools, coworkEgressAllowedHosts ou le paramètre managedMcpServers propre de Claude Desktop dans le bloc desktop d’une politique, vous avez besoin de Claude Code v2.1.232 ou ultérieur sur le serveur de passerelle. Le managedMcpServers de Claude Desktop prend une valeur de tableau plutôt qu’un objet.
La passerelle omet les clés sans équivalent Claude Desktop, comme hooks et les règles de permission limitées comme Bash(npm *), de la réponse d’amorçage.
Ajoutez le bloc desktop optionnel aux côtés de cli pour définir les paramètres Claude Desktop directement. Écrivez les paramètres de la référence de configuration gérée de Claude Desktop en tant que noms de clés plats. Laissez de côté les clés que Claude Desktop lit uniquement à partir de MDM ou de fichiers locaux, comme bootstrapUrl ; la passerelle les rejette au démarrage. Avant v2.1.232, la passerelle acceptait une liste fixe de 11 clés de porte de fonctionnalité, comme chatTabEnabled et disableAutoUpdates, et rejetait chaque autre clé au démarrage. Avant v2.1.227, la passerelle rejetait également chatTabEnabled et chatAdvancedFileAnalysisEnabled au démarrage.
desktop au démarrage par rapport au schéma de configuration que Claude Desktop lui-même utilise, afin qu’une erreur apparaisse au démarrage de la passerelle en tant qu’erreur nommant la clé plutôt que d’atteindre chaque bureau connecté. La passerelle échoue au démarrage lorsqu’un bloc contient :
- Une clé inconnue
- Une clé reconnue dont la valeur Claude Desktop rejetterait ou supprimerait silencieusement, comme une valeur vide ou une sous-clé mal orthographiée à l’intérieur d’une entrée imbriquée. Avant v2.1.260, la passerelle supprimait silencieusement un champ mal orthographié à l’intérieur d’un objet imbriqué d’une entrée
managedMcpServersouorgPluginSettingsau lieu d’échouer au démarrage. - Une clé que la passerelle calcule elle-même : la connexion d’inférence, la liste des modèles et le relais OTLP. Configurez ceux-ci via
upstreams,modelset la sectiontelemetryforward_to. - Un alias hérité d’une clé actuelle. Dans l’erreur de démarrage, la passerelle nomme la clé canonique à écrire.
managedMcpServers sans transport, la passerelle démarre et enregistre un avertissement qui nomme le remplacement.
La passerelle valide un bloc desktop par rapport au schéma fourni avec sa version installée, comme elle le fait pour le bloc cli. Pour livrer un paramètre introduit par une version plus récente de Claude Desktop, mettez à niveau la passerelle en premier. Par exemple, userPluginMarketplacesEnabled et userPluginUploadsEnabled nécessitent Claude Code v2.1.260 ou ultérieur sur le serveur de passerelle et Claude Desktop 1.37937.0 ou ultérieur sur les machines des membres.
Si vous définissez orgPluginSettings dans le bloc desktop d’une politique, la passerelle le sert sous la forme de tableau que Claude Desktop 1.15200.0 et ultérieur lit. Les anciens bureaux ignorent le tableau et n’appliquent aucune politique d’outil de plugin, afin de mettre à jour les membres vers 1.15200.0 ou ultérieur avant de vous y fier.
La passerelle remplit les clés qu’un bloc desktop d’une politique ne définit pas à partir du bloc desktop de la capture-tout match: {}, de la même manière qu’elle remplit le bloc cli d’une politique à partir de la base. Si vous définissez disabledBuiltinTools ou builtinToolPolicy à la fois dans la base et dans une politique par rôle, la passerelle conserve la restriction de la base :
disabledBuiltinTools: la passerelle utilise l’union de la liste de la base et de la liste de la politiquebuiltinToolPolicy: si vous définissez un outil à une valeur autre queallowdans la base, la passerelle conserve cette valeur même si vous définissezallowpour le même outil dans une politique par rôle
banner entièrement, afin que si vous définissez banner.text dans une politique par rôle, la passerelle supprime le banner.backgroundColor de la base.
Si vous ne déployez pas Claude Desktop, laissez desktop complètement hors de vos politiques ; la passerelle retourne alors 404 de /user/bootstrap pour chaque utilisateur.
Précédence avec d’autres sources gérées
Si un appareil a également une politique livrée par MDM ou unmanaged-settings.json local, les paramètres livrés par la passerelle sont prioritaires. Précédence au sein du niveau géré sur la page des paramètres gérés dit quand les sources locales s’appliquent, et a les clés que Claude Code lit à partir de chaque source admin indépendamment de la source qu’il a sélectionnée, comme les clés de verrouillage du bac à sable, forceRemoteSettingsRefresh et la fusion env par variable. Un policyHelper configuré dans un profil MDM ou le fichier de paramètres gérés s’exécute uniquement lorsque la passerelle ne livre aucun paramètre ; l’entrée dit ce que sa sortie remplace.
Les hôtes d’intégration comme Claude Desktop peuvent fournir une politique via l’option SDK managedSettings. Paramètres parents à partir d’hôtes d’intégration dit quand Claude Code l’applique, et Restreindre les paramètres parents liste les paramètres de direction d’autorisation qui s’appliquent toujours sans les verrous allowManaged*Only.
Les politiques de passerelle s’appliquent à chaque invocation de Claude Code sur la machine, y compris les exécutions non interactives claude -p et les sessions générées par le SDK Agent. Si la passerelle est inaccessible au démarrage, les sessions connectées quittent avec une erreur plutôt que de s’exécuter sans leur politique.
telemetry
Le CLI envoie des métriques, des journaux et, lorsqu’ils sont activés, des traces à la passerelle, qui les relaie textuellement à chaque destination configurée. Les exportations utilisent OpenTelemetry Protocol (OTLP) sur HTTP. Pour ignorer le relais et faire exporter les sessions directement à votre collecteur, nommez le collecteur dans une politique. Consultez Surveillance de l’utilisation pour les métriques et événements que le CLI émet.
Le CLI horodate chaque exportation avec l’identité de l’utilisateur authentifié, lue à partir du JWT émis par la passerelle : les attributs user.id, user.email et user.groups. L’attribution du coût et de l’utilisation par développeur fonctionne donc sans configuration côté développeur.
Claude Desktop et les sessions Cowork connectées via la passerelle horodatent leur télémétrie avec user.email et user.groups aux côtés de enduser.id, afin que vous puissiez couvrir l’utilisation du terminal, du bureau et de Cowork avec une requête sur user.email ou user.groups. user.groups est la liste des groupes IdP séparée par des virgules.
La télémétrie du bureau et de Cowork porte également enduser.sub, la revendication sub que votre fournisseur d’identité émet pour l’utilisateur, qui reste la même lorsque l’e-mail d’un utilisateur change. Les sessions de terminal horodatent la même valeur sous user.id, afin qu’une requête qui correspond à enduser.sub par rapport à user.id du terminal couvre l’utilisation du terminal, du bureau et de Cowork d’un utilisateur ensemble. Sur les exportations du bureau et de Cowork, user.id est un identifiant anonyme, pas le sujet.
Comme toutes les données OpenTelemetry de Claude Code, ces attributs vont uniquement aux destinations que votre organisation configure, jamais à Anthropic.
Si la liste des groupes d’un utilisateur est plus longue que 255 caractères une fois codée en pourcentage, ou si un nom de groupe contient une virgule ou un signe égal, la passerelle laisse user.groups hors de la télémétrie du bureau et de Cowork de cet utilisateur plutôt que de la tronquer. Les sessions de terminal de cet utilisateur portent toujours la liste complète.
La passerelle laisse enduser.sub hors quand le sujet est plus long que 255 caractères une fois codé en pourcentage, ou contient un espace, un caractère en dehors de l’ASCII imprimable, ou l’un de , ; = \ " %. La télémétrie du bureau et de Cowork de cet utilisateur conserve ses autres attributs.
Vous avez besoin de Claude Code v2.1.265 ou ultérieur sur le serveur de passerelle pour user.email et user.groups sur la télémétrie du bureau et de Cowork, et Claude Desktop 1.24012 ou ultérieur sur la machine de chaque développeur pour user.groups.
Vous avez besoin de Claude Code v2.1.274 ou ultérieur sur le serveur de passerelle pour enduser.sub.
forward_to doit utiliser https://, avec une exception pour un collecteur sur l’interface de bouclage propre de la passerelle :
http://localhost:<port>passe la validation de configuration, mais la garde SSRF bloque chaque exportation avecECONNREFUSED_SSRFà moins que vous ne définissiezCLAUDE_GATEWAY_ALLOW_LOOPBACK=1dans l’environnement de la passerellehttp://127.0.0.1:<port>ouhttp://[::1]:<port>échoue au démarrage à moins que cette variable ne soit définie
HTTPS_PROXY est défini, la passerelle envoie les exportations via ce proxy.
Pour atteindre un collecteur interne directement, ajoutez-le à NO_PROXY par nom d’hôte ou par un domaine avec un point initial comme .internal.example.com, ce qui nécessite Claude Code v2.1.277 ou ultérieur sur le serveur de passerelle. Assurez-vous que la passerelle peut atteindre le collecteur sans le proxy. Une entrée sans point initial correspond uniquement à ce nom exact, pas aux noms en dessous. Les plages CIDR ne correspondent pas.
Avec sortie proxy uniquement activée, autorisez le collecteur dans le proxy à la place, car toute entrée NO_PROXY désactive la sortie proxy uniquement.
La télémétrie est désactivée dans le CLI par défaut. Lorsque vous définissez à la fois telemetry.forward_to et listen.public_url, la passerelle l’active pour les clients connectés en poussant six variables d’environnement via /managed/settings :
CLAUDE_CODE_ENABLE_TELEMETRY=1OTEL_METRICS_EXPORTER,OTEL_LOGS_EXPORTERetOTEL_TRACES_EXPORTER, chacun défini àotlpsi au moins une destinationforward_toactive ce signal et ànonesinonOTEL_EXPORTER_OTLP_ENDPOINT=<public_url>OTEL_EXPORTER_OTLP_PROTOCOL=http/protobuf
OTEL_RESOURCE_ATTRIBUTES.
Avant Claude Code v2.1.265 sur le serveur de passerelle, la passerelle poussait les trois sélecteurs d’exportateur en tant que otlp, y compris pour les signaux qu’aucune destination n’a activés.
Le point de terminaison poussé est construit à partir de l’URL publique, afin que les métriques et les journaux n’aient besoin d’aucune configuration OTEL de la part des développeurs ou des politiques.
Les développeurs connectés via /login ne peuvent pas rediriger les exportations avec leur propre configuration OTEL :
- Variables définies localement : Claude Code applique les variables poussées au niveau géré, afin que chacune remplace la valeur qu’un développeur définit pour elle localement.
- Points de terminaison configurés localement : avec l’exportation OTLP/HTTP activée, le CLI ignore tout point de terminaison configuré localement, que la passerelle ait poussé les variables de télémétrie ou non. Ses exportations vont à la passerelle à moins qu’une politique nomme votre collecteur comme point de terminaison.
forward_to pour un signal, la passerelle l’accepte et le rejette. Si les développeurs exportent déjà la télémétrie Claude Code vers l’un de vos collecteurs, ajoutez-le en tant que destination forward_to, avec les journaux ou les traces activés s’ils les exportent, afin qu’il continue à recevoir leurs données après qu’ils se connectent. Pour ignorer le relais à la place, nommez le collecteur dans une politique.
Les traces nécessitent également CLAUDE_CODE_ENHANCED_TELEMETRY_BETA=1 sur chaque client. Définissez-le dans le bloc env d’une politique gérée, car la passerelle ne le pousse pas. Les développeurs l’approuvent dans la même boîte de dialogue d’approbation de sécurité que le point de terminaison poussé déclenche déjà.
Définissez-le à 1 uniquement dans les politiques dont vous voulez que les groupes soient tracés. Une politique qui ne le définit pas hérite de la valeur de votre politique de capture-tout match: {} si cette politique en définit une, selon les règles de fusion. Pour empêcher les clients d’un groupe d’envoyer des traces même lorsqu’un développeur définit la variable localement, définissez-la à 0 dans la politique de ce groupe.
Les encodages OTLP protobuf et JSON sont tous deux relayés, et tout backend compatible OpenTelemetry fonctionne comme destination.
Ajouter vos propres étiquettes
Pour mettre des étiquettes fixes commeservice.namespace ou deployment.environment.name sur la télémétrie des sessions connectées via la passerelle, définissez telemetry.resource_attributes. Chaque étiquette est un attribut de ressource OpenTelemetry, et chaque destination reçoit les mêmes étiquettes.
Les sessions obtiennent les étiquettes uniquement lorsque vous définissez également telemetry.forward_to et listen.public_url. Cet exemple ajoute deux étiquettes :
- Les noms utilisent uniquement des lettres, des chiffres,
.,_et- - Les noms ne sont pas réservés. Comparés dans n’importe quelle casse de lettre, les noms réservés sont tout ce qui commence par
user.,enduser.ouidentity., plusservice.name,service.version,claude.deployment_mode,host.arch,os.type,os.versionetwsl.version - Les valeurs sont des ASCII imprimables non vides sans espace et aucun de
, ; = \ " % - Les valeurs sont au maximum 255 caractères tels que la passerelle les compte après codage en pourcentage, donc
/,:et@comptent chacun comme trois - Les valeurs sont du texte, donc citez un nombre,
trueoufalse
telemetry.resource_attributes. Une passerelle antérieure refuse de démarrer lorsqu’elle trouve la clé. Mettez à niveau chaque réplica avant d’ajouter la clé, et supprimez la clé avant de revenir en arrière vers une version antérieure.
Les sessions de terminal connectées via /login reçoivent les étiquettes en tant que OTEL_RESOURCE_ATTRIBUTES, poussées avec les autres variables de télémétrie. Si vous définissez OTEL_RESOURCE_ATTRIBUTES dans le bloc env d’une politique, les sessions de terminal que cette politique correspond obtiennent cette valeur à la place des étiquettes. Claude Desktop reçoit les étiquettes de la passerelle aux côtés de user.email et des autres attributs d’identité.
Claude Code copie également chaque étiquette sur chaque point de données de métrique, afin que vous puissiez filtrer les métriques par elle dans un backend qui n’indexe pas les attributs de ressource. Pour désactiver cette copie, consultez Contrôle de la cardinalité des métriques.
Exporter directement vers votre collecteur
Pour que les sessions connectées via/login envoient la télémétrie directement à votre collecteur au lieu de passer par le relais, définissez OTEL_EXPORTER_OTLP_ENDPOINT à l’URL de base https:// du collecteur dans le bloc env d’une politique gérée. Claude Code ajoute /v1/metrics, /v1/logs ou /v1/traces à l’URL que vous définissez, comme https://otel-collector.example.com:4318, et exporte chaque signal là-bas sur OTLP/HTTP. Nécessite Claude Code v2.1.265 ou ultérieur sur la machine de chaque développeur. Les clients antérieurs exportent via le relais.
Pour vous authentifier auprès du collecteur, définissez OTEL_EXPORTER_OTLP_HEADERS dans le même bloc env. Les sessions n’envoient jamais le jeton de session de passerelle du développeur à un collecteur nommé de cette façon.
Lorsque vous ajoutez ou modifiez ce point de terminaison dans une politique, Claude Code demande à chaque développeur de l’approuver dans la boîte de dialogue d’approbation de sécurité avant de l’appliquer dans une session interactive.
Claude Code vérifie le point de terminaison avant d’exporter un signal directement, et garde ce signal sur le relais lorsqu’une vérification échoue. Les vérifications incluent :
- Le point de terminaison provient de la passerelle elle-même. Si vous définissez la même variable dans un profil MDM ou un
managed-settings.jsonlocal, les exportations restent sur le relais. - L’URL utilise
https://, ouhttp://à une adresse de bouclage - L’URL se résout en un chemin se terminant par
/v1/<signal>, sans requête ni fragment. Claude Code construit ce chemin lui-même à partir de la variable générique. Il utilise une variable par signal commeOTEL_EXPORTER_OTLP_METRICS_ENDPOINTtelle qu’écrite, afin d’inclure le chemin complet là-bas. - L’URL n’est pas l’hôte propre de la passerelle. Un point de terminaison adressé à la passerelle conserve le chemin du relais et son jeton de session.
- Ni vous ni le développeur n’avez configuré
otelHeadersHelperdans aucune source de paramètres. Avec un helper configuré, chaque signal reste sur le relais.
OTEL_*_EXPORTER.
Le point de terminaison seul n’active pas l’exportation, afin de définir également les variables qui le font, à moins que la passerelle ne les pousse déjà :
- Si la passerelle pousse déjà les variables de télémétrie, elles couvrent l’activation, les sélecteurs et le protocole, et votre point de terminaison explicite remplace la valeur
<public_url>poussée. Définissez un sélecteurOTEL_*_EXPORTERàotlpvous-même uniquement pour un signal qu’aucune destinationforward_ton’active. - Si ce n’est pas le cas, définissez également
CLAUDE_CODE_ENABLE_TELEMETRY=1, les sélecteursOTEL_*_EXPORTERetOTEL_EXPORTER_OTLP_PROTOCOL=http/protobuf.
Lorsqu’une destination échoue
La passerelle ne met pas en mémoire tampon, ne réessaie pas ou ne stocke pas la télémétrie, afin qu’elle rejette une exportation qui n’atteint pas une destination plutôt que de la livrer tard. Chaque destination réussit ou échoue par elle-même, et le client exportateur reçoit une réponse de succès de toute façon, afin qu’une livraison échouée n’apparaisse que dans le journal de la passerelle. Après cinq livraisons consécutives échouées à une destination, la passerelle met en pause le transfert vers elle en étirements de 30 secondes, enregistrant chaque pause, jusqu’à ce qu’une livraison réussisse. Toute réponse d’erreur, délai d’attente ou erreur de connexion compte comme une livraison échouée, sauf400, 413, 415, 422 et 431, qui signifient que le collecteur a refusé la charge utile de cette exportation comme mal formée ou trop grande.
Une charge utile refusée n’avance ni ne réinitialise le compteur d’échecs : la passerelle continue de transférer vers la destination et enregistre un avertissement la nommant et le statut, au premier refus de la destination et tous les centièmes après.
Réglage HTTP
Quatre blocs optionnels de niveau supérieur,access_control, limits, timeouts et rate_limits, règlent la surface HTTP. Les valeurs par défaut conviennent à la plupart des déploiements.
Si vous laissez les deux listes
access_control vides, ce qui est la valeur par défaut, la passerelle sert toute adresse client, afin que seul votre réseau restreigne qui peut l’atteindre. C’est important car une passerelle peut pousser des paramètres gérés qui exécutent des commandes sur les machines des développeurs.
Tandis que allow_cidrs est vide, la passerelle avertit à deux endroits, sans changer la façon dont elle répond à toute demande :
- Au démarrage : un avertissement dans le journal opérationnel recommande d’autoriser uniquement les plages privées
10.0.0.0/8,172.16.0.0/12,192.168.0.0/16,100.64.0.0/10,127.0.0.0/8,::1/128etfc00::/7, plus toute autre plage interne à partir de laquelle vos développeurs se connectent. Si vous liez la passerelle à une adresse de bouclage et ne définissez nitrusted_proxiesnipublic_url, comme dans le développement local, l’avertissement n’apparaît pas. - À l’exécution : la première fois qu’une demande arrive d’une adresse en dehors de ces plages privées, la passerelle enregistre un avertissement et émet un événement d’audit
access.public_clientportant l’adresse IP du client. Les deux se déclenchent une fois par processus. Les adresses lien-local,169.254.0.0/16etfe80::/10, ne comptent pas comme publiques. La passerelle répond à/healthzet/readyzavant cette vérification, afin que les sondes de santé à partir de plages publiques ne la déclenchent pas.
listen.trusted_proxies, la passerelle voit l’adresse du relais, qui est généralement privée, afin que ni l’avertissement d’exécution ni une liste d’autorisation privée ne l’attrape.
Derrière un tel front-end, définissez listen.trusted_proxies en premier afin que la passerelle voie les vraies adresses client, et gardez la passerelle et tout ce qui se trouve devant elle inaccessible à partir d’Internet public indépendamment.
load_test_mode
Le bloc load_test_mode vous permet de tester la charge d’une passerelle sans appeler un fournisseur de modèles. Tandis qu’il est activé, la passerelle construit et signe chaque demande de fournisseur comme d’habitude, la rejette au lieu de l’envoyer, et diffuse une réponse en conserve via son chemin de réponse normal. La réponse est un texte de remplissage qui commence par une phrase disant qu’elle est en conserve.
Nécessite Claude Code v2.1.282 ou ultérieur sur le serveur de passerelle. Les versions antérieures refusent de démarrer lorsque la clé est trouvée. Mettez à niveau chaque réplica avant d’ajouter le bloc, et supprimez le bloc avant de revenir en arrière.
L’exemple ci-dessous active le mode avec les valeurs par défaut, une réponse d’environ 750 jetons de texte diffusée sur environ 10 secondes :
Un test de charge dans ce mode couvre la passerelle, votre Postgres et tout ce qui se trouve devant la passerelle. Il ne couvre pas les limites, la vitesse ou le chemin réseau du fournisseur.
Aucune demande de modèle n’est envoyée au fournisseur, afin que le CPU d’une réplica par demande soit une estimation et se lit plus bas qu’en production, qui chiffre également son trafic vers le fournisseur. Confirmez un nombre de réplicas avec un petit pilote contre le vrai fournisseur. Avant v2.1.283, l’estimation se lit beaucoup plus bas.
Tandis que le mode est activé, une demande peut porter un en-tête
x-load-test-user contenant un nombre entier de jusqu’à sept chiffres. La passerelle compte chaque nombre comme un développeur distinct avec l’e-mail et les groupes du développeur dont le jeton est venu avec la demande.
Donnez au déploiement de test de charge sa propre base de données vide, car la passerelle refuse de démarrer avec le mode activé par rapport à une base de données dans laquelle un développeur a déjà dépensé quelque chose.
Exemple complet
Cette configuration de référence complète exerce chaque section centrale ; les blocs de tuning HTTP conservent leurs valeurs par défaut. Copiez-la, supprimez ce dont vous n’avez pas besoin, et remplissez vos valeurs. La configuration dans le Démarrage rapide est une version minimale de celle-ci.gateway.yaml
Paramètres gérés côté client
Tout ce qui précède configure le serveur de passerelle. Pointer les machines des développeurs vers celui-ci est configuré séparément, sur chaque appareil, via les paramètres gérés de Claude Code. La passerelle ne peut pas pousser les clés de connexion elle-même, car ce sont elles qui disent au client où se trouve la passerelle. Pour le CLI, définissez ces clés dans lemanaged-settings.json par système d’exploitation. Les deux clés de connexion acheminent chaque /login du développeur vers votre passerelle :
parentSettingsBehavior: "merge" maintient le fonctionnement de la livraison de la liste d’autorisation de sortie de Claude Desktop vers ses sessions Claude Code intégrées ; Deliver policy to Claude Desktop sessions explique le mécanisme et où l’opt-in doit se situer.
Déployez le fichier managed-settings.json sur chaque appareil, généralement via votre plateforme MDM. Le chemin du fichier diffère selon la plateforme. Voir où chaque mécanisme stocke la stratégie.
Par défaut, une stratégie de registre sur Windows ou un plist de préférences gérées sur macOS remplace le fichier managed-settings.json plutôt que de le fusionner avec lui, à l’exception des clés d’exception et des vérifications entre sources ci-dessus. Les trois clés de cet extrait suivent la règle de source de priorité la plus élevée, donc les flottes qui livrent la stratégie via Group Policy ou les profils de configuration doivent placer les trois dans ce mécanisme à la place.
Pour Claude Desktop, définissez la clé bootstrapUrl dans la propre configuration gérée de Claude Desktop sur <listen.public_url>/user/bootstrap. Le flux de connexion et la stratégie par groupe correspondent alors à ceux du CLI une fois qu’une stratégie opte pour le serveur avec une clé desktop ; sans l’opt-in, /user/bootstrap retourne 404. Voir Claude Desktop overlay pour la moitié côté serveur.
Claude Code honore forceLoginGatewayUrl, gatewayInternalNetworks, et la valeur "gateway" de forceLoginMethod uniquement à partir d’une source gérée sur la machine : managed-settings.json, le plist macOS ou le registre HKLM Windows, ou un assistant de stratégie. Un développeur les définissant dans son propre ~/.claude/settings.json n’a aucun effet, et il en va de même pour les définir dans la charge utile de la passerelle.
Connexes
- Aperçu de la passerelle Claude apps : démarrage rapide et connexion des développeurs
- Guide de déploiement : configuration IdP, image de conteneur, Kubernetes et Cloud Run, et opérations
- Limites de dépenses : plafonds par développeur et API Admin