Linux

我可以為目前程序樹設置資源限制嗎?

  • December 29, 2018

假設我在一個資源受限的系統上執行,並且我想確保我執行的應用程序打開的文件總數不超過 10個。

如果我嘗試使用setrlimit,例如:

if (fork() == 0) {
   struct rlimit l = { 10, 10 };
   setrlimit(RLIMIT_NOFILE, &l);
   execl(EVIL_PROGRAM, args);
}

thenEVIL_PROGRAM將繼承 10 個打開文件描述符的限制。但是,如何阻止惡意/編碼不佳的應用程序生成 X 子程序,所有這些子程序都有 10 個打開的文件?(這是一個真實的場景)。

我不想阻止它完全創建子程序(這應該由 global 管理limits.conf),只是為了對打開文件的數量設置一個合理的限制。

我找到了為此目的使用 cgroups 的參考資料,但我認為您必須是 root 才能使用此功能?

專門針對setrlimit

以下是您可能希望研究的一些更有用的命令選項;從man頁面中拉出它們。

  • RLIMIT_NOFILE指定一個比該程序可以打開的最大文件描述符數大一的值。
  • RLIMIT_NPROC可以為呼叫程序的真實使用者 ID 創建的最大程序數(或更準確地說,在 Linux 上是執行緒)。遇到這個限制
  • RLIMIT_SIGPENDING指定可能為呼叫程序的真實使用者 ID 排隊的信號數限制。為了檢查這個限制,標準和實時信號都被計算在內。

似乎還可以設置其他非常酷的限制,所以我很感激我遇到了你的問題,因為它向我展示了另一個用於控制流程的工具。

通用 Unix/Linux

我相信您正在尋找的應用程序限制工具的通用術語稱為SandboxUNIX,它看起來像ContractorPassenger是可靠的選擇,對於 Linux,我已經看到DockerKVMFirejail用於像 Raspberry Pi B+v2 或 dule 這樣受限制的系統核心上網本。對於大多數沙盒操作,您需要一個能夠虛擬化的系統和核心。在我見過Selinux的最新 CyonagenMod ROM 上使用的 Android 等系統上,如果你想使用 chroot 應用程序,這有點令人沮喪……但我離題了,在我執行 Ubuntu 的一些系統上,我遇到過Apparmor當新安裝的程序嘗試打電話回家時彈出錯誤具有持久連接。可以說有很多選項可用於控制特定程序或程序集可以執行、查看和/或與之通信的內容,以及可能使用多少 CPU 和 GPU 資源。

如果你能讓它正常工作(有點不確定,因為我仍在與開發人員合作以使 ARMhf 二進製文件正常工作),對於你的使用場景,最好的方法是 Firejail,作為託管在開發人員首頁封面上的指南可以根據您的需要進行修改的雙遊戲裝備。與其他提到的(據我所見)相比,它的記憶體佔用量較低,並且對於程序可以訪問哪些文件以及是否允許持久性具有高度可配置性。這將有利於測試,因為您將擁有一個可重複、可定制且最終可在需要時刪除的固定工作環境。

對於沒有完全虛擬化支持的系統,我看到 selinux 通常用於對已經存在的user/group權限設置定義更嚴格的規則,以保持讀取和寫入權限。在那裡搜尋的術語是Linux name space permissions,事實證明有很多隱藏的方式可以限制操作,但所有這些選項的最大漏洞root甚至是在建構良好的 chroot 監獄中,如果有辦法在監獄或沙箱中獲得 root 權限,那麼那裡是升級到執行被監禁程序的使用者 ID 的方法。

基本上,一個程序應該有多個層次需要突破,即對於一個 Web 伺服器,我將設置一組限制性的防火牆規則,日誌閱讀器以動態添加規則和更改防火牆設置(fail2ban 與自定義操作和腳本),然後是一個 chroot 監獄,它的目錄結構中只有 web 伺服器所需的依賴項,綁定到 1024 以上的埠,因此它甚至不請求套接字綁定的根級別權限,並將這些權限包裝在虛擬化沙箱中(可能與 Firejail 一起使用),它有一個執行滲透檢測措施的主機,例如tripwirehoneyd它們各自的監獄中。如此一來,.php不應在公共伺服器上修改的 if 和類似程式碼確實會受到不良影響它被忽略,back-ips resored 並且罪犯被禁止將來訪問。

在您的範常式式碼中,您似乎沒有在網路方面做太多事情,但很可能會從另一個腳本或函式呼叫它,並且因為它顯然正在呼叫子程序,您需要弄清楚如何清理輸入,並在每一步擷取錯誤(查找導致 Chrome 瀏覽器終止的連結以了解原因),並確保特權使用者不會讀取或破壞未經處理的輸入(查找如何添加shell-shock到 Firefox 的瀏覽器 ID 來說明原因),如果呼叫或返回輸出涉及網路,則程序綁定的埠應該在非特權埠上(如果它是一個網路應用程序,請使用 iptables/firewall 進行轉發) )。雖然有很多選項可以鎖定係統的服務以供考慮,但似乎也有很多選項可以測試程式碼的易碎性;Metasploit並且drone.io是兩個相當知名的滲透測試和程式碼測試選項,您可能希望在有人為您執行之前對其進行研究。

引用自:https://unix.stackexchange.com/questions/253159