Ale*_*x B 32 linux security permissions linux-capabilities
似乎支持Linux内核中的细粒度功能,它允许为进程授予权限,例如,在不授予进程root权限的情况下打开原始套接字或提高线程优先级.
但是,如果有办法授予每个用户的能力,我想知道的是什么.也就是说,允许非root和非suid进程获取这些功能.
sqw*_*eek 49
它可以用libcap完成 - 它提供了一个PAM模块pam_cap.so.然而这不是很简单:)
每个进程都有三个功能集:
每个文件都具有相同的功能集.当一个新的二进制文件是exec()时,该进程的功能会根据以下规则进行更改,其中:
| 代表工会
pI' = pI pP' = fP | (pI & fI) pE' = fE & pP'
(简化自http://www.friedhoff.org/posixfilecaps.html)
在大多数情况下,pE'是我们唯一关心的结果.与libcap链接的程序可以调用setcap()来更改其有效上限(只要他们尝试请求的上限在Permitted集中),但绝大多数程序都没有明确触及他们的上限,所以我们必须安排上限执行后有效().
有一个具体的例子将有助于理解...我厌倦了'su'运行openvpn,所以我想给自己一个CAP_NET_ADMIN功能,允许设置路由等.
查看最后一条规则(pE' = fE & pP')很明显,要在进程的有效集中使用CAP_NET_ADMIN,CAP_NET_ADMIN 必须位于文件的有效集中.因此,功能系统不允许我们简单地说"将CAP_NET_ADMIN授予用户sqweek" - 程序的功能始终很重要.
虽然在文件的有效集中是不够的,但是上限也需要在进程的新Permitted集中.让我们看看那个规则:pP' = fP | (pI & fI).因此,有两种方法可以获得上限pP',或者我们将CAP_NET_ADMIN添加到文件的Permitted集中,或者我们将它添加到文件的Inheritable集中,并确保它在进程的Inheritable集中.
如果我们将它添加到文件的Permitted set中,那么进程的初始功能就变得无关紧要了 - openvpn每次运行时都会得到CAP_NET_ADMIN,无论是谁运行它.这与setuid类似,但提供了更细粒度的方法.尽管如此,它不是每用户的粒度,所以让我们看看另一个选项.
注意第一条规则pI' = pI.进程的可继承功能不受exec()的影响.这意味着,我们需要的是一个单一的libcap知道程序设置CAP_NET_ADMIN为可继承的帽子,每一个进程产生从那里将也有CAP_NET_ADMIN可继承.这是pam模块扮演的角色 - 它在登录期间修改了可继承集,然后为该用户的所有进程继承.
总结一下:
cap_net_admin sqweek到/etc/security/capability.conf.如果以前不存在该文件,请添加另一行none *以获得合理的默认值.auth required pam_cap.so到/etc/pam.d/login).确保在进行PAM更改时注销之前在单独的终端中测试您的登录信息,这样您就不会锁定自己!setcap cap_net_admin+ie /usr/sbin/openvpn)的有效和可继承集openvpn调用ip更改路由表等,所以需要相同的处理(setcap cap_net_admin+ie /sbin/ip)请注意,/etc/pam.d/login仅管理本地登录 - 您可能想要提供例如./etc/pam.d/sshd类似的治疗.此外,setcap当您的包管理器安装新版本的目标二进制文件时,您添加的任何功能都将被吹走,因此您必须重新添加它们.
caf*_*caf 13
是的,您可以使用它setcap来指定可执行文件的功能集,该功能组可以在运行该可执行文件时授予特定功能.
从功能(7)手册页:
文件功能 从内核2.6.24开始,内核支持使用setcap(8)将功能集与可执行文件相关联.文件功能集存储在名为security.capability的扩展属性(请参阅setxattr(2))中.写入此扩展属性需要CAP_SETFCAP功能.文件功能集与线程的功能集一起确定execve(2)之后线程的功能.
为每个用户(甚至每个组)授予功能的方法是使用PAM模块. sqweek的答案显示了如何使用它pam_cap.
| 归档时间: |
|
| 查看次数: |
29054 次 |
| 最近记录: |