2017-04-04 49 views
0

我需要實現一個類似於Plan 9 cap設備的Linux小型系統。主機所有者(Linux中的root)允許user1模擬user2[email protected]@random-string寫入/dev/caphash。知道random-string的任何user1過程可以將uid更改爲user2[email protected]@random-string更改爲/dev/capuse長寧uid/gid運行未經驗證的進程

在Linux上,任何特權進程都可以通過系統調用模擬任何非特權用戶,但我不知道任何允許水平模擬的機制。 Linux如何做到這一點?

回答

1

塞爾E. Hallyn提交p9auth到Linux內核郵件列表在2010年4月,這將提供非常多的功能(雖然在最後提交的形式,有一個稍微不同的界面)。不幸的是,它並未包含在Linux內核中。

Linux中的基礎安全範例是垂直的,而不是水平的。

權限被分成capabilities,並且它們可以在執行時間被獲取只有。隨時可以刪除額外的權限。在實踐中,無論執行文件系統的用戶身份如何,您都可以使用文件系統功能和setcap實用程序爲無特權的二進制文件提供某些特定的功能。 (使用Linux內核2.6.33和更高版本,任何進程都不能修改另一個正在運行的進程的功能。)

需要注意的關鍵點是,在Linux中,只有特權進程CAP_SETUID)可以在運行時更改其身份。

換句話說,exec在Linux中用於提升權限,當前特權二進制變爲指定用戶(和/或組或補充組),從而失去額外特權。我不知道有什麼機制可以允許非特權進程在沒有exec的情況下更改其credentials

對於OP,這意味着Plan 9界面(/dev/caphash/dev/capuse)將不起作用。在用戶空間中實現的一個可比較的Linux接口將需要執行一個二進制文件作爲憑證更改的一部分,但除此之外,我不太瞭解OP的用例來提出任何建議。

在內核中,這樣的接口顯然是可能的(如此答案中的第一個鏈接所示),而這在vanilla內核中是不可用的。

0

在linux中(和通常在unix中)有一個類似的功能,與可執行文件的某個位權限有關。如果您有一個可執行的二進制文件,標記爲setuid位,那麼當您執行該文件時,內核通過將進程的有效用戶標識設置爲該文件的所有者來運行該可執行文件。因此,如果您擁有執行權限來執行該文件,該機制就可以工作。假設您希望用戶a,bc在執行某些程序時模擬用戶d。您首先在系統中創建一組用戶(組setuid_d),並將其放在所有用戶a,bc。然後您創建可執行文件,使其屬於用戶d,並且組setuid_d。一旦這項工作已經完成,爲用戶droot只能由組setuid_d使文件可執行文件,並激活權限設置UID位

$ chgrp setuid_d program 
$ chown d program 
$ chmod ug+x,o-x,u+s program 
$ program # you'll be effectively user d when executing program 
+0

問題是面向CLI的更多API,但我也會檢查該選項。 – user3368561