五種沙箱 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,並解釋項目為何無法替換用戶全局的同名定義。