五種沙箱 Profile
workspace、devbox、read-only、strict、off 定義檔案系統和子行程網路的不同能力集合。名稱提供方向,真實邊界要看解析後的 capability set。
能從 ProfileName 和 SandboxProfile 判斷讀寫與網路邊界,能正確配置 custom extends,並識別平臺支援與降級條件。
Profile 是多維能力預設
橫向位置用於幫助記憶。devbox、workspace、strict 的實際差異同時包含預設讀取、可寫路徑與網路策略。
全檔案系統預設可讀;workspace、GROK_HOME、臨時目錄可寫;不限制子行程網路。
default_read=truerestrict_network=false
全檔案系統預設可讀;列舉根目錄,除 /data 與虛擬檔案系統外廣泛授予寫權限;網路不限制。
/data 保持可讀,在 Linux 透過 bwrap 做防寫全檔案系統預設可讀;workspace 不可寫;GROK_HOME、臨時目錄和必要裝置仍可寫。
restrict_network=true關閉全域預設讀,只開放系統執行目錄與 workspace;workspace、GROK_HOME、臨時目錄可寫。
default_read=falserestrict_network=true
跳過 capability set 應用,記錄「Sandbox disabled」。它也接受別名 none。
不可作為 custom extends 的基類extends 規則
- custom 預設從 workspace 開始。
- 可 extends workspace、devbox、read-only、strict。
- 不能 extends off/none。
- 不能 extends 另一個 custom profile。
- read_only、read_write、deny 追加到基類。需要限制子行程網路時,應在 custom 中顯式設定 restrict_network=true。
全域優先保護
系統先讀取 ~/.grok/sandbox.toml,再讀取 .grok/sandbox.toml。專案配置只能新增 profile 名稱。若專案宣告了全域已存在的同名 profile,merge 使用 entry.or_insert,全域定義保持生效。
檔案系統約束
啟用 enforce 且執行在 Unix 時,nono 將 capability set 應用到 Landlock 或 Seatbelt。macOS deny 使用 Seatbelt 規則;Linux 的子路徑 read-deny 還需要 bwrap bind-over。
網路約束
主行程網路保持開放以存取模型 API。restrict_network 當前透過子行程過濾表達,原始碼中的 seccomp 實現在 Linux 生效,非 Linux 函式為空操作。平臺邊界需要按實際構建與執行環境驗證。
pub enum ProfileName {
#[default]
Workspace,
Devbox,
ReadOnly,
Strict,
Off,
Custom(String),
}
快照說明:列舉完整保留。光譜圖用於教學記憶;真實能力來自 resolve()、essential_writable_paths() 與平臺 apply 結果。
課堂練習:設計審查專用 Profile
要求能讀倉庫與系統工具、不能改 workspace、允許寫臨時目錄、限制子行程網路,並額外 deny ~/.ssh。選擇一個內建基類,寫出 custom profile 的 extends 與 deny,並解釋專案為何無法替換使用者全域的同名定義。