企業版 — 註冊與機群

單一份 Bromure Agentic Coding 是一項個人工具。在整個團隊層面上,管理員通常需要回答組織性的問題:哪些 Mac 正在執行應用程式、代理程式正拉進哪些套件、花費了多少權杖,以及是否有任何工作區觸發了提示注入偵測器。透過 Bromure Enterprise Manager(bromure.io 上的工作區)進行註冊,正好能提供這樣的機群可見性——它會從每一台已註冊的 Mac 串流上傳工作階段中繼資料(絕不含提示、絕不含密鑰)。

本章涵蓋如何註冊一台 Mac、用來驗證其上傳內容的 mTLS 安裝身分、究竟有哪些資料會與不會上傳、每個工作區的退出選項、管理員的機群檢視、遠端同意處理,以及離職移除。本機追蹤(enrollment 並不會取代的那份存放於 Mac 上的稽核記錄)在 追蹤 中說明;供企業報告使用的套件清單則是 供應鏈保護

兩套獨立的系統

「機群」一詞橫跨兩項值得清楚區分的功能,因為它們並不共用信任根:

  • bromure.io 註冊(本章)會將一台 Mac 註冊到你的工作區,並將工作階段中繼資料串流至雲端,由你組織 CA 簽發的雙向 TLS 憑證進行驗證。
  • 完整用戶端遠端存取)讓一台 Mac 透過 SSH 鏡像其他 Mac 上正在執行的執行個體,由 SSH 主機金鑰與已註冊的公鑰進行驗證。

兩者互不依賴。你可以完全不使用完整用戶端就進行註冊、在不註冊任何主機的情況下鏡像主機,或兩者兼用。註冊的 mTLS 堆疊僅用於機群遙測;完整用戶端鏡像信任的是 SSH——這兩者在此版本中是刻意不合併的。

使用 Bromure Enterprise Manager 註冊

註冊以代碼為基礎。管理員會在 bromure.io 上你使用者的詳細資料頁面產生一組一次性、六個字詞的註冊代碼,範圍限定於 agentic-coding 應用程式。你將該代碼貼到應用程式(或 CLI)中,該 Mac 便會把自己註冊為工作區的一個安裝

從應用程式進行

  1. 向你的管理員取得一組六個字詞的註冊代碼。
  2. 開啟 Bromure Agentic Coding(應用程式名稱選單)→ 在 bromure.io 中註冊…——該項目就位於 檢查更新… 正下方。一個標題為 bromure.io 註冊 的視窗會開啟。
  3. 將代碼貼入 註冊代碼 欄位(提示文字:six-word-enrollment-code)。
  4. 選擇性地編輯 裝置名稱(預設為此 Mac 的名稱;說明文字:「顯示給你的管理員,讓他們能辨識這台 Mac。」)。
  5. 選擇性地展開 進階 並為自架或測試伺服器設定 伺服器 URL(選填)
  6. 按一下 註冊(Return)或 取消(Esc)。

此工作表明確說明了註冊會啟用什麼:它會「將工作階段中繼資料(工具、檔案、指令、權杖用量)傳送到你的工作區,讓管理員得以檢視活動。處於私密模式的工作區絕不串流。」成功後,該安裝會出現在管理員的 /agentic-coding/installs 頁面上。

附註: 部分應用程式內的提示文字仍寫著「開啟 Window → 在 bromure.io 中註冊…」,但該項目實際上位於應用程式(應用程式名稱)選單中——那才是權威位置。為不同 Bromure 應用程式產生的代碼會被拒絕,並顯示 Code was issued for app '…', expected 'agentic-coding'.,而第二次註冊會失敗並顯示 Bromure Agentic Coding is already enrolled.

從 CLI 進行

GUI 流程有完全對應的 CLI 版本,在 bromure-cli --help 中歸類於 Enterprise features 之下,並共用相同的磁碟儲存區。它們適合用於指令碼化佈建,或透過既有的 SSH 工作階段進行註冊。

指令用途
bromure-cli enroll --code <code> [--server-url <url>] [--device-name <name>]註冊這台 Mac。成功時印出電子郵件、工作區、安裝 ID、伺服器與裝置;失敗時以非零狀態結束。
bromure-cli enrollment-status印出目前狀態。未註冊時印出 not enrolled 並以 0 結束,因此自動化可以安全地探測。
bromure-cli unenroll [--force]登出(見 撤銷、離職移除與取消註冊)。

預設值與 GUI 相符:伺服器 URL 為 https://bromure.io/api(可透過 BROMURE_MANAGED_URLmanaged.serverURL UserDefaults 鍵覆寫),裝置名稱為 Mac 的本地化主機名稱。

mTLS 安裝身分

遙測上傳不攜帶權杖——它們以用戶端憑證進行驗證。在註冊時(以及每次續期時),應用程式會產生一把全新的 RSA-2048 金鑰,建立一份通用名稱為 bromure-install-<installId> 的憑證簽署要求,並透過受管理伺服器讓你工作區的 org CA 簽署它。葉憑證與 CA 憑證會以可檢視的 PEM 檔案儲存;私密金鑰則存放於 macOS 鑰匙圈中。

在提出要求時,憑證與金鑰會被封裝成一份記憶體內的 PKCS#12,並在觸及鑰匙圈的情況下匯入,因此針對該身分本身,絕不會出現鑰匙圈存取項目或解鎖提示。分析端點自身的伺服器憑證則以一般系統根憑證存放區進行驗證。

附註: 註冊期間的葉憑證要求是盡力而為。若 org CA 尚未設定,註冊仍會成功,憑證會在第一次心跳時取得。

註冊狀態面板

一旦註冊,同一個選單項目便會將自己重新命名為 bromure.io 註冊…,並開啟一個狀態面板(標題為 bromure.io 註冊)而非輸入表單。它會顯示 工作區使用者裝置伺服器已註冊(日期)與 憑證 各列——全部皆可選取文字。憑證 列會顯示 有效期限至 <date>,若已逾期則顯示 已過期 — 自動續期中

底部有兩個按鈕:續期憑證 會強制取得一份新的葉憑證;登出 會取消註冊(具破壞性——見下文)。健康問題會以橘色警告橫幅呈現:

橫幅意義應採取的動作
註冊已撤銷「你的管理員已撤銷此安裝。請登出並使用新代碼重新註冊以恢復受管理模式。」登出並以新代碼註冊。
註冊已不再受接受「伺服器拒絕了此安裝的憑證——它們可能已過期或已被重設。」登出並以新代碼註冊。

成功的 續期憑證 會清除陳舊的憑證遭拒狀態,但它絕不會清除 已撤銷 狀態——只有重新註冊才能清除。

心跳與憑證續期

當應用程式以已註冊狀態執行時,一個背景工作會每隔 10 分鐘向工作區伺服器發送一次心跳(並在啟動時與註冊時各立即發送一次),這讓管理員的最後上線時間戳保持最新。伺服器的回應對健康狀態具有權威性:撤銷會翻轉橫幅;乾淨的回應會清除先前的不良狀態。只有心跳的持有者權杖收到 401/403 才會將健康狀態轉為「權杖遭拒」——短暫錯誤(離線、5xx)絕不會改變它。

每一次心跳滴答也會檢查 mTLS 葉憑證,並在其遺失或距離到期 72 小時 以內時續期。續期是由持有者權杖而非葉憑證進行驗證,因此即使是已經過期的憑證也會在下次啟動時自我修復。

警告: 一台被關閉並超過其憑證到期時間的 Mac,會靜默地無法完成受管理上傳,直到下次啟動續期葉憑證為止。在正常使用中這是透明的,但若一台機器長時間關閉不用,這點值得知道。

有哪些會上傳——有哪些不會

已註冊、非私密的工作階段會串流結構化的 雲端事件——每一筆記錄包含:工作階段 id、工作區 id、時間戳、事件類型,以及一小段 JSON 酬載。這裡的工作階段是活動視窗,而非 VM 生命週期:每個工作區在每個活動視窗有一個工作階段 id,在閒置 20 分鐘後輪替。

事件酬載重點
session.start / session.end活動視窗的開始與結束;session.end 帶有一個原因(例如 idle_timeout),並回溯標記至閒置邊界。
llm.request提供者、主機、路徑、狀態碼、延遲、模型,以及輸入/輸出/快取權杖計數。即時 WebSocket 工作階段還會加上傳輸方式與回應 id。
tool.use工具名稱與輸入摘要(截斷至 240 個字元)。
file.read / file.write檔案路徑與觸及它的工具。
command.run指令文字(截斷至 500 個字元)與工具。
credential.token_swap主機與路徑,以及假權杖與真權杖的簡短預覽——絕不含權杖本身。
credential.ssh_sign金鑰標籤、SHA-256 指紋,以及金鑰種類(受管理/匯入)。
credential.aws_sign方法、主機、路徑、服務、地區,以及遮蔽後的存取金鑰。
supply_chain.fetch生態系、套件、版本、要求種類、結果與原因。
vm.disk_reset原因與所涉及的基底映像檔版本。
prompt_injection.detection偵測器、方法、動作、主機、來源、分數、訊號、工具使用 id,以及整段被標記的片段(最多 20,000 個字元)。

串流狀態在每個工作階段視窗中皆可見,並反映在管理員所看到的機群報告中。

有哪些絕不離開 Mac

這是需要講清楚的部分。串流的是中繼資料;你工作的內容留在本機。Bromure 絕不 上傳:

  • 原始使用者提示模型回應主體。
  • 密鑰值。 憑證事件僅攜帶遮蔽後的預覽或指紋——真正的金鑰位元組絕不離開 Mac。
  • 來自私密模式工作區的任何內容(見下文),以及 未註冊時的任何內容。

已緩衝的事件僅保存在記憶體中;硬性結束會捨棄任何尚未送出的事件,且沒有以磁碟為後盾的重試佇列。這在設計上是可接受的——遙測是盡力而為,絕不以犧牲你的工作為代價。

警告: 對於「僅中繼資料」規則有一個刻意的例外:prompt_injection.detection 會上傳 整段被標記的片段(最多 20,000 個字元),讓管理員能確切看到代理程式即將讀取什麼。這是內容,而非中繼資料——其取捨在於,提示注入嘗試正是安全團隊需要逐字檢查的東西。其餘一切仍是預覽、路徑、計數與遮蔽。關於什麼會觸發偵測,請見 提示注入保護

批次處理與傳遞

事件會在記憶體中批次處理並發送至分析擷取端點,純粹由 mTLS 葉憑證進行驗證——遙測資料不隨附任何持有者權杖。緩衝區每隔 5 秒清空一次,在待處理事件達 200 筆時自動清空,且每次要求最多送出 500 筆事件。在長時間中斷期間,緩衝區會被修剪至最近的事件(最舊的會被捨棄),而非無限制成長;清空失敗時會在下一次滴答重試相同批次。

私密模式

串流是每個工作區的退出選項。工作區編輯器中的 私密模式 切換(斜線眼睛圖示)能讓該工作區的活動完全保留在本機:不串流任何中繼資料、標題列指示器對它消失,且管理員的工作階段清單看不到來自它的任何內容。本機的追蹤檢視器不受影響——它會依其自身的 追蹤等級 持續記錄。此切換對每個工作區皆為關閉(啟用串流),且僅出現在已註冊的 Mac 上,因為否則它不會有任何作用。

私密模式與工作區編輯器中的 追蹤 設定放在一起。在未註冊的 Mac 上該開關根本不存在,這也是為何下方窗格只顯示追蹤選擇器:

未註冊 Mac 上編輯工作區視窗的追蹤窗格,僅顯示設為「AI 要求詳細資料」的工作階段追蹤選擇器。在已註冊的 Mac 上,此窗格中會出現一個私密模式開關。

事件在發出時就受閘控——私密模式的流量根本不會進入上傳緩衝區。

提示: 當你在某個工作區使用個人 API 金鑰,且不希望該活動被你組織的管理員看見時,私密模式正是合適的開關。它完全不會改變本機的稽核記錄。

串流指示器

只要一台 Mac 已註冊且某個工作區處於私密模式,該工作階段視窗的工具列中就會出現一個脈動的紅色錄製樣式圓點(在整合視窗的側邊列各列上則顯示為一個圓點)。其工具提示寫著「工作階段中繼資料正在傳送至 bromure.io。切換工作區的私密模式以停止串流。」,其輔助使用標籤為 正在串流至 bromure.io。此圓點純屬資訊性質,並在未註冊或處於私密模式時隱藏。

出口 IP 註冊

已註冊的安裝也會每隔 60 秒(並在啟動與註冊時各一次)向分析服務的 /register-ip 端點發送一個小型、經 mTLS 驗證的 ping,好讓工作區的紀錄反映 Mac 目前的公開 IP。未註冊時會靜默略過。該端點預設為 https://analytics.bromure.io/register-ip,可透過 BROMURE_AC_REGISTER_IP_URLmanaged.acRegisterIPURL UserDefaults 鍵覆寫。

供應鏈清單與權杖用量彙總

串流事件類型中有兩種,是讓企業級報告在整個團隊層面發揮效用的關鍵。

  • 供應鏈清單。 每一次中繼資料與構件擷取都會發出一個 supply_chain.fetch 事件,攜帶生態系、套件、版本、要求種類、結果(allowedrewrittenblockedstripped)與原因。單憑註冊,就能讓管理員取得一份組織範圍的清單,涵蓋每個代理程式拉進的每個套件——即使在關閉了所有供應鏈強制層的工作區上也是如此,因為觀測與強制是解耦的。此功能的強制面在 供應鏈保護 中說明。
  • 權杖用量彙總。 每一個 llm.request 事件都攜帶模型、輸入與輸出權杖計數,以及快取建立與快取讀取計數。在機群範圍彙總後,這些便成為依使用者、依工作區、依模型的花費報告,而完全不必上傳任何提示或回應內容。其本機對應項目——你能在自己 Mac 上讀取的每次要求權杖統計——在 追蹤 中。

機群檢視

在 bromure.io 這一側,每一台已註冊的 Mac 都會在工作區的 /agentic-coding/installs 頁面上顯示為一列,以其安裝 ID 標識,並顯示你所設定的裝置名稱、使用者,以及由 10 分鐘心跳保持最新的最後上線時間戳。管理員可從這裡檢視整個機群的串流工作階段中繼資料、供應鏈清單、權杖用量彙總與提示注入偵測。

這有別於完整用戶端所謂的「機群」概念——後者是透過 SSH 同時鏡像數個遠端主機——該概念在 遠端存取 中說明。這兩者絕不共用信任根。

遠端同意處理

當一個工作區工作階段透過 CLI 或 SSH 以互動方式附加——前方沒有 GUI 視窗——時,應用程式無法彈出對話方塊。取而代之地,四個中間人同意代理程序會將它們的問題以編號選單的形式呈現在已附加使用者的終端機上:

提示選項
憑證使用 — Allow "<workspace>" to use <credential>?允許 1 小時/允許 5 分鐘/允許至工作階段結束/不允許
供應鏈繞過 — Pass through <package> from workspace …?允許 15 分鐘/允許一次/允許至工作階段結束/不允許
防護欄寫入 — Allow write on … from workspace …?(與上方相同的四個選項)
提示注入 — Possible <detector> in …(顯示最多 1,500 個字元的被標記文字)封鎖此要求/允許此要求

關鍵特性在於提示渲染的位置:在終端機傳輸管線的 主機 側。客體 VM 只會看到連線的另一側,因此遭入侵的客體既無法讀取提示,也無法注入答案。若有多個用戶端附加至同一個工作區,最新的互動式附加會收到這些提示(「最近附加者勝出」)。

警告: 這些提示採用失效安全設計。沒有進行中的附加、逾時(預設 120 秒)、關閉,或提示中途分離,全都解析為 拒絕——而對於提示注入,則解析為 封鎖。對於以互動方式附加的工作階段,登錄檔驗證失敗警示會被抑制為一行日誌,因為沒有 GUI 可顯示它。這些相同決策的 GUI 路徑在 憑證供應鏈保護提示注入保護 中說明。

撤銷、離職移除與取消註冊

一個安裝離開機群有兩種方式,它們的作用各不相同。

取消註冊(本機)。 在註冊狀態面板中按一下 登出,或執行 bromure-cli unenroll。除非你傳入 --force,CLI 會提示 Sign out of <org> (<email>)? [y/N],並在沒有東西可移除時印出 not enrolled — nothing to do(結束碼 0)。登出會刪除所有本機註冊資料——install.jsonleaf.crtca.crtleaf.serial 與健康檔案——從鑰匙圈移除持有者權杖與每一把葉私密金鑰、清除快取的 mTLS 身分、丟棄任何已緩衝的遙測,並停止心跳與 IP 註冊工作。應用程式回到 未註冊 狀態,狀態視窗換回註冊表單,讓你可以立即以不同代碼重新註冊。

撤銷(伺服器端)。 管理員在 bromure.io 上撤銷該安裝。在 Mac 上,下一次心跳會浮現 註冊已撤銷 橫幅,受管理上傳隨即停止。

警告: 登出純屬本機——不會發出任何伺服器呼叫。要淘汰一台裝置的管理員應該 在伺服器端撤銷該安裝;否則那個(現已失效的)安裝列會停留在機群頁面上,直到它停止發送心跳。要完全將一台 Mac 離職移除,請在工作區中撤銷它在裝置上登出。

參考資料

註冊狀態存放於 ~/Library/Application Support/BromureAC/managed/ 之下:install.json(安裝 ID、工作區代稱、使用者、伺服器 URL、裝置名稱、註冊時間)、leaf.crtca.crt(PEM)、leaf.serial(指向存有目前葉金鑰之鑰匙圈項目的指標),以及 healthok / tokenRejected / revoked)。在 macOS 鑰匙圈中,服務 io.bromure.agentic-coding.managed-install 存有 install-token 持有者權杖,以及每個已簽發憑證序號各一個 leaf-cert-key-<serialHex> 項目(僅限此裝置、解鎖時)。

用戶端會聯絡三個受管理伺服器路由與一個擷取端點:

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)
間隔/上限
心跳每 10 分鐘
出口 IP 註冊每 60 秒
葉憑證續期門檻到期前 72 小時
事件清空每 5 秒(或達 200 筆待處理時)
每批次最大事件數500
工作階段閒置輪替20 分鐘
遠端同意逾時120 秒
提示注入片段上限20,000 個字元

伺服器與端點覆寫(無 GUI)為 BROMURE_MANAGED_URL(或 managed.serverURL,預設 https://bromure.io/api)、BROMURE_AC_INGEST_URL(或 managed.acIngestURL,預設 https://analytics.bromure.io/ac-ingest),以及 BROMURE_AC_REGISTER_IP_URL(或 managed.acRegisterIPURL)。完整的指令參考在 自動化與 CLI