关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。
想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。
5年前关闭。
Improve this question
似乎有对 fine-grained capabilities 的支持在 Linux 内核中,它允许向进程授予权限以执行诸如打开原始套接字或提高线程优先级之类的操作,而无需授予进程 root 权限。
但是,我想知道是否有办法授予每个用户的功能。也就是说,允许非 root 和非 suid 进程获得这些能力。
最佳答案
它可以通过 libcap 来完成——它提供了一个 PAM 模块 pam_cap.so。
然而事情并没有那么简单:)
每个流程具有三个能力集:
每个文件都具有相同的功能集。当一个新的二进制文件被 exec()'d 时,进程的能力根据以下规则改变,其中:
pI' = pI
pP' = fP | (pI & fI)
pE' = fE & pP'
(简化自 http://www.friedhoff.org/posixfilecaps.html )
在大多数情况下,pE' 是我们唯一关心的结果。与 libcap 链接的程序可以调用 setcap() 来更改它们的有效上限(只要它们尝试请求的上限在 Permitted 集合中),但是绝大多数程序并没有明确地触及它们的上限,因此我们必须安排上限在 exec() 后生效。
有一个具体的例子将有助于理解这里......我厌倦了必须'su'运行openvpn,所以我想授予自己CAP_NET_ADMIN功能以允许设置路由等。
查看最后一条规则 (
pE' = fE & pP'
) 很明显,在进程的有效集合 CAP_NET_ADMIN 中有 CAP_NET_ADMIN 。必须位于文件的有效集中。因此,能力系统不允许我们简单地说“将 CAP_NET_ADMIN 授予用户 sqweek”——程序的能力总是很重要的。但是,在文件的 Effective 集中是不够的,上限还需要在进程的新 Permitted 集中。让我们看看这条规则:
pP' = fP | (pI & fI)
.所以我们可以通过两种方式获得 pP'
中的上限,要么我们将 CAP_NET_ADMIN 添加到文件的 Permitted 集中,要么我们将其添加到文件的 Inheritable 集中并确保它在进程的 Inheritable 集中。如果我们将它添加到文件的 Permitted 集合中,那么该进程的初始能力就变得无关紧要了——openvpn 每次运行都会得到 CAP_NET_ADMIN,不管是谁运行的。这类似于 setuid,但提供了更细粒度的方法。尽管如此,它不是每个用户的粒度,所以让我们看看另一个选项。
注意第一条规则,
pI' = pI
.进程的可继承能力不受 exec() 的影响。这意味着,我们只需要一个独立的 libcap 感知程序来将 CAP_NET_ADMIN 设置为可继承的上限,并且从那里产生的每个进程也将具有 CAP_NET_ADMIN 可继承的。这是 pam 模块扮演的角色 - 它在登录期间修改 Inheritable 集,然后为该用户的所有进程继承该集。总结一下:
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
添加的任何功能当您的包管理器安装目标二进制文件的新版本时,会被吹走,因此您必须重新添加它们。
关于linux - 是否可以为每个用户配置 Linux 功能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1956732/