是否可以configuration每个用户的Linuxfunction?

似乎在Linux内核中支持细粒度的function ,它允许为进程授予权限,例如打开原始套接字或提高线程优先级,而不授予进程root权限。

但是,我想知道是否有一种方法来授予每个用户的function。 也就是说,允许非根和非suid进程获取这些function。

Solutions Collecting From Web of "是否可以configuration每个用户的Linuxfunction?"

有limits.conf,通过它可以限制一些用户或组的资源。

查看man limits.conf

它可以用libcap来完成 – 它提供了一个PAM模块pam_cap.so。 然而,这不是那么简单:)

每个进程有三个功能集:

  • 有效的(这个过程实际上有上限)
  • 允许的(这个过程可能有的上限 – 有效的超集)
  • 可继承的(这个进程可以传递给子进程的上限)

每个文件具有相同的功能集。 当一个新的二进制文件是exec()'d时,进程的能力根据以下规则改变,其中:

  • pI / pP是进程的初始可继承/允许功能
  • pI'/ pP'/ pE'是进程的新的可继承/允许/有效能力
  • fI / fP / fE是文件的可继承/允许/有效功能
  • &表示交集
  • | 代表工会

      pI'= pI
     pP'= fP |  (pI&fI)
     pE'= fE&pP' 

(从http://www.friedhoff.org/posixfilecaps.html简化)

在大多数情况下,pE'是我们关心的唯一结果。 与libcap链接的程序可以调用setcap()来改变他们的有效上限(只要他们试图请求的上限在允许的集合中),但绝大多数程序不明确地触及它们的上限,所以我们必须(),安排上限是有效的。

有一个具体的例子将有助于理解这里…我厌倦了不得不su运行openvpn,所以我想给自己CAP_NET_ADMIN能力,允许设置路由等。

看最后一条规则( pE' = fE & pP' ),显然在进程的有效集合中有CAP_NET_ADMIN,CAP_NET_ADMIN 必须文件的有效集合中。 所以,功能系统不允许我们简单地说“给sqweek用户授予CAP_NET_ADMIN” – 程序的能力总是很重要。

虽然在文件的有效集中是不够的,但上限还需要在进程的新许可集中。 让我们看看这个规则: pP' = fP | (pI & fI) pP' = fP | (pI & fI) 。 因此,有两种方法可以获得pP'的上限,要么我们将CAP_NET_ADMIN添加到文件的Permitted集合,要么将其添加到文件的Inheritable集合中,并确保它在进程的Inheritable集合中。

如果我们将它添加到文件的Permitted集合中,那么进程的初始功能将变得无关紧要 – openvpn每次运行时都将获得CAP_NET_ADMIN,无论运行的是谁。 这与setuid类似,但提供了更细粒度的方法。 不过,这不是每个用户的粒度,所以让我们看看另一个选项。

注意第一条规则, pI' = pI 。 该进程的可继承的功能不受exec()的影响。 这意味着,我们所需要的只是一个能够将CAP_NET_ADMIN设置为可继承限制的单个libcap程序,并且从此处生成的每个进程都将具有CAP_NET_ADMIN Inheritable。 这是pam模块扮演的角色 – 它在登录期间修改Inheritable集,然后继承所有用户的进程。

总结:

  1. 安装libcap
  2. 配置pam_cap模块(将cap_net_admin sqweek行添加到/etc/security/capability.conf 。如果该文件以前不存在,则添加另一行none *作为合理的默认值。
  3. 登录时启用PAM模块(将auth required pam_cap.so添加到/etc/pam.d/login )。 请务必在单独的终端上测试您的登录信息,然后再进行PAM更改时注销,以免锁定!
  4. 将CAP_NET_ADMIN添加到openvpn的有效和可继承集( setcap cap_net_admin+ie /usr/sbin/openvpn
  5. openvpn调用ip来改变路由表等等,这样需要同样的处理( setcap cap_net_admin+ie /sbin/ip

是的,您可以使用setcap为可执行文件指定一个功能集,该文件可以在运行该可执行文件时授予特定功能。

从能力(7)手册页:

文件功能从内核2.6.24开始,内核支持使用setcap(8)将能力集与可执行文件相关联。 文件功能集存储在名为security.capability的扩展属性(请参阅setxattr(2))中。 写入这个扩展属性需要CAP_SETFCAP功能。 文件能力集与线程的能力集相结合,决定了execve(2)之后线程的能力。


授予每个用户(甚至每个组)的能力的方式将是使用PAM模块。 sqweek的答案显示了如何使用pam_cap来做到这pam_cap

我还没有确认,但我认为SELinux的这个方面可能是你的答案:

http://www.lurking-grue.org/writingselinuxpolicyHOWTO.html#userpol5.1

看看CapOver – 它应该做你想做的。

注意:我没有使用过,因为它没有被移植到2.6.30ish内核API。