沙盒原則
沙盒原則窗格(位於安全性群組,在防護欄與供應鏈之間)決定一台機器的 VM 可以連到哪裡,而在 OpenShell 引擎下,還決定它的代理程式在 VM 裡可以做什麼(機器在設定編輯器中即工作區)。5.4 之前它叫做防火牆;在設定中搜尋 firewall、openshell、sentry 或 landlock 仍然找得到它。
窗格一打開只有一個選擇,Sandbox engine(沙盒引擎):
| 引擎 | 它是什麼 |
|---|---|
| Bromure Firewall | 「依主機、位址、協定與連接埠來允許或拒絕 VM 的連線。」一張有順序的允許/拒絕規則表,在 Mac 上執行。新機器的預設。 |
| OpenShell + Sentry | 「在 VM 中執行、由核心哨兵監看的 NVIDIA OpenShell 政策。」一份 YAML 政策(預設全部拒絕),再加上客體沙盒與核心哨兵。 |
引擎如何運作,以及它們如何與 Bromure 的其他防護搭配,請見沙盒原則、客體沙盒與核心哨兵。本頁是欄位參考。
切換到 OpenShell + Sentry 時,會把你組織的預設政策(或 Bromure 的入門政策)填入空白的政策,並以 Best effort 開啟核心哨兵。在已有政策的情況下切回 Bromure Firewall,會先詢問 Switch to the Bromure Firewall?,因為 Discard OpenShell policy 會移除政策並關閉核心哨兵(除非你的組織要求開啟)。若想保留政策,請先用 輸出…。
兩種引擎都適用的防護——政策擋下時告知代理程式、代理程式看門狗、嚴格憑證、透明攔截與不安全繞道——都在防護欄 › 防護。
Bromure 防火牆
出向規則
「依主機、IP/CIDR、協定與連接埠來允許或拒絕 VM 的連線——自上而下比對,第一個命中者說話。」規則涵蓋任何協定與任何目的地。未匹配流量決定沒有任何規則命中的連線會怎樣:允許(預設),或在採白名單作法時選拒絕。新增規則會附加一列。
| 欄 | 值 | 意義 |
|---|---|---|
| (核取方塊) | 開 / 關 | 取消勾選一條規則即可關閉它而不刪除。關閉的規則會保留、變暗,並在你再次勾選前被忽略。 |
| 動作 | allow / deny | 命中時會怎樣。 |
| 協定 | tcp / udp / web / any | web 是 HTTP(S),也是唯一其規則還能限制方法的協定。 |
| 主機 / CIDR | any、一個主機名稱,或一段 IPv4 CIDR | example.com 涵蓋該網域與所有子網域;*.example.com 只涵蓋子網域。單獨一個 IP 就是 /32。 |
| 連接埠 | any、一個連接埠、一段範圍(8000-8999)或一份清單 | 留空表示任意。 |
| 方法 | HTTP 動詞,只有 web 規則有 | 搭 allow 時只有這些動詞通得過(GET,POST);搭 deny 時這些動詞會被拒(PUT,DELETE)。read-only 意指 GET/HEAD/OPTIONS。 |
| 時限 | 時鐘選單 | 讓規則在有限時間內開啟:開啟 15 分鐘、開啟 1 小時或開啟直到工作區停止;設為永久會移除時限。有時限的規則會顯示剩餘時間(「14m」),直到停止的規則會顯示「until stop」。 |
「規則在你編輯的當下就生效;取消會把它們還原。」不需要重新啟動,也不需要儲存:新的連線立刻遵循新規則,已開啟的連線也一樣。關閉一條規則、移除它、新增一條拒絕規則、時限到期,或直到停止的規則結束,都會重新檢查這台機器所有已開啟的連線,而新規則拒絕的連線會在兩端都被切斷。關閉一個暫時的允許就真的結束了存取,而不是讓一個已開啟的下載跑到完。
- 經由代理設定(
HTTPS_PROXY——curl、git、npm 與代理程式預設都會使用)建立的連線由代理本身切斷:它關閉 VM 那一端,並取消送往伺服器的請求,WebSocket 也包括在內。安全性時間軸會把每一條記錄為 連線已關閉——「allow tcp …」不再允許它。 - 直接連線由虛擬交換器在下一個封包時切斷:它丟棄該封包並送給 VM 一個 TCP 重設,而對於被攔截的 HTTP(S) 流量,代理通往伺服器的連線也會被關閉。
如果在編輯器開著時,規則在編輯器之外被變更——安全性時間軸上的一個動作,或時限到期——這項變更會合併進你尚未儲存的編輯。如果你也編輯了同樣的規則,窗格會詢問:重新載入或保留我的編輯。
暫時規則
有些規則只需要一下子——例如連上 GitHub 或 npm registry,只為了升級相依套件。與其新增規則再記得刪掉它,不如用規則的時鐘選單設定時限:
- 開啟 15 分鐘 / 開啟 1 小時——時間一到,規則就不再命中,即使 Bromure 正忙也一樣;不久之後它會被關閉並以這個狀態儲存,所以會留在清單中供下次使用。
- 開啟直到工作區停止——機器停止(或重新啟動)時規則會被關閉;如果應用程式結束時它仍在執行,則在下次啟動 Bromure 時關閉。
之後要再用這條規則,勾選它或選一個新的時限即可。
要允許剛被封鎖的東西,最快的方法是機器視窗裡的 Sandbox 抽屜,或安全性時間軸中被封鎖那一列上的允許…。兩者都提供永遠、15 分鐘、1 小時與直到工作區停止。
pf 格式
pf 格式展開區把同一組規則以文字呈現——一行一條,最後以 default allow 或 default deny 結尾——這正是它們被儲存的樣子,也是 CLI 與受管描述檔所使用的形式:
allow tcp api.github.com:443
allow web api.example.com GET,POST # 只有這些動詞到得了那個網站
deny web api.internal PUT,DELETE # 擋下這些動詞,其餘放行
deny udp any:53
deny any 10.0.0.0/8
default deny
關閉的與暫時的規則會在註解中帶一個簡短標記,讓文字仍是純粹的 pf:
#@off allow tcp registry.npmjs.org:443 # 已關閉
allow tcp github.com:443 #@until=1767225600 # 開啟直到此時間(Unix 秒)
allow tcp pypi.org:443 #@until=stop # 開啟直到機器停止
執行發生在 Mac 上,分兩層:虛擬網路交換器依目的地 IP 與在 DNS 中看到的主機名稱檢查每一條連線(所有協定),而代理伺服器再依 TLS 伺服器名稱、以及對 web 規則再依 HTTP 方法檢查一次。這正是一台機器能讀取它不能寫入的 API 的原因:allow web api.example.com GET,POST 給代理程式的是沒有變更的查詢,不論它用什麼工具。
每一項判定都會連同做出判定的規則記錄在安全性時間軸中,並在已註冊的 Mac 上傳送給你的組織。
記錄允許的連線
被封鎖的連線一律會記錄。位於未匹配流量選項之下的記錄允許的連線,決定防火牆放行的連線是否也要記錄——正是它讓這些列有**封鎖…與規則…**快速動作。在你做出選擇之前,機器有規則(或拒絕未匹配流量)時它是開啟的,沒有防火牆的機器則是關閉的,所以沒有規則的機器不會讓時間軸塞滿「允許」的列。
無論如何,允許的連線都保持低噪音:每個目的地(主機、連接埠與通訊協定——位於多個位址後的主機算一列)最多每分鐘一列,重複的會以計數摺疊進前一列。Mac 上本機模型的端點永遠不會列出。
注意: 本機模型永遠是可達的:對 Mac 上推論端點的允許規則會被放在你的規則之前,所以就算
default deny也切不斷代理程式與裝置端模型的聯繫。
防火牆下的核心哨兵
核心哨兵屬於 OpenShell 引擎。仍在 Bromure 防火牆下執行它的機器,會顯示一張附 Turn off 的 Kernel sentry is still on 卡片;若你的組織要求哨兵,則顯示「Your organization requires at least …」,且沒有任何控制項。
OpenShell + Sentry
這個引擎的設定分成五張卡片。
政策
「除非有規則允許,否則一律拒絕。即時生效。」Policy 卡片放的是政策本身:一份以 YAML 撰寫、結構描述版本 1 的 NVIDIA OpenShell 沙盒政策。只有 network_policies 規則能允許連線;帶有 protocol 的端點會逐一請求檢查,enforce 會封鎖,audit 只記錄。變更不需重新啟動就會套用到執行中的機器。
卡片上的按鈕:
- 匯入…——以一個
.yaml/.yml檔取代政策。 - 輸出…——將它存成
<machine>-policy.yaml。 - Reset to starter policy——入門政策允許 GitHub(443 埠上的
github.com、api.github.com、**.githubusercontent.com)、唯讀的 npm 與 PyPI(經檢查,enforce),以及 80/443 埠上的 Ubuntu 套件鏡像站。
編輯器下方有一行檢查結果,顯示 Valid policy · N network rules(綠色)或解析錯誤(紅色),之後列出任何警告。開啟 Enforce binaries 時,沒有列出任何 binaries 的規則會以橘色標出:它們什麼也不允許。
核心哨兵
「把安全事件(處理程序啟動、權限變更、模組與 BPF 載入、沙盒拒絕)從 VM 的核心串流給 Bromure,不經過任何代理程式能停掉的東西;啟動之後,核心會被鎖定,連 VM 中的 root 都無法載入程式碼來干擾。」串流中的靜默或缺口,對代理程式看門狗而言都算竄改。
| 模式 | 行為 |
|---|---|
| Best effort | 模組能載入時機器就帶著哨兵執行,否則不帶哨兵。切換到 OpenShell 時會選這個。 |
| Required | 在哨兵就定位之前(已載入,或已回報為何無法載入),VM 中什麼都不會執行。核心會被進一步鎖定(因此也排除了 bpftrace 與 perf 這類核心追蹤工具),而始終沒有連上、也沒說明原因的哨兵會被視為竄改。 |
Mode 在下次 VM 啟動時生效。當你的組織設了最低要求時,以兩者中較嚴格的為準,而在最低要求為 Required 時,Best effort 會呈灰色(「Your organization requires it.」)。在哨兵隨引擎提供之前就設定好的機器,會顯示 Off for this workspace 並附 Turn on。
卡片的狀態列會顯示 Connected · kernel 版本 或 Not connected、負載下遺失了多少事件(若有),以及當 VM 無法載入哨兵時以紅色顯示的 Couldn't start: 原因。哨兵的模組如何送達,請見核心哨兵。
沙盒
當 VM 回報問題時,卡片標題會變成橘色的 Sandbox ⚠︎:檔案系統沙盒或嚴格沙盒沒有套用、預期應有的哨兵無法使用,或客體送來了警告。
| 設定 | 預設 | 作用 |
|---|---|---|
| Enforce binaries | 關閉 | 「規則只適用於它們列出的程式;代理程式會失去 sudo 與 Docker。」VM 中一個屬於 root 的證明程式會回報每條連線背後的程式,而規則的 binaries 必須點名它。每個程式的雜湊值在首次使用時固定下來,被改動過的二進位檔會被拒絕。代理程式沒有任何通往 root 的路:沒有 sudo、沒有 Docker,所有流量都經過透明攔截。下次 VM 啟動時生效。當你的組織或政策的 process 區段要求時,會被鎖定為開啟。 |
| Filesystem & process | 依政策 | 「代理程式只能存取政策列出的路徑。」依政策的 filesystem_policy 與 process 區段,在 VM 中以 Landlock 執行;連 root 都無法解除。兩個區段都沒有時,這一列會顯示「Not confined」並提供 Insert template,它會附加一份典型的 filesystem_policy(系統資料夾唯讀,家目錄與 /tmp 可讀寫)。下次 VM 啟動時生效。 |
| Packages in the home folder | 開啟 | 「pip 安裝到 ~/.local;npm 本來就用 ~/.npm-global。」沙盒沒有 root,所以全系統的安裝行不通。在新的終端機中生效。 |
| System packages on request | 開啟 | 「apt-get install 會先問你;代理程式永遠拿不到 root。」請求會在 Sandbox 抽屜中等候;核准後,Bromure 會從 Ubuntu 的鏡像站安裝正好那些套件。下次 VM 啟動時生效。 |
Enforce binaries 與 Filesystem & process 下方的狀態列,說明 VM 實際套用了什麼:
- Attestor connected: binaries are enforced,或 Attestor not connected: until it is, only Bromure's own rules apply。
- Filesystem 之後接著它的狀態、代理程式以哪個使用者身分執行,以及 Landlock 版本;在 VM 回報之前則是 Filesystem not applied yet。
- Bromure 為自己的管線加入的路徑(Added for Bromure: …)。
- 檔案系統已受限、但二進位檔未強制時:「The agent keeps sudo, so it could stop Bromure's processes in the VM. Turn on Enforce binaries to prevent that.」
- 嚴格沙盒沒有套用時,以紅色顯示:「no session will start and binary rules fail closed. Restarting the VM retries it.」
政策顧問
當請求被擋下時,代理程式可以在 http://policy.local(OpenShell 的顧問 API)提出它需要的那條窄規則,並等待你的決定。被封鎖的連線也會在這裡被草擬成提案。
| Agent proposals | 行為 |
|---|---|
| Off(預設) | 代理程式不能提出規則。被封鎖的連線仍會被草擬成提案。 |
| Ask me | 每個提案都等你決定。 |
| Approve if risk-free | 沒有風險發現的提案會立即核准。連到機器持有憑證的主機、在那裡增加方法,或使用萬用字元、私有位址、資料庫或高號連接埠的提案,一律等你決定。 |
每個待處理的提案會顯示它的規則與目的地、它是 drafted from a block(由封鎖草擬)還是 proposed by the agent(由代理程式提出)、代理程式陳述的意圖、YAML,以及以橘色標出的任何風險發現。如果願意,可以輸入 Reason (sent to the agent on reject),再按 Reject 或 Approve。核准的規則會加入政策並即時生效。Recent decisions 會列出最近五筆。同樣的提案也會出現在 Sandbox 抽屜中。
治理
- Organization boundary——任何機器的政策所能允許的上限。它可以是 Set by your organization (bromure.io)、Set on this Mac(附 Set from file… 與 清除),或 None set.。每次變更政策的儲存都會與它比對:裝有 NVIDIA 的
openshell-prover時用它,否則用 Bromure 內建的檢查。超出邊界的政策,不論是在哪裡編輯的——窗格、Sandbox 抽屜、顧問或 API——都會被拒絕,並附上邊界的摘要。 - Revision history——每次變更政策的儲存都會保留為一個版本(vN,附日期、變更來源與一段短雜湊值)。還原 會把某個版本載回編輯器。
- Rules Bromure adds automatically——如同 OpenShell 的提供者規則,這些規則讓機器的代理程式與它設定的每個憑證都連得到。它們不屬於輸出的政策。
被擋下時代理程式看到什麼
政策拒絕的連線會立刻失敗,不會留下懸著的 socket。在 OpenShell 政策下,被拒絕的代理連線或受檢查的請求,會收到帶有 OpenShell 自己 policy_denied 內文的 HTTP 403:哪一層、主機與連接埠(或方法與路徑),以及規則或原因。政策顧問開啟時,內文也會告訴代理程式如何在 http://policy.local 提出規則。開啟 Tell the agent when policy blocks it(見防護欄)時,代理程式還會在它的對話中被告知它嘗試了什麼、政策禁止這麼做,以及應該來問你而不是繞過去。
設定參考
| 設定 | 類型 | 預設 |
|---|---|---|
| Sandbox engine | Bromure Firewall / OpenShell + Sentry | Bromure Firewall |
| 未匹配流量(防火牆) | 允許 / 拒絕 | 允許 |
| 記錄允許的連線(防火牆) | 核取方塊 | 機器有規則時開啟 |
| 規則(防火牆) | 有順序的表格(新增規則),也以 pf 格式 顯示 | 無 |
| 政策(OpenShell) | YAML,結構描述 v1 | 組織預設,或入門政策 |
| 核心哨兵 Mode | Best effort / Required | OpenShell 下為 Best effort;防火牆下關閉 |
| Enforce binaries | 開關 | 關閉 |
| Packages in the home folder | 開關 | 開啟 |
| System packages on request | 開關 | 開啟 |
| Agent proposals | Off / Ask me / Approve if risk-free | Off |
| Organization boundary | 檔案,或由你的組織設定 | 無 |
規則表格與政策編輯器不會出現在 iPhone、iPad 或 Vision Pro 用戶端上(「Outbound connection rules are edited on the Mac that runs this workspace.」);在 Mac 上設的規則與政策仍然生效。
相關章節
- 沙盒原則、客體沙盒與核心哨兵 — 引擎如何運作。
- 防護欄 — 憑證政策,以及兩種引擎共用的防護。
- 憑證 — OpenShell 提供者設定檔與憑證預留位置。
- 安全性總覽與時間軸 — 每一次封鎖與放行,按機器分,以及網路溯源鏈。