防護欄

防護欄控制一台機器的憑證可以怎麼被使用(機器在設定編輯器中即工作區)、代理程式碰壁或行為異常時機器如何反應,以及它的流量被攔截得多嚴。它的 VM 可以開哪些連線,則在沙盒原則中設定。用窗格自己的話說:「防護欄統管這個工作區已設定憑證的使用方式。使用前先問會在某個憑證於一個工作階段中首次被使用時,跳出一則主機端的確認。寫入政策在傳輸上剝除或擋下破壞性操作——在代理伺服器中執行,所以被入侵的代理程式繞不過去。這裡只會出現你設定過的憑證。」

機器 Web app 的防護欄窗格:使用前先問與寫入政策的說明、一個寫著「沒有要看守的憑證」的空狀態,接著是「不對憑證外洩發出警示」與防護區段:Tell the agent when policy blocks it、Agent watchdog、憑證嚴格模式、停用透明攔截,以及逐請求的不安全繞道。

這個窗格有兩個部分:每個憑證一列,接著是防護——兩種沙盒引擎共用的設定。(以前放在這裡的出向連線規則,在 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.comDELETE 為破壞性;GET/HEAD 為讀取。
容器登錄檔已設定的登錄檔與 Docker Hub拉取為讀取;推送為寫入;DELETE 為破壞性。被擋下的呼叫會回傳登錄檔的 DENIED 錯誤。
GitHub / GitLab / Bitbucket該平台的 REST API 與走 HTTPS 的 gitREST 依方法判斷。git push 是寫入(在唯讀下被擋,在寫入前先問下會詢問);git fetch 永遠是讀取。

資料庫端點依引擎歸類:

引擎讀取寫入破壞性
MongoDB(Atlas Data API)find、findOne、aggregateinsert、update、replacedeleteOne、deleteMany
ClickHouseSELECT、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 上也會傳送給你的組織。
QuarantineVM 的網路在幾毫秒內被切斷,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 watchdogOff / Alert / QuarantineOff
Only allow credentials Bromure injects (strict mode)開關關閉
停用透明攔截開關關閉
允許逐請求的不安全繞道(X-bromure-insecure)開關開啟

相關章節