2015-07-12 56 views
4

是否可以使用一組C庫或系統調用來刪除POSIX上的所有用戶權限,或者至少在Linux上?請注意,我不問如何刪除root特權,這是所有其他StackOverflow搜索結果似乎要求和回答的內容。將特權作爲普通的非root用戶進行沙盒操作?

我想要切換到用戶nobody相同的效果,但如果可能的話更強。也就是說,我希望我的C應用程序執行以下操作:

  • 運行作爲一個普通用戶,root,沒有了setuid文件的權限位
  • 保留訪問特定文件和開放傳出的能力在指定(或全部)目錄的網絡連接
  • 自願和永久失去讀寫文件的能力,尤其是$HOME
  • 如果可能的話,放棄或沙箱的所有其他不必要的能力,就像打開一個監聽套接字

事情我至今認爲不符合該法案:

  • 切換到用戶nobodysetuid/setgid
    • 普通用戶切換到禁止其他用戶(如nobody),並且該應用程序不應該要求root只是切換到nobody
  • Linux/POSIX.1e Capabilities
    • 能力只會增加root般的特權,不能帶走普通用戶的權限
  • 傳統seccomp
    • 我的應用程序將需要的不僅僅是exitsigreturn更多, readwrite

東西看起來有趣,但我找不到文件,似乎是無人維護,或出現不可移植:


那麼是否有一個記錄完善,最好是便攜式的方式來放棄不重要的用戶權限和沙箱過程,而不必首先變成root

+0

你有沒有考慮類似cgroups/namespaces? –

+0

請澄清您的具體問題或添加其他詳細信息,以突出顯示您的需要。正如目前所寫,很難確切地說出你在問什麼。請參閱「如何問問」頁面以獲取有關澄清此問題的幫助。 –

+1

@self強烈反對。這是一個經過深入研究的問題,它有一個很好的描述和一系列相近的事情,但並不真正適合這個解決方案。這實際上是我在很長時間內看到的最好的書面問題之一。 – viraptor

回答

2

任何解決方案都不可能適用於所有的POSIX,因爲POSIX並沒有定義你要找的機制。

僅僅看Linux的需求,可能最簡單的方法就是通過安全模塊實現。任何apparmor,selinux,RBAC都可以完成你所需要的任務,但只能通過外部配置文件 - 而不是內置於你的應用中。問題可能是在所有這些情況下添加配置文件需要root用戶來完成它(但該配置文件也適用於用戶進程)。

幾乎滿足要求的一點更復雜的解決方案是seccomp。儘管它根本不理解路徑(你只能看到指針),但有一些方法可以限制訪問:seccomp策略可以爲每個線程定義,所以你可以重新設計你的系統以獲得一個「路徑驗證線程」,它不會除了閱讀路徑和返回套接字(如果它們符合您的規範)之外,不做任何事情。然後將該線程限制爲recv(),open()send()。線程做其他工作可以放下open()並使用其他服務。

或者,如果您可以在程序啓動時配置路徑,可以將它們放入數組中,將該頁面標記爲只讀,並設置seccomp策略,該策略只接受來自該數組的文件名的open()(這只是一個指針在這種情況下比較)。

在某種程度上,將應用程序分割成具有非常有限責任的獨立進程的方法是您可以在其他系統上覆制的東西,但是沒有與Linux相同的保證。例如,qmail就是一個非常小的進程系統,它可以作爲數據管道(簡化)。在Linux上,你仍然可以對它們應用seccomp,在Solaris上只需在其他系統上刪除exec和其他功能......我不知道,但可能你可以做些什麼。

相關問題