題干與適用場景
一個命令列工具需要讀取少量輸入檔、寫入指定輸出目錄,並執行不受信任外掛。部署環境不允許授予額外特權,但核心可能只支援較早的 Landlock ABI。你會如何設計沙箱,驗證規則確實生效,並避免把「限制更嚴格」誤當成「安全已足夠」?
這道題適合 Linux、安全工程、建置系統與多租戶執行平台職位。重點是理解 Landlock 作為可疊加的行程自我約束機制,而不是背誦某個 C 結構。
面試官考察點
- 是否能區分規則域、規則類型、存取權限位元與行程作用域。
- 是否會先探測核心 ABI,再按支援的權限集合建立規則。
- 是否理解沙箱生效後已開啟的檔案描述元不受同樣限制。
- 是否能設計繼承、exec、子行程與執行緒邊界。
- 是否把失敗模式、稽核、回退與測試納入上線方案。
回答前需要釐清的問題
- 工具需要哪些路徑的讀取、建立、刪除、執行與網路能力?
- 外掛是否會 fork、exec、建立執行緒,或把檔案描述元交給子行程?
- 最低支援的核心版本與可接受的安全降級是什麼?
- 行程啟動前是否已開啟日誌、輸入檔、通訊端或裝置?
- 是阻斷高風險操作,還需要 seccomp、容器或 MAC 提供額外邊界?
30 秒回答框架
「我會讓行程先探測 Landlock ABI,再建立規則域,只授予輸入目錄的讀取權限與輸出目錄的建立、寫入權限,接著限制目前執行緒,讓限制由目前執行緒及其後代繼承。規則生效前開啟的檔案描述元需要另外稽核,因為它們可能仍可使用。對不支援的權限位元採最小共同集合;如果核心隔離無法建立,就拒絕執行或進入有明確紀錄的低風險唯讀模式,不靜默當成安全沙箱。」
分步驟深入解答
第一步:定義威脅與最小權限
先列出外掛可能做的動作:讀取主機檔案、覆寫輸出、執行其他程式、刪除目錄、存取網路或利用繼承的描述元。將每個動作映射到 Landlock 支援的檔案層級權限,只允許輸入目錄必要的讀取,以及輸出目錄必要的寫入與建立。未授予的權限保持拒絕,避免先開放根目錄再嘗試收緊。
第二步:依 ABI 探測能力
Landlock 的介面按 ABI 逐步增加權限位元。啟動時讀取目前 ABI 版本,把期望權限分成「必要」與「可選」兩組;可選位元只在核心支援時加入。規則不能使用目前核心不認識的權限位元,否則建立規則可能失敗。把探測結果、規則版本與實際授予集合寫入結構化日誌。
第三步:建立規則域並綁定路徑
建立規則域後,為每個允許的檔案層級開啟目錄描述元,使用路徑規則把權限位元綁到這些目錄。目錄描述元應在可信的啟動階段開啟,避免規則設定階段被外掛替換路徑。規則組合完成後限制目前行程;執行緒與後續 exec 的繼承關係要用測試確認。
第四步:稽核已開啟資源與繼承鏈
Landlock 約束的是後續存取請求,沙箱建立前已開啟的檔案描述元可能仍可讀寫。因此建立規則前關閉不需要的描述元,或把它們標記為受控資源並限制傳遞。檢查標準輸入輸出、日誌、通訊端、目錄句柄與外掛傳入的描述元,並分別驗證 fork、exec、執行緒與子行程的繼承結果。
第五步:設計失敗與組合防線
Landlock 不能取代所有安全機制,也不會自動限制網路、系統呼叫或既有能力。若工具需要更強邊界,可組合 seccomp、容器、使用者命名空間或系統級 MAC。核心規則域建立失敗時,依威脅模型選擇拒絕啟動、唯讀模式或人工核准;任何降級都要告警並帶上原因。
第六步:驗證、觀測與回滾
在 CI 用測試目錄覆蓋允許與拒絕矩陣:讀取輸入成功、寫入輸出成功、讀取其他路徑失敗,刪除與執行依預期失敗,子行程也重複驗證。記錄 ABI、規則雜湊、拒絕計數與結束原因。灰度期間比較誤拒絕率;發現外掛需要額外權限時更新權限清單和測試,不直接開放父目錄。
高品質示範回答
我會先把外掛的檔案、執行與繼承需求列成權限清單,再探測目標核心的 Landlock ABI。規則域只允許輸入目錄的讀取與輸出目錄的建立、寫入,所有可選權限按 ABI 逐位啟用;不支援的必要能力直接判定不可執行。建立規則前關閉不需要的檔案描述元,稽核標準輸入輸出、日誌與通訊端,確認 fork、exec、執行緒和子行程的繼承行為。
呼叫限制目前行程的介面後,我會用允許/拒絕矩陣與真實外掛測試規則,記錄 ABI、規則版本、拒絕操作與降級原因。Landlock 是可疊加的檔案存取邊界,不能取代 seccomp、容器或 MAC;若核心規則無法建立,就拒絕執行或進入明確告警的唯讀模式,絕不靜默繞過。
常見錯誤
- 把 Landlock 當成特權隔離 → 它主要約束行程後續的受控存取 → 按威脅模型組合其他機制。
- 忽略 ABI 差異 → 新權限位元可能在舊核心上無法識別 → 探測並建立最小共同權限集合。
- 沙箱前開啟全部檔案 → 既有描述元可能繼續可用 → 啟動前關閉、稽核並禁止無關描述元繼承。
- 授予父目錄再靠應用邏輯限制 → 外掛可遍歷並存取更多路徑 → 按目錄和權限位元給最小授權。
- 失敗後靜默裸奔 → 操作者不知道隔離缺失 → 拒絕、唯讀降級或人工核准並記錄告警。
- 只測主行程 → fork、exec 與執行緒會改變邊界 → 對每種繼承路徑做拒絕矩陣。
追問及應對
Landlock 能否限制已開啟的檔案?
不能把它當成自動關閉機制。沙箱建立前已開啟的檔案描述元可能繼續使用,因此應在建立規則前關閉不需要的描述元、限制描述元傳遞,並把遺留句柄納入稽核與測試。
ABI 不支援某個權限位元時應該怎麼做?
把權限分成必要與可選。啟動時探測 ABI,只加入受支援的可選位元;若必要能力缺失則拒絕啟動或切換到明確告警的安全模式。不能忽略建立規則失敗,也不能把未知位元強行寫入規則。
為什麼還需要 seccomp 或容器?
Landlock 的核心價值是檔案層級、非特權的自我約束;它不涵蓋全部系統呼叫、網路或主機策略。seccomp、使用者命名空間、容器和 MAC 可分別補足呼叫、身分和系統級邊界,組合時仍要驗證繼承與失敗路徑。