2014-02-23 43 views
0

有沒有辦法在C中爲基於Linux的系統提供唯一權限的進程?我基本上想限制一個進程(由一個主機啓動,比如一個事件處理程序)編輯其工作目錄外的任何文件,以及創建套接字等。獨特的進程權限Linux

要做到這一點的唯一方法是讓主機進程爲它產生的每個進程創建一個新用戶,然後銷燬用戶?

+1

這可能是矯枉過正,但這種事情可以用'chroot()'來處理。 – jxh

+1

危險之處在於大多數可能的機制都需要root權限才能實現更改。你可以查看'chroot()',但要注意爲'chroot()'程序創建合適的環境是非常棘手的。你可以看看BSD'監獄';您可以考慮簡單地將真實有效的UID和GID設置爲無法更改目錄之外任何內容的用戶/組(但請注意,它仍將能夠讀取可公開訪問的文件,例如/ etc/passwd) 。 –

回答

2

標準答案是chroot,它將進程的根目錄(及其子目錄)設置爲給定的目錄。

但是,如果您希望獲得更好的答案,以便隔離進程的所有方面而不僅僅是其文件系統,請查看unshare系統調用(作爲函數包含在現代glibc中)。這就是容器的構建方式。

+0

我是否需要root權限才能執行「unshare」調用? –

+1

這個http://man7.org/linux/man-pages/man2/unshare.2.html暗示不適用於'CLONE_FS'。您將需要root(更準確地說'CAP_SYS_ADMIN')用於某些其他'unshare'調用。就我個人而言,我沒有使用'CLONE_FS'沒有其他人。 – abligh

+1

另外注意技術上'chroot()'需要'CAP_SYS_CHROOT'而不是根或'CAP_SYS_ADMIN',儘管通常他們會在一起。 – abligh

1

你可以使用舊setuid技術,以你的進程切換到nobody UID和GID nogroup。這些ID用於使進程無法寫入任何文件(除了在所有可寫目錄中)。