Empresa — Inscrição e frota
Uma única cópia do Bromure Agentic Coding é uma ferramenta pessoal. Numa equipa, um administrador precisa frequentemente de responder a questões organizacionais: que Macs estão a executar a aplicação, que pacotes os agentes estão a trazer, quantos tokens estão a ser gastos e se algum espaço de trabalho acionou um detetor de injeção de prompt. A inscrição com o Bromure Enterprise Manager — um espaço de trabalho em bromure.io — proporciona exatamente essa visibilidade da frota, transmitindo metadados de sessão (nunca prompts, nunca segredos) a partir de cada Mac inscrito.
Este capítulo aborda a inscrição de um Mac, a identidade mTLS que autentica os seus envios, exatamente o que é e o que não é enviado, a exclusão por espaço de trabalho, a vista da frota do administrador, a gestão do consentimento remoto e a saída da frota. O rastreio local — o registo de auditoria no próprio Mac que a inscrição não substitui — é abordado em Rastreio; o inventário de pacotes que alimenta os relatórios empresariais é a Proteção da cadeia de fornecimento.
Dois sistemas independentes
A palavra "frota" abrange duas funcionalidades que vale a pena manter distintas, porque não partilham qualquer raiz de confiança:
- A inscrição em bromure.io (este capítulo) regista um Mac no seu espaço de trabalho e transmite metadados de sessão para a cloud, autenticados por um certificado TLS mútuo emitido pela CA da sua organização.
- O cliente nativo (Acesso remoto) permite que um Mac espelhe as instâncias em execução de outros Macs através de SSH, autenticadas por chaves de anfitrião SSH e chaves públicas inscritas.
Nenhum depende do outro. Pode inscrever-se sem nunca utilizar o cliente nativo, espelhar anfitriões sem inscrever nenhum deles, ou fazer ambos. A pilha mTLS da inscrição é apenas telemetria da frota; o espelhamento do cliente nativo confia no SSH — os dois não são deliberadamente fundidos nesta versão.
Inscrição com o Bromure Enterprise Manager
A inscrição é baseada em código. Um administrador cria um código de inscrição de utilização única, de seis palavras, na página de detalhes do seu utilizador em bromure.io, com âmbito para a aplicação agentic-coding. Cola esse código na aplicação (ou na CLI) e o Mac regista-se como uma instalação do espaço de trabalho.
A partir da aplicação
- Obtenha um código de inscrição de seis palavras junto do seu administrador.
- Abra Bromure Agentic Coding (o menu com o nome da aplicação) → Enroll in bromure.io… — o item fica diretamente abaixo de Check for Updates…. Abre-se uma janela intitulada bromure.io Enrollment.
- Cole o código no campo Código de inscrição (marcador de posição:
six-word-enrollment-code). - Opcionalmente, edite Nome do dispositivo (assume por predefinição o nome deste Mac; texto de ajuda: "Mostrado ao seu administrador para que possa reconhecer este Mac.").
- Opcionalmente, expanda Avançado e defina URL do servidor (opcional) para um servidor auto-hospedado ou de teste.
- Clique em Inscrever (Return) ou Cancelar (Esc).
A folha indica claramente o que a inscrição ativa: "envia metadados de sessão (ferramentas, ficheiros, comandos, utilização de tokens) para o seu espaço de trabalho, para que os administradores possam rever a atividade. Os espaços de trabalho em modo privado nunca transmitem." Em caso de sucesso, a instalação aparece na página /agentic-coding/installs do administrador.
Nota: Algum texto de sugestão dentro da aplicação ainda diz "Open Window → Enroll in bromure.io…", mas o item encontra-se de facto no menu da aplicação (com o nome da aplicação) — essa é a localização autoritativa. Um código criado para uma aplicação Bromure diferente é rejeitado com Code was issued for app '…', expected 'agentic-coding'., e uma segunda tentativa de inscrição falha com Bromure Agentic Coding is already enrolled.
A partir da CLI
Os fluxos da interface gráfica têm equivalentes exatos na CLI, agrupados em Enterprise features em bromure-cli --help e partilhando o mesmo armazenamento em disco. São úteis para o aprovisionamento por scripts ou para a inscrição através de uma sessão SSH existente.
| Comando | O que faz |
|---|---|
bromure-cli enroll --code <code> [--server-url <url>] [--device-name <name>] | Inscreve este Mac. Em caso de sucesso, imprime o email, o espaço de trabalho, o ID da instalação, o servidor e o dispositivo; sai com código diferente de zero em caso de falha. |
bromure-cli enrollment-status | Imprime o estado atual. Quando não está inscrito, imprime not enrolled e sai com 0, para que a automatização possa sondar em segurança. |
bromure-cli unenroll [--force] | Encerra a sessão (ver Revogação, saída da frota e anulação da inscrição). |
As predefinições correspondem às da interface gráfica: URL do servidor https://bromure.io/api (substituível através de BROMURE_MANAGED_URL ou da chave UserDefaults managed.serverURL), nome do dispositivo o nome de anfitrião localizado do Mac.
A identidade de instalação mTLS
Os envios de telemetria não transportam um token — autenticam-se com um certificado de cliente. Na inscrição (e em cada renovação), a aplicação gera uma nova chave RSA-2048, constrói um pedido de assinatura de certificado com o nome comum bromure-install-<installId> e faz com que a CA da organização do seu espaço de trabalho o assine através do servidor gerido. Os certificados folha e da CA são armazenados como ficheiros PEM inspecionáveis; a chave privada reside no Keychain do macOS.
No momento do pedido, o certificado e a chave são empacotados num PKCS#12 em memória e importados sem tocar no Keychain, pelo que nunca surge qualquer entrada no Acesso a Chaves nem um pedido de desbloqueio para a própria identidade. O certificado de servidor do próprio ponto de análise é validado com base no repositório de raízes normal do sistema.
Nota: O pedido do certificado folha durante a inscrição é feito com o melhor esforço. Se a CA da organização ainda não estiver configurada, a inscrição é bem-sucedida na mesma e o certificado é obtido no primeiro heartbeat.
O painel de estado da inscrição
Uma vez inscrito, o mesmo item de menu passa a chamar-se bromure.io Enrollment… e abre um painel de estado (título bromure.io enrollment) em vez do formulário de entrada. Mostra as linhas Espaço de trabalho, Utilizador, Dispositivo, Servidor, Inscrito (data) e Certificado — todas selecionáveis como texto. A linha Certificado apresenta Válido até <date> ou, caso tenha caducado, Expirado — a renovar automaticamente.
Dois botões ficam na parte inferior: Renovar certificado força um novo certificado folha; Encerrar sessão anula a inscrição (destrutivo — ver abaixo). Os problemas de estado surgem como um banner de aviso cor de laranja:
| Banner | Significado | O que fazer |
|---|---|---|
| Inscrição revogada | "O seu administrador revogou esta instalação. Encerre a sessão e inscreva-se novamente com um novo código para retomar o modo gerido." | Encerre a sessão e inscreva-se com um código novo. |
| Inscrição já não aceite | "O servidor rejeitou as credenciais desta instalação — podem ter caducado ou sido repostas." | Encerre a sessão e inscreva-se com um código novo. |
Uma Renovar certificado bem-sucedida limpa um estado de rejeição de credenciais obsoleto, mas nunca limpa um estado revogado — só a reinscrição o faz.
Heartbeat e renovação de certificado
Enquanto a aplicação está inscrita e em execução, uma tarefa em segundo plano publica um heartbeat no servidor do espaço de trabalho a cada 10 minutos (e uma vez imediatamente no arranque e na inscrição), o que mantém atualizado o carimbo temporal de "visto pela última vez" do administrador. A resposta do servidor é autoritativa quanto ao estado: uma revogação inverte o banner; uma resposta limpa apaga estados incorretos anteriores. Apenas um 401/403 no token portador do heartbeat coloca o estado como "token rejeitado" — erros transitórios (sem ligação, 5xx) nunca o alteram.
Cada ciclo de heartbeat também verifica o certificado folha mTLS e renova-o sempre que esteja em falta ou dentro de 72 hours da caducidade. A renovação é autenticada pelo token portador em vez do certificado folha, pelo que mesmo um certificado já caducado se recupera no arranque seguinte.
Aviso: Um Mac deixado fechado para além da caducidade do seu certificado falha silenciosamente os envios geridos até que o arranque seguinte renove o certificado folha. Isto é transparente na utilização normal, mas vale a pena saber se uma máquina fica desligada durante muito tempo.
O que é enviado — e o que não é
As sessões inscritas e não privadas transmitem eventos de cloud estruturados — um registo por cada: id da sessão, id do espaço de trabalho, carimbo temporal, tipo de evento e uma pequena carga JSON. As sessões aqui são janelas de atividade, não ciclos de vida de VM: um id de sessão por espaço de trabalho por janela de atividade, renovado após 20 minutos de inatividade.
| Evento | Destaques da carga |
|---|---|
session.start / session.end | Início e fim de uma janela de atividade; session.end transporta um motivo (por exemplo, idle_timeout) e é retrodatado até ao limite de inatividade. |
llm.request | Fornecedor, anfitrião, caminho, código de estado, latência, modelo e contagens de tokens de entrada/saída/cache. As sessões WebSocket em tempo real acrescentam o transporte e o id da resposta. |
tool.use | Nome da ferramenta e um resumo da entrada (truncado a 240 caracteres). |
file.read / file.write | Caminho do ficheiro e a ferramenta que lhe tocou. |
command.run | O texto do comando (truncado a 500 caracteres) e a ferramenta. |
credential.token_swap | Anfitrião e caminho, e pré-visualizações curtas dos tokens falso e real — nunca os próprios tokens. |
credential.ssh_sign | Etiqueta da chave, impressão digital SHA-256 e tipo de chave (gerida / importada). |
credential.aws_sign | Método, anfitrião, caminho, serviço, região e uma chave de acesso mascarada. |
supply_chain.fetch | Ecossistema, pacote, versão, tipo de pedido, resultado e motivo. |
vm.disk_reset | O motivo e as versões de imagem base envolvidas. |
prompt_injection.detection | Detetor, método, ação, anfitrião, origem, pontuação, sinais, id de utilização da ferramenta e todo o excerto assinalado (até 20 000 caracteres). |
O estado da transmissão é visível em cada janela da sessão e reproduzido nos relatórios da frota que o administrador vê.
O que nunca sai do Mac
Esta é a parte sobre a qual é preciso ser preciso. O fluxo é de metadados; o conteúdo do seu trabalho permanece local. O Bromure nunca envia:
- Prompts de utilizador em bruto ou corpos de resposta do modelo.
- Valores de segredos. Os eventos de credenciais transportam apenas pré-visualizações mascaradas ou impressões digitais — os bytes reais das chaves nunca saem do Mac.
- Qualquer coisa de um espaço de trabalho em modo privado (ver abaixo) e absolutamente nada quando não está inscrito.
Os eventos em buffer são mantidos apenas em memória; um encerramento forçado descarta os que ainda não foram enviados, e não existe uma fila de repetição persistida em disco. Isto é aceite por conceção — a telemetria é feita com o melhor esforço, nunca à custa do seu trabalho.
Aviso: Existe uma exceção deliberada à regra de "apenas metadados":
prompt_injection.detectionenvia o excerto assinalado completo (até 20 000 caracteres), para que um administrador possa ver exatamente o que o agente estava prestes a ler. Isto é conteúdo, não metadados — a contrapartida é que uma tentativa de injeção de prompt é precisamente aquilo que as equipas de segurança precisam de inspecionar textualmente. Todo o resto permanece pré-visualizações, caminhos, contagens e máscaras. Consulte Proteção contra injeção de prompt para saber o que aciona uma deteção.
Agrupamento e entrega
Os eventos são agrupados em memória e publicados no ponto de ingestão de análise, autenticados puramente pelo certificado folha mTLS — nenhum token portador acompanha os dados de telemetria. O buffer é esvaziado a cada 5 segundos, é esvaziado automaticamente a 200 eventos pendentes e envia no máximo 500 eventos por pedido. Durante uma interrupção prolongada, o buffer é reduzido aos eventos mais recentes (os mais antigos são descartados) em vez de crescer sem limite; um esvaziamento falhado repete o mesmo lote no ciclo seguinte.
Modo privado
A transmissão é de exclusão por espaço de trabalho. O interruptor Modo privado (ícone de olho riscado) no editor de um espaço de trabalho mantém a atividade desse espaço de trabalho inteiramente local: não são transmitidos metadados, o indicador na barra de título desaparece para ele e a lista de sessões do administrador não vê nada dele. O Inspetor de Rastreios local não é afetado — continua a registar de acordo com o seu próprio nível de rastreio. O interruptor está desativado (transmissão ativada) para todos os espaços de trabalho e aparece apenas em Macs inscritos, uma vez que de outra forma não faria nada.
O modo privado encontra-se com as definições de Rastreio no editor do espaço de trabalho. Num Mac não inscrito, o interruptor está simplesmente ausente, razão pela qual o painel abaixo mostra apenas o seletor de rastreio:
Os eventos são filtrados no momento da emissão — o tráfego em modo privado nunca chega sequer a entrar no buffer de envio.
Dica: O modo privado é o interruptor certo quando utiliza uma chave de API pessoal num espaço de trabalho e não quer que essa atividade seja visível para os administradores da sua organização. Não altera nada no registo de auditoria local.
O indicador de transmissão
Sempre que um Mac está inscrito e um espaço de trabalho não está em modo privado, um ponto vermelho pulsante ao estilo de gravação aparece na barra de ferramentas dessa janela da sessão (e como um ponto nas linhas da barra lateral da janela unificada). A sua descrição diz "Os metadados da sessão estão a ser enviados para bromure.io. Alterne o Modo Privado do espaço de trabalho para parar a transmissão." e a sua etiqueta de acessibilidade é Streaming to bromure.io. O ponto é puramente informativo e fica oculto quando não está inscrito ou em modo privado.
Registo do IP de saída
As instalações inscritas também publicam um pequeno ping autenticado por mTLS no ponto /register-ip do serviço de análise a cada 60 segundos (e uma vez no arranque e na inscrição), para que os registos do espaço de trabalho reflitam o IP público atual do Mac. É ignorado silenciosamente quando não está inscrito. O ponto assume por predefinição https://analytics.bromure.io/register-ip, substituível através de BROMURE_AC_REGISTER_IP_URL ou da chave UserDefaults managed.acRegisterIPURL.
Inventário da cadeia de fornecimento e resumos de utilização de tokens
Dois dos tipos de evento transmitidos são o que torna os relatórios de nível empresarial úteis para toda uma equipa.
- Inventário da cadeia de fornecimento. Cada obtenção de metadados e artefactos emite um evento
supply_chain.fetchque transporta o ecossistema, o pacote, a versão, o tipo de pedido, o resultado (allowed,rewritten,blockedoustripped) e o motivo. A inscrição por si só dá aos administradores um inventário à escala da organização de todos os pacotes que cada agente trouxe — mesmo em espaços de trabalho com todas as camadas de imposição da cadeia de fornecimento desativadas, uma vez que a observação está dissociada da imposição. O lado da imposição disto está documentado em Proteção da cadeia de fornecimento. - Resumos de utilização de tokens. Cada evento
llm.requesttransporta o modelo, as contagens de tokens de entrada e saída e as contagens de criação e leitura de cache. Agregados numa frota, tornam-se relatórios de gastos por utilizador, por espaço de trabalho e por modelo, sem que qualquer conteúdo de prompt ou resposta seja alguma vez enviado. O equivalente local — a contabilidade de tokens por pedido que pode ler no seu próprio Mac — está em Rastreio.
A vista da frota
Do lado do bromure.io, cada Mac inscrito aparece como uma linha na página /agentic-coding/installs do espaço de trabalho, identificado pelo seu ID de instalação e mostrando o nome do dispositivo que definiu, o utilizador e um carimbo temporal de "visto pela última vez" mantido atualizado pelo heartbeat de 10 minutos. A partir daí, um administrador revê os metadados de sessão transmitidos, o inventário da cadeia de fornecimento, os resumos de utilização de tokens e as deteções de injeção de prompt para toda a frota.
Isto é distinto da noção de "frota" do cliente nativo — espelhar vários anfitriões remotos ao mesmo tempo através de SSH — que é abordada em Acesso remoto. Os dois nunca partilham uma raiz de confiança.
Gestão do consentimento remoto
Quando uma sessão de espaço de trabalho é anexada interativamente através de CLI ou SSH — sem uma janela gráfica à frente — a aplicação não consegue apresentar uma caixa de diálogo. Em vez disso, os quatro intermediários de consentimento contra ataques de intermediário apresentam as suas perguntas como menus numerados no terminal do utilizador anexado:
| Pedido | Escolhas |
|---|---|
Utilização de credencial — Allow "<workspace>" to use <credential>? | Permitir durante 1 hora / Permitir durante 5 minutos / Permitir durante o resto da sessão / Não permitir |
Contorno da cadeia de fornecimento — Pass through <package> from workspace …? | Permitir durante 15 minutos / Permitir uma vez / Permitir durante o resto da sessão / Não permitir |
Escrita de salvaguarda — Allow write on … from workspace …? | (as mesmas quatro acima) |
Injeção de prompt — Possible <detector> in … (mostra até 1500 caracteres do texto assinalado) | Bloquear este pedido / Permitir este pedido |
A propriedade crucial é onde o pedido é apresentado: no lado do anfitrião da bomba do terminal. A VM convidada só vê o outro lado da ligação, pelo que um convidado comprometido não consegue nem ler o pedido nem injetar uma resposta. Se vários clientes se anexarem ao mesmo espaço de trabalho, o anexo interativo mais recente recebe os pedidos ("ganha o anexo mais recente").
Aviso: Estes pedidos falham em segurança. A ausência de anexo ativo, um tempo limite (predefinição de 120 segundos), um descarte ou uma desanexação a meio de um pedido resolvem-se todos como negar — e, no caso da injeção de prompt, como bloquear. Um alerta de falha de autenticação no registo é reduzido a uma linha de log para sessões anexadas interativamente, uma vez que não há interface gráfica para o mostrar. Os caminhos da interface gráfica para estas mesmas decisões são abordados em Credenciais, Proteção da cadeia de fornecimento e Proteção contra injeção de prompt.
Revogação, saída da frota e anulação da inscrição
Existem duas formas de uma instalação sair da frota, e fazem coisas diferentes.
Anular a inscrição (local). Clique em Encerrar sessão no painel de estado da inscrição, ou execute bromure-cli unenroll. A CLI pergunta Sign out of <org> (<email>)? [y/N] a menos que passe --force, e imprime not enrolled — nothing to do (saída 0) quando não há nada para remover. Encerrar a sessão elimina todo o material de inscrição local — install.json, leaf.crt, ca.crt, leaf.serial e o ficheiro de estado — remove o token portador e todas as chaves privadas folha do Keychain, purga a identidade mTLS em cache, descarta qualquer telemetria em buffer e para as tarefas de heartbeat e de registo de IP. A aplicação regressa ao estado Não inscrito, e a janela de estado volta ao formulário de inscrição para que possa reinscrever-se imediatamente com um código diferente.
Revogar (do lado do servidor). Um administrador revoga a instalação em bromure.io. No Mac, o heartbeat seguinte apresenta o banner Inscrição revogada e os envios geridos param.
Aviso: O encerramento de sessão é puramente local — não é feita qualquer chamada ao servidor. Um administrador que retire um dispositivo deve revogar a instalação do lado do servidor; caso contrário, a linha da instalação (agora inativa) permanece na página da frota até deixar de enviar heartbeats. Para retirar totalmente um Mac da frota, revogue-o no espaço de trabalho e encerre a sessão no dispositivo.
Referência
O estado da inscrição reside em ~/Library/Application Support/BromureAC/managed/: install.json (ID da instalação, slug do espaço de trabalho, utilizador, URL do servidor, nome do dispositivo, data de inscrição), leaf.crt e ca.crt (PEM), leaf.serial (um apontador para a entrada do Keychain que contém a chave do certificado folha atual) e health (ok / tokenRejected / revoked). No Keychain do macOS, o serviço io.bromure.agentic-coding.managed-install contém o token portador install-token e uma entrada leaf-cert-key-<serialHex> por cada número de série de certificado emitido (apenas este dispositivo, quando desbloqueado).
O cliente contacta três rotas do servidor gerido e um ponto de ingestão:
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)
| Intervalo / limite | Valor |
|---|---|
| Heartbeat | a cada 10 minutos |
| Registo do IP de saída | a cada 60 segundos |
| Limiar de renovação do certificado folha | 72 horas antes da caducidade |
| Esvaziamento de eventos | a cada 5 segundos (ou aos 200 pendentes) |
| Máximo de eventos por lote | 500 |
| Renovação da sessão por inatividade | 20 minutos |
| Tempo limite do consentimento remoto | 120 segundos |
| Limite do excerto de injeção de prompt | 20 000 caracteres |
As substituições de servidor e ponto (sem interface gráfica) são BROMURE_MANAGED_URL (ou managed.serverURL, predefinição https://bromure.io/api), BROMURE_AC_INGEST_URL (ou managed.acIngestURL, predefinição https://analytics.bromure.io/ac-ingest) e BROMURE_AC_REGISTER_IP_URL (ou managed.acRegisterIPURL). A referência completa dos comandos está em Automatização e a CLI.