我需要为Linux实施类似于Plan 9 cap
设备的小型功能系统。主持人(Linux中为root
)允许user1
冒充user2
向user1@user2@random-string
撰写/dev/caphash
。任何知道user1
的{{1}}进程都可以将其random-string
更改为uid
,将user2
更改为user1@user2@random-string
。
在Linux上,任何特权进程都可以使用setuid(2)
系统调用模拟任何非特权用户,但我不知道任何允许水平模拟的机制。 Linux如何做到这一点?
答案 0 :(得分:1)
Serge E. Hallyn于2010年4月向Linux内核邮件列表提交了p9auth,该列表提供了相当多的功能(尽管在最后提交的表单中,界面略有不同)。不幸的是,它没有包含在Linux内核中。
Linux中的基础安全范例是纵向的,而不是水平的。
权限分为capabilities,只能在执行时获取 。可以随时删除额外的权限。实际上,无论执行它的用户的身份如何,您都可以使用文件系统功能和setcap
实用程序为非特权二进制文件执行某些特定功能。 (对于Linux内核2.6.33及更高版本,任何进程都不可能修改另一个正在运行的进程的功能。)
要注意的关键点是,在Linux中,只有特权进程(具有CAP_SETUID
的进程)才能在运行时更改其标识。
换句话说,在Linux中使用 exec 来提升权限,现在特权二进制更改为指定用户(和/或组,也许是补充组),额外删除特权。我不知道有任何机制允许非特权进程在没有exec的情况下更改其credentials。
对于OP,这意味着Plan 9界面(/dev/caphash
,/dev/capuse
)将无效。在用户空间中实现的类似Linux接口将需要二进制的exec作为凭证更改的一部分,但除此之外,我不知道OP的用例是否足以提出任何建议。
在内核中,这样的接口显然是可能的(如本答案中的第一个链接所示),只是在vanilla内核中不可用。
答案 1 :(得分:0)
在linux(以及一般的unix)中,有一个类似的功能,它与可执行文件的一个位权限有关。如果您有一个标记为 setuid 位的可执行二进制文件,那么当您执行该文件时,内核会通过将该进程的有效用户ID设置为该文件的所有者来运行该可执行文件。因此,如果您具有执行该文件的执行权限,则该机制可用。假设您希望用户a
,b
和c
在执行某些程序时模拟用户d
。您首先在系统中创建一组用户(组setuid_d
),然后将所有用户a
,b
和c
添加到其中。然后,您创建可执行文件,使其属于用户d
和组setuid_d
。完成此操作后,用户d
或root
仅使文件可由组setuid_d
执行,并激活权限中的set 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