防護欄
防護欄控制一台機器的憑證可以怎麼被使用(機器在設定編輯器中即工作區)、代理程式碰壁或行為異常時機器如何反應,以及它的流量被攔截得多嚴。它的 VM 可以開哪些連線,則在沙盒原則中設定。用窗格自己的話說:「防護欄統管這個工作區已設定憑證的使用方式。使用前先問會在某個憑證於一個工作階段中首次被使用時,跳出一則主機端的確認。寫入政策在傳輸上剝除或擋下破壞性操作——在代理伺服器中執行,所以被入侵的代理程式繞不過去。這裡只會出現你設定過的憑證。」
這個窗格有兩個部分:每個憑證一列,接著是防護——兩種沙盒引擎共用的設定。(以前放在這裡的出向連線規則,在 5.4 移到了沙盒原則。)其中的一切都會在你點選儲存時套用到執行中的機器——不需重新啟動。更深的機制在提示注入偵測與防護欄。
憑證的各列
窗格會依同樣的順序列出在憑證中設定的每一個憑證。每一列顯示該憑證的名稱與主機、一個使用需經核准核取框,以及——在服務支援的情況下——一個寫入政策選擇器。沒有憑證時,窗格會顯示沒有要看守的憑證,並指引你到憑證窗格。
使用需經核准(使用前先問)
預設關閉。開啟後,該憑證在一個工作階段中首次被使用時,代理伺服器會把請求暫停並詢問,提供允許 5 分鐘、允許 1 小時、這個工作階段的其餘時間都允許或不允許。授予只存在記憶體中,隨工作階段結束;**視窗 › 憑證核准…**會列出目前的授予。見憑證與傳輸邊界。
當憑證有生效中的授予時,它那一列會在核取方塊旁顯示剩餘時間——限時授予顯示橘色倒數(4m,接著 45s),整個工作階段的授予顯示這個工作階段已允許,拒絕生效期間則顯示紅色的已拒絕倒數(或這個工作階段已拒絕)。在該列上按右鍵即可選擇允許 5 分鐘、允許 1 小時或這個工作階段的其餘時間都允許,拒絕 5 分鐘、拒絕 1 小時或這個工作階段的其餘時間都拒絕(不詢問直接拒絕),或撤銷——下次再詢問以清除兩者,讓下一次使用重新提示。限時的允許或拒絕從現在起算,所以快到期的授予會重新獲得 5 分鐘。這些動作會立即作用於執行中的工作階段,不需要儲存。(倒數只出現在執行該工作區的 Mac 上、該工作區自己的設定中,不會出現在偏好設定或遠端用戶端。)
注意: 使用了開著核准的憑證的自動化,無法完全無人執行:它會停在對話框上,直到你在 Mac 上作答。自動化編輯器會就此提出警告。
寫入政策
寫入政策選擇器會出現在:
- git 代管平台的權杖(GitHub、GitLab、Bitbucket)
- AWS 憑證
- DigitalOcean 權杖
- 容器登錄檔
- Kubernetes 環境
- 資料庫端點(MongoDB、ClickHouse、Elasticsearch)
| 模式 | 行為 |
|---|---|
| 關閉 | 不做過濾。 |
| 寫入前先問 | 讀取通過。每一次寫入都會停下,出現一個顯示確切操作的對話框。 |
| 擋下破壞性操作 | 刪除、丟棄與終止會被擋下;建立與更新通過。 |
| 唯讀 | 任何變更都被擋下;只有讀取通過。 |
新機器對每一種服務都使用寫入前先問(來自預設值範本)。在防護欄存在之前建立的機器會以關閉載入。
注意: 寫入政策是按服務而非按憑證的,一如窗格所註:「同一種服務的兩個憑證(例如兩個 GitHub 權杖)共用一份政策。」改其中任一列就會同時改到兩者。
每種服務如何被歸類
| 服務 | 範圍 | 歸類 |
|---|---|---|
| Kubernetes | 這台機器 kubeconfig 中的各個 API 伺服器 | GET/HEAD/OPTIONS 為讀取;DELETE(包含 deletecollection)為破壞性;其他動詞為寫入。被擋下的呼叫會回傳一個 Kubernetes 的 Status 403,kubectl 會清楚地顯示它。 |
| AWS | *.amazonaws.com | 依前綴看動作名稱(X-Amz-Target 標頭或 Action= 參數):Delete*、Terminate*、Remove*、Purge*、Destroy*、Deregister*、Revoke* 為破壞性;Get*、List*、Describe* 之類為讀取。S3 與 REST 風格的呼叫退回看 HTTP 方法。被擋下的呼叫會回傳 AccessDeniedException。 |
| DigitalOcean | *.digitalocean.com | DELETE 為破壞性;GET/HEAD 為讀取。 |
| 容器登錄檔 | 已設定的登錄檔與 Docker Hub | 拉取為讀取;推送為寫入;DELETE 為破壞性。被擋下的呼叫會回傳登錄檔的 DENIED 錯誤。 |
| GitHub / GitLab / Bitbucket | 該平台的 REST API 與走 HTTPS 的 git | REST 依方法判斷。git push 是寫入(在唯讀下被擋,在寫入前先問下會詢問);git fetch 永遠是讀取。 |
資料庫端點依引擎歸類:
| 引擎 | 讀取 | 寫入 | 破壞性 |
|---|---|---|---|
| MongoDB(Atlas Data API) | find、findOne、aggregate | insert、update、replace | deleteOne、deleteMany |
| ClickHouse | SELECT、SHOW、DESCRIBE、EXPLAIN、WITH … | INSERT、CREATE、ALTER … | DROP、TRUNCATE、DELETE,以及 ALTER … DELETE / DROP COLUMN / DROP PARTITION / CLEAR |
| Elasticsearch | _search、_msearch、_count、_mget、_sql 與其他查詢(即使走 POST) | _bulk、_update、建立索引 | DELETE、_delete_by_query |
當某份政策沒有可套用的對象時,會出現一則橙色警告——例如沒有 kubeconfig 的 Kubernetes 環境,或沒有主機的資料庫端點。
注意: 對 ClickHouse 來說,若請求裡看不到 SQL 文字,唯讀會擋下它(無法證明那是讀取),而擋下破壞性操作會讓它通過。
寫入對話框
在寫入前先問下,一次寫入會停下並出現要允許從工作區「名稱」對「範圍」寫入嗎?,把操作原封不動顯示出來——那道 SQL 陳述式,或 方法 /路徑。選項有:
- 允許 15 分鐘(預設)
- 允許一次——不建立授予,所以下一次寫入還會再問。
- 這個工作階段的其餘時間都允許
- 不允許——代理程式會收到跟那些會擋下的模式相同的錯誤。這個拒絕會被記住 60 秒,好讓重試迴圈不必每秒都再問一次。
授予是按機器、按範圍的:一個 Kubernetes API 伺服器、AWS 整體、一個登錄檔、每個代管平台,或一台資料庫主機。同時發生的相同寫入共用一個對話框。當機器透過 SSH 或 CLI 以無介面方式使用時,同樣的選項會在機器的 tmux 裡被問;不作答就等於拒絕。
不對憑證外洩發出警示
當某個憑證被看見正前往一台它不屬於的主機時,Bromure 會擋下該請求、把 VM 暫停,並顯示一則入侵警示,帶著關機、封鎖、允許與保存以供調查。允許會在該工作階段的其餘時間信任那個目的地。見憑證與傳輸邊界。
不對憑證外洩發出警示會為這台機器關掉那則警示。外洩仍然被擋下,也仍然記錄在安全性時間軸中,記為「已封鎖 — 外洩嘗試(警示已關,VM 未暫停)」——消失的只有那次中斷。即時生效,不需重新啟動。預設:關閉。
防護
防護區段收納的設定,不論機器用的是哪一種沙盒引擎都適用。每一項都會立即套用到執行中的機器。
政策擋下時告知代理程式
Tell the agent when policy blocks it——「代理程式會來問你,而不是重試或另找門路」。當防火牆、OpenShell 政策、客體沙盒或某道防護欄拒絕了代理程式嘗試的事,代理程式會被告知擋下了什麼、為什麼,並被要求來問你,而不是重試或另找門路。沒有這個設定時,代理程式只看到一條失敗的連線或「permission denied」,可能會一直試下去。Claude Code 會在碰到封鎖的那條指令之後立刻讀到這則通知。Codex、Grok、Kimi 與 Oh My Pi 則在它們的回合結束時收到輸入的通知。在你做出選擇之前,只要機器使用 OpenShell 政策,它就是開啟的。請見告知代理程式。
代理程式看門狗
Agent watchdog——「標記行為可疑的工作階段;Quarantine 還會切斷它的網路並將它暫停」。看門狗從 VM 外部,把工作階段當成一個整體來監看:
- 一連串被擋下的請求;
- 不屬於這裡的憑證;
- 竄改的跡象;
- 工作階段穩定下來之後出現的新目的地;
- 遠高於工作階段自身基準的出向流量(在網路交換器上計算,與代理無關)。
| 模式 | 工作階段在一分鐘內的分數超過門檻時 |
|---|---|
| Off(預設) | 什麼都不做。 |
| Alert | 在安全性時間軸中留下一列 Agent watchdog(「drift detected」),在已註冊的 Mac 上也會傳送給你的組織。 |
| Quarantine | VM 的網路在幾毫秒內被切斷,VM 也被暫停。接著一則警示 The agent watchdog quarantined this workspace 會列出它看到了什麼。關機 會停止機器;Keep quarantined 讓它在網路仍被切斷的情況下繼續執行,好讓你進去查看;Release 會恢復網路。 |
當警示無法在這台 Mac 上顯示時(無頭的 Mac,或由遠端用戶端鏡像的機器),問題會送到遠端用戶端,三分鐘內沒有回答則視為 Keep quarantined。
只允許 Bromure 注入的憑證(嚴格模式)
Only allow credentials Bromure injects (strict mode)——「擋下任何不是 Bromure 自己放進去的憑證」。開啟嚴格模式後,帶著 Bromure 沒有注入的憑證的請求會被擋下,並觸發入侵警示;這涵蓋代理程式在檔案裡找到、從日誌複製或自行帶來的金鑰。在警示中按允許,會在這個工作階段中核准該憑證。網站在 VM 內核發的權杖(例如登入後的工作階段 Cookie)仍可送回那個網站。
嚴格模式會強制透明攔截,並忽略不攔截清單。原始 TCP 流量無法檢查。機器設定的每個憑證都必須先有主機篩選條件;窗格會點名沒有的那些。預設關閉;你的組織可以要求開啟。
停用透明攔截
預設情況下,虛擬交換器會在網路層把 VM 的 HTTP 與 HTTPS 連線(連接埠 80 與 443)改道進 Bromure 的代理伺服器,所以即使某支程式忽略代理設定,代理伺服器也看得到它們。
開啟停用透明攔截只會停掉那道強制改道。開啟原始連線的程式,以及固定憑證(certificate pinning)的應用程式,這時就會直接連上網路——以及真正的伺服器憑證。代理伺服器本身仍然開著:HTTP_PROXY / HTTPS_PROXY 依舊設定著,所以懂得用代理的工具(apt、git、pip、curl、node…)與代理程式自己的 API 呼叫,仍然會走過 Bromure,並保有憑證替換、追蹤與防護欄。即時生效,不需重新啟動。嚴格模式開啟時無法使用。
把它用在某台機器上,若它有個客戶端在攔截之下就壞掉。在它開啟期間,那些繞過代理設定的程式的流量,既不被防火牆的 web 規則看到,也不被寫入政策看到。
允許逐請求的不安全繞道(X-bromure-insecure)
為自簽或私有 CA 的伺服器準備的一道更窄的逃生門。當送往這種主機的請求在憑證驗證上失敗時,代理程式可以帶上 X-bromure-insecure: yes 標頭重試,而 Bromure 就會在那一次請求中略過驗證該伺服器的憑證。攔截、追蹤與外洩守衛仍然開著,而 Bromure 不會把任何真正的憑證放進這樣的請求裡——出去的只有 VM 的替身。每一次使用都會記錄在安全性時間軸中。
預設開啟:它只在 VM 明確送出那個標頭時才作用。把它關掉就會直接拒絕那個標頭。
呼叫被擋下時代理程式看到什麼
被擋下的呼叫會以該服務自己的格式回傳一個普通的錯誤——Kubernetes 的 Status、AWS 的 AccessDeniedException、登錄檔的 DENIED——而它的訊息以「blocked by Bromure Guardrails」結尾。代理程式看到的是一次可以回報的乾淨失敗,而不是一條掛住的連線。(供應鏈的封鎖改用 HTTP 451,所以兩者很容易分辨——見供應鏈。)
限制
- force-push 在傳輸上看起來就像一次普通的 push,所以擋下破壞性操作攔不住它;唯讀與寫入前先問確實會為 push 設下關卡。經由該平台 REST API 的刪除則會被捕捉到。
- Kubernetes 與登錄檔的政策只涵蓋來自這台機器 kubeconfig 與登錄檔的主機;資料庫政策需要那個端點的主機。
- 其他主機由沙盒原則的主機、連接埠與方法規則管轄,而不是由服務層級的分類管轄。
設定參考
| 設定 | 類型 | 預設 |
|---|---|---|
| 使用需經核准 | 每個憑證一個核取框 | 關閉 |
| 寫入政策 | 每種服務各自:關閉 / 寫入前先問 / 擋下破壞性操作 / 唯讀 | 新機器為寫入前先問 |
| 不對憑證外洩發出警示 | 開關 | 關閉 |
| Tell the agent when policy blocks it | 開關 | 機器使用 OpenShell 政策時開啟 |
| Agent watchdog | Off / Alert / Quarantine | Off |
| Only allow credentials Bromure injects (strict mode) | 開關 | 關閉 |
| 停用透明攔截 | 開關 | 關閉 |
| 允許逐請求的不安全繞道(X-bromure-insecure) | 開關 | 開啟 |
相關章節
- 憑證 — 這些列所統管的那些憑證。
- 沙盒原則 — 機器的出向規則或 OpenShell 政策。
- 提示注入偵測與防護欄 — 執行的細部。
- 安全性總覽與時間軸 — 每一次封鎖與放行,按機器分。
- 設定參考 — 所有窗格一覽。