Entreprise — Inscription et parc
Un exemplaire unique de Bromure Agentic Coding est un outil personnel. À l'échelle d'une équipe, un administrateur a souvent besoin de répondre à des questions organisationnelles : quels Mac exécutent l'application, quels paquets les agents importent, combien de jetons sont dépensés, et si un espace de travail a déclenché un détecteur d'injection de prompt. L'inscription auprès de Bromure Enterprise Manager — un espace de travail sur bromure.io — offre exactement cette visibilité sur le parc, en diffusant les métadonnées de session (jamais les prompts, jamais les secrets) depuis chaque Mac inscrit.
Ce chapitre couvre l'inscription d'un Mac, l'identité mTLS qui authentifie ses envois, précisément ce qui est envoyé et ce qui ne l'est pas, l'exclusion par espace de travail, la vue de parc de l'administrateur, la gestion du consentement à distance, et la désinscription. Le traçage local — la piste d'audit sur le Mac que l'inscription ne remplace pas — est traité dans Traçage ; l'inventaire des paquets qui alimente le reporting d'entreprise est Protection de la chaîne d'approvisionnement.
Deux systèmes indépendants
Le mot « parc » recouvre deux fonctionnalités qu'il vaut la peine de distinguer, car elles ne partagent aucune racine de confiance :
- L'inscription bromure.io (ce chapitre) enregistre un Mac auprès de votre espace de travail et diffuse les métadonnées de session vers le cloud, authentifiées par un certificat TLS mutuel émis par l'autorité de certification de votre organisation.
- Le client riche (Accès à distance) permet à un Mac de refléter les instances en cours d'exécution d'autres Mac via SSH, authentifiées par des clés d'hôte SSH et des clés publiques inscrites.
Aucun ne dépend de l'autre. Vous pouvez vous inscrire sans jamais utiliser le client riche, refléter des hôtes sans en inscrire aucun, ou faire les deux. La pile mTLS de l'inscription sert uniquement à la télémétrie de parc ; le miroir du client riche s'appuie sur SSH — les deux ne sont délibérément pas fusionnés dans cette version.
Inscription avec Bromure Enterprise Manager
L'inscription repose sur un code. Un administrateur génère un code d'inscription à usage unique composé de six mots sur la page de détail de votre utilisateur dans bromure.io, limité à l'application agentic-coding. Vous collez ce code dans l'application (ou dans la CLI), et le Mac s'enregistre en tant qu'installation de l'espace de travail.
Depuis l'application
- Obtenez un code d'inscription de six mots auprès de votre administrateur.
- Ouvrez Bromure Agentic Coding (le menu portant le nom de l'application) → S'inscrire à bromure.io… — l'élément se trouve juste sous Rechercher les mises à jour…. Une fenêtre intitulée Inscription bromure.io s'ouvre.
- Collez le code dans le champ Code d'inscription (texte indicatif :
six-word-enrollment-code). - Modifiez éventuellement le Nom de l'appareil (il correspond par défaut au nom de ce Mac ; texte d'aide : « Affiché à votre administrateur pour qu'il puisse reconnaître ce Mac. »).
- Développez éventuellement Avancé et définissez l'URL du serveur (facultatif) pour un serveur auto-hébergé ou de préproduction.
- Cliquez sur S'inscrire (Retour) ou sur Annuler (Échap).
La feuille indique clairement ce que l'inscription active : elle « envoie les métadonnées de session (outils, fichiers, commandes, consommation de jetons) à votre espace de travail afin que les administrateurs puissent examiner l'activité. Les espaces de travail en mode privé ne diffusent jamais rien. » En cas de succès, l'installation apparaît sur la page /agentic-coding/installs de l'administrateur.
Remarque : Certains textes d'aide dans l'application indiquent encore « Ouvrez Fenêtre → S'inscrire à bromure.io… », mais l'élément se trouve en réalité dans le menu de l'application (portant son nom) — c'est l'emplacement de référence. Un code généré pour une autre application Bromure est rejeté avec le message Code was issued for app '…', expected 'agentic-coding'., et une seconde inscription échoue avec Bromure Agentic Coding is already enrolled.
Depuis la CLI
Les flux de l'interface graphique ont des équivalents CLI exacts, regroupés sous Enterprise features dans bromure-cli --help et partageant le même stockage sur disque. Ils sont pratiques pour un provisionnement scripté ou une inscription via une session SSH existante.
| Commande | Ce qu'elle fait |
|---|---|
bromure-cli enroll --code <code> [--server-url <url>] [--device-name <name>] | Inscrit ce Mac. Affiche l'e-mail, l'espace de travail, l'ID d'installation, le serveur et l'appareil en cas de succès ; se termine avec un code non nul en cas d'échec. |
bromure-cli enrollment-status | Affiche l'état actuel. Lorsqu'il n'est pas inscrit, il affiche not enrolled et se termine avec 0, de sorte que l'automatisation peut sonder en toute sécurité. |
bromure-cli unenroll [--force] | Déconnecte (voir Révocation, désinscription et retrait). |
Les valeurs par défaut correspondent à l'interface graphique : URL du serveur https://bromure.io/api (remplaçable via BROMURE_MANAGED_URL ou la clé UserDefaults managed.serverURL), nom de l'appareil correspondant au nom d'hôte localisé du Mac.
L'identité d'installation mTLS
Les envois de télémétrie ne transportent pas de jeton — ils s'authentifient à l'aide d'un certificat client. Lors de l'inscription (et à chaque renouvellement), l'application génère une nouvelle clé RSA-2048, construit une demande de signature de certificat avec le nom commun bromure-install-<installId>, et la fait signer par l'autorité de certification de votre organisation via le serveur géré. Les certificats feuille et CA sont stockés sous forme de fichiers PEM inspectables ; la clé privée réside dans le trousseau macOS.
Au moment de la requête, le certificat et la clé sont regroupés dans un PKCS#12 en mémoire et importés sans toucher au trousseau, de sorte qu'aucune entrée dans Trousseaux d'accès ni aucune invite de déverrouillage n'apparaît jamais pour l'identité elle-même. Le propre certificat serveur du point de terminaison d'analytique est validé par rapport au magasin racine système normal.
Remarque : La demande de certificat feuille pendant l'inscription est au mieux. Si l'autorité de certification de l'organisation n'est pas encore configurée, l'inscription réussit tout de même et le certificat est récupéré lors du premier signal de présence.
Le panneau d'état de l'inscription
Une fois inscrit, le même élément de menu se renomme en Inscription bromure.io… et ouvre un panneau d'état (titre inscription bromure.io) au lieu du formulaire de saisie. Il affiche les lignes Espace de travail, Utilisateur, Appareil, Serveur, Inscrit (date) et Certificat — toutes sélectionnables. La ligne Certificat indique Valide jusqu'au <date> ou, s'il a expiré, Expiré — renouvellement automatique.
Deux boutons se trouvent en bas : Renouveler le certificat force un nouveau certificat feuille ; Se déconnecter désinscrit (destructif — voir ci-dessous). Les problèmes de santé apparaissent sous forme de bannière d'avertissement orange :
| Bannière | Signification | Que faire |
|---|---|---|
| Inscription révoquée | « Votre administrateur a révoqué cette installation. Déconnectez-vous et réinscrivez-vous avec un nouveau code pour reprendre le mode géré. » | Déconnectez-vous et inscrivez-vous avec un nouveau code. |
| Inscription plus acceptée | « Le serveur a rejeté les identifiants de cette installation — ils ont peut-être expiré ou été réinitialisés. » | Déconnectez-vous et inscrivez-vous avec un nouveau code. |
Un Renouveler le certificat réussi efface un état de rejet d'identifiant obsolète, mais il n'efface jamais un état révoqué — seule une réinscription le fait.
Signal de présence et renouvellement du certificat
Pendant que l'application s'exécute inscrite, une tâche d'arrière-plan envoie un signal de présence au serveur de l'espace de travail toutes les 10 minutes (et une fois immédiatement au lancement et à l'inscription), ce qui maintient à jour l'horodatage de dernière présence côté administrateur. La réponse du serveur fait autorité pour la santé : une révocation bascule la bannière ; une réponse propre efface les états défectueux antérieurs. Seul un 401/403 sur le jeton porteur du signal de présence fait passer la santé à « jeton rejeté » — les erreurs transitoires (hors ligne, 5xx) ne la modifient jamais.
Chaque tic du signal de présence vérifie également le certificat feuille mTLS et le renouvelle chaque fois qu'il est manquant ou à moins de 72 heures de son expiration. Le renouvellement est authentifié par le jeton porteur plutôt que par le certificat feuille, de sorte que même un certificat déjà expiré se rétablit au lancement suivant.
Avertissement : Un Mac laissé fermé au-delà de l'expiration de son certificat échoue silencieusement dans ses envois gérés jusqu'à ce que le lancement suivant renouvelle le certificat feuille. C'est transparent en usage normal, mais utile à savoir si une machine reste éteinte longtemps.
Ce qui est envoyé — et ce qui ne l'est pas
Les sessions inscrites et non privées diffusent des événements cloud structurés — un enregistrement chacun : ID de session, ID d'espace de travail, horodatage, type d'événement et une petite charge utile JSON. Les sessions désignent ici des fenêtres d'activité, et non des cycles de vie de VM : un ID de session par espace de travail par fenêtre d'activité, renouvelé après 20 minutes d'inactivité.
| Événement | Points clés de la charge utile |
|---|---|
session.start / session.end | Début et fin d'une fenêtre d'activité ; session.end porte une raison (par ex. idle_timeout) et est antidaté à la limite d'inactivité. |
llm.request | Fournisseur, hôte, chemin, code d'état, latence, modèle, et nombres de jetons d'entrée/sortie/cache. Les sessions WebSocket en temps réel ajoutent le transport et l'ID de réponse. |
tool.use | Nom de l'outil et un résumé de l'entrée (tronqué à 240 caractères). |
file.read / file.write | Chemin du fichier et l'outil qui l'a touché. |
command.run | Le texte de la commande (tronqué à 500 caractères) et l'outil. |
credential.token_swap | Hôte et chemin, et courts aperçus des jetons factice et réel — jamais les jetons eux-mêmes. |
credential.ssh_sign | Libellé de la clé, empreinte SHA-256 et type de clé (gérée / importée). |
credential.aws_sign | Méthode, hôte, chemin, service, région, et une clé d'accès masquée. |
supply_chain.fetch | Écosystème, paquet, version, type de requête, résultat et raison. |
vm.disk_reset | La raison et les versions d'image de base concernées. |
prompt_injection.detection | Détecteur, méthode, action, hôte, source, score, signaux, ID d'utilisation d'outil, et l'intégralité de l'extrait signalé (jusqu'à 20 000 caractères). |
L'état de la diffusion est visible dans chaque fenêtre de session et reflété dans le reporting de parc que voit un administrateur.
Ce qui ne quitte jamais le Mac
C'est le point sur lequel il faut être précis. Le flux est constitué de métadonnées ; le contenu de votre travail reste local. Bromure n'envoie jamais :
- Les prompts bruts de l'utilisateur ou le corps des réponses du modèle.
- Les valeurs de secret. Les événements d'identifiant ne portent que des aperçus masqués ou des empreintes — les octets réels des clés ne quittent jamais le Mac.
- Quoi que ce soit provenant d'un espace de travail en mode privé (voir ci-dessous), et absolument rien lorsque l'appareil n'est pas inscrit.
Les événements en mémoire tampon sont conservés uniquement en mémoire ; une fermeture forcée abandonne tout ce qui n'a pas encore été vidé, et il n'existe aucune file d'attente de réessai sauvegardée sur disque. Cela est accepté par conception — la télémétrie est au mieux, jamais au détriment de votre travail.
Avertissement : Il existe une exception délibérée à la règle des métadonnées uniquement :
prompt_injection.detectionenvoie l'intégralité de l'extrait signalé (jusqu'à 20 000 caractères), afin qu'un administrateur puisse voir exactement ce que l'agent s'apprêtait à lire. Il s'agit de contenu, et non de métadonnées — le compromis est qu'une tentative d'injection de prompt est précisément ce que les équipes de sécurité doivent inspecter mot pour mot. Tout le reste demeure aperçus, chemins, décomptes et masques. Voir Protection contre l'injection de prompt pour ce qui déclenche une détection.
Regroupement et livraison
Les événements sont regroupés en mémoire et envoyés au point de terminaison d'ingestion d'analytique, authentifiés uniquement par le certificat feuille mTLS — aucun jeton porteur n'accompagne les données de télémétrie. La mémoire tampon se vide toutes les 5 secondes, se vide automatiquement à 200 événements en attente, et envoie au maximum 500 événements par requête. Lors d'une panne prolongée, la mémoire tampon est réduite aux événements les plus récents (les plus anciens sont abandonnés) plutôt que de croître sans limite ; un vidage échoué réessaie le même lot au tic suivant.
Mode privé
La diffusion est une exclusion par espace de travail. Le commutateur Mode privé (icône d'œil barré) dans l'éditeur d'un espace de travail maintient l'activité de cet espace de travail entièrement locale : aucune métadonnée n'est diffusée, l'indicateur de la barre de titre disparaît pour lui, et la liste des sessions de l'administrateur n'en voit rien. L'Inspecteur de traces local n'est pas affecté — il continue d'enregistrer selon son propre niveau de trace. Le commutateur est désactivé (diffusion activée) pour chaque espace de travail, et n'apparaît que sur les Mac inscrits, car il ne ferait rien autrement.
Le mode privé se trouve avec les paramètres de Traçage dans l'éditeur d'espace de travail. Sur un Mac non inscrit, le commutateur est tout simplement absent, c'est pourquoi le volet ci-dessous n'affiche que le sélecteur de trace :
Les événements sont filtrés au moment de l'émission — le trafic en mode privé n'entre même jamais dans la mémoire tampon d'envoi.
Astuce : Le mode privé est le bon commutateur lorsque vous utilisez une clé d'API personnelle dans un espace de travail et que vous ne voulez pas que cette activité soit visible pour les administrateurs de votre organisation. Il ne change rien à la piste d'audit locale.
L'indicateur de diffusion
Chaque fois qu'un Mac est inscrit et qu'un espace de travail n'est pas en mode privé, un point rouge pulsant de style enregistrement apparaît dans la barre d'outils de cette fenêtre de session (et sous forme de point sur les lignes de la barre latérale des fenêtres unifiées). Son infobulle indique « Les métadonnées de session sont envoyées à bromure.io. Basculez le mode privé de l'espace de travail pour arrêter la diffusion. » et son étiquette d'accessibilité est Diffusion vers bromure.io. Le point est purement informatif et est masqué lorsque l'appareil n'est pas inscrit ou en mode privé.
Enregistrement de l'IP de sortie
Les installations inscrites envoient également un minuscule ping authentifié par mTLS au point de terminaison /register-ip du service d'analytique toutes les 60 secondes (et une fois au lancement et à l'inscription), afin que les enregistrements de l'espace de travail reflètent l'IP publique actuelle du Mac. Il est ignoré silencieusement lorsque l'appareil n'est pas inscrit. Le point de terminaison par défaut est https://analytics.bromure.io/register-ip, remplaçable via BROMURE_AC_REGISTER_IP_URL ou la clé UserDefaults managed.acRegisterIPURL.
Inventaire de la chaîne d'approvisionnement et récapitulatifs de consommation de jetons
Deux des types d'événements diffusés sont ce qui rend le reporting de niveau entreprise utile à l'échelle d'une équipe entière.
- Inventaire de la chaîne d'approvisionnement. Chaque récupération de métadonnées et d'artefact émet un événement
supply_chain.fetchportant l'écosystème, le paquet, la version, le type de requête, le résultat (allowed,rewritten,blockedoustripped) et la raison. L'inscription seule donne aux administrateurs un inventaire à l'échelle de l'organisation de chaque paquet que chaque agent a importé — même sur des espaces de travail dont toutes les couches d'application de la chaîne d'approvisionnement sont désactivées, puisque l'observation est découplée de l'application. Le versant application est documenté dans Protection de la chaîne d'approvisionnement. - Récapitulatifs de consommation de jetons. Chaque événement
llm.requestporte le modèle, les nombres de jetons d'entrée et de sortie, ainsi que les nombres de création et de lecture de cache. Agrégés sur un parc, ceux-ci deviennent des rapports de dépense par utilisateur, par espace de travail et par modèle sans qu'aucun contenu de prompt ou de réponse ne soit jamais envoyé. Le pendant local — la comptabilité de jetons par requête que vous pouvez lire sur votre propre Mac — se trouve dans Traçage.
La vue de parc
Côté bromure.io, chaque Mac inscrit apparaît comme une ligne sur la page /agentic-coding/installs de l'espace de travail, identifié par son ID d'installation et affichant le nom d'appareil que vous avez défini, l'utilisateur et un horodatage de dernière présence maintenu à jour par le signal de présence de 10 minutes. De là, un administrateur examine les métadonnées de session diffusées, l'inventaire de la chaîne d'approvisionnement, les récapitulatifs de consommation de jetons et les détections d'injection de prompt pour l'ensemble du parc.
Ceci est distinct de la notion de « parc » du client riche — refléter plusieurs hôtes distants à la fois via SSH — qui est traitée dans Accès à distance. Les deux ne partagent jamais de racine de confiance.
Gestion du consentement à distance
Lorsqu'une session d'espace de travail est attachée de manière interactive via la CLI ou SSH — sans fenêtre d'interface graphique au premier plan — l'application ne peut pas afficher de boîte de dialogue. Au lieu de cela, les quatre courtiers de consentement d'homme du milieu rendent leurs questions sous forme de menus numérotés sur le terminal de l'utilisateur attaché :
| Invite | Choix |
|---|---|
Utilisation d'identifiant — Allow "<workspace>" to use <credential>? | Autoriser pendant 1 heure / Autoriser pendant 5 minutes / Autoriser pour le reste de la session / Ne pas autoriser |
Contournement de la chaîne d'approvisionnement — Pass through <package> from workspace …? | Autoriser pendant 15 minutes / Autoriser une fois / Autoriser pour le reste de la session / Ne pas autoriser |
Écriture de garde-fou — Allow write on … from workspace …? | (les quatre mêmes que ci-dessus) |
Injection de prompt — Possible <detector> in … (affiche jusqu'à 1 500 caractères du texte signalé) | Bloquer cette requête / Autoriser cette requête |
La propriété cruciale est l'endroit où l'invite est rendue : du côté hôte de la pompe du terminal. La VM invitée ne voit jamais que l'autre extrémité de la connexion, de sorte qu'un invité compromis ne peut ni lire l'invite ni injecter une réponse. Si plusieurs clients s'attachent au même espace de travail, l'attache interactive la plus récente reçoit les invites (« la plus récente attache l'emporte »).
Avertissement : Ces invites échouent en toute sécurité. Aucune attache active, un délai d'attente (120 secondes par défaut), un rejet ou un détachement en cours d'invite se résolvent tous en refus — et, pour l'injection de prompt, en blocage. Une alerte d'échec d'authentification de registre est réduite à une ligne de journal pour les sessions attachées de manière interactive, puisqu'il n'y a pas d'interface graphique pour l'afficher. Les chemins d'interface graphique pour ces mêmes décisions sont couverts dans Identifiants, Protection de la chaîne d'approvisionnement et Protection contre l'injection de prompt.
Révocation, désinscription et retrait
Il existe deux façons pour une installation de quitter le parc, et elles font des choses différentes.
Désinscription (locale). Cliquez sur Se déconnecter dans le panneau d'état de l'inscription, ou exécutez bromure-cli unenroll. La CLI demande Sign out of <org> (<email>)? [y/N] sauf si vous passez --force, et affiche not enrolled — nothing to do (code de sortie 0) lorsqu'il n'y a rien à supprimer. La déconnexion supprime tout le matériel d'inscription local — install.json, leaf.crt, ca.crt, leaf.serial et le fichier de santé — retire le jeton porteur et toutes les clés privées de certificat feuille du trousseau, purge l'identité mTLS mise en cache, abandonne toute télémétrie en mémoire tampon, et arrête les tâches de signal de présence et d'enregistrement d'IP. L'application revient à l'état Non inscrit, et la fenêtre d'état bascule à nouveau vers le formulaire d'inscription afin que vous puissiez immédiatement vous réinscrire avec un code différent.
Révocation (côté serveur). Un administrateur révoque l'installation sur bromure.io. Sur le Mac, le signal de présence suivant fait apparaître la bannière Inscription révoquée et les envois gérés s'arrêtent.
Avertissement : La déconnexion est purement locale — aucun appel au serveur n'est effectué. Un administrateur mettant hors service un appareil doit révoquer l'installation côté serveur ; sinon, la ligne d'installation (désormais inactive) persiste sur la page de parc jusqu'à ce qu'elle cesse d'envoyer des signaux de présence. Pour retirer complètement un Mac, révoquez-le dans l'espace de travail et déconnectez-vous sur l'appareil.
Référence
L'état de l'inscription réside sous ~/Library/Application Support/BromureAC/managed/ : install.json (ID d'installation, slug d'espace de travail, utilisateur, URL du serveur, nom d'appareil, date d'inscription), leaf.crt et ca.crt (PEM), leaf.serial (un pointeur vers l'entrée de trousseau contenant la clé du certificat feuille actuel), et health (ok / tokenRejected / revoked). Dans le trousseau macOS, le service io.bromure.agentic-coding.managed-install contient le jeton porteur install-token et une entrée leaf-cert-key-<serialHex> par numéro de série de certificat émis (cet appareil uniquement, lorsque déverrouillé).
Le client contacte trois routes du serveur géré et un point de terminaison d'ingestion :
POST {server}/v1/enroll (code redemption)
POST {server}/v1/installs/{installId}/heartbeat (Bearer)
POST {server}/v1/installs/{installId}/cert (Bearer + CSR PEM)
POST {ingest URL} {"events":[…]} (mTLS, no bearer)
| Intervalle / limite | Valeur |
|---|---|
| Signal de présence | toutes les 10 minutes |
| Enregistrement de l'IP de sortie | toutes les 60 secondes |
| Seuil de renouvellement du certificat feuille | 72 heures avant l'expiration |
| Vidage des événements | toutes les 5 secondes (ou à 200 en attente) |
| Nombre max d'événements par lot | 500 |
| Renouvellement de session par inactivité | 20 minutes |
| Délai de consentement à distance | 120 secondes |
| Limite de l'extrait d'injection de prompt | 20 000 caractères |
Les remplacements de serveur et de point de terminaison (sans interface graphique) sont BROMURE_MANAGED_URL (ou managed.serverURL, par défaut https://bromure.io/api), BROMURE_AC_INGEST_URL (ou managed.acIngestURL, par défaut https://analytics.bromure.io/ac-ingest), et BROMURE_AC_REGISTER_IP_URL (ou managed.acRegisterIPURL). La référence complète des commandes se trouve dans Automatisation et la CLI.