是否可以为每个用户配置Linux功能?

时间:2009-12-24 04:49:31

标签: linux security permissions linux-capabilities

在Linux内核中似乎支持fine-grained capabilities,它允许向进程授予权限,例如,在不授予进程root权限的情况下打开原始套接字或提高线程优先级。

但是,如果有办法授予每用户功能,我想知道的是什么。也就是说,允许非root和非suid进程获取这些功能。

5 个答案:

答案 0 :(得分:46)

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

每个流程都有三个功能集:

  • 有效(此过程实际拥有的上限)
  • 允许(此过程可能具有的上限 - 有效的超集)
  • 可继承(此进程可以传递给子进程的大写)

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

  • 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()来更改其有效上限(只要他们尝试请求的上限在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集中,或者我们将它添加到文件的可继承集中,并确保它在进程的可继承集中。

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

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

总结:

  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
  6. 请注意,/etc/pam.d/login仅管理本地登录 - 您可能想要提供例如。 /etc/pam.d/sshd类似的治疗。此外,当您的软件包管理器安装新版本的目标二进制文件时,您通过setcap添加的任何功能都将被吹走,因此您必须重新添加它们。

答案 1 :(得分:11)

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

来自capabilities(7)手册页:

  

文件功能   从内核2.6.24开始,   内核支持关联   功能集与可执行文件   使用setcap(8)的文件。文件   功能集存储在   扩展属性(参见setxattr(2))   命名为security.capability。写给   这个扩展属性需要   CAP_SETFCAP功能。文件   能力集,与   线程的功能集,   确定线程的功能   在执行后(2)。


为每个用户(甚至每个组)授予功能的方法是使用PAM模块。 sqweek's answer显示了如何使用pam_cap完成此操作。

答案 2 :(得分:6)

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

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

答案 3 :(得分:3)

看看CapOver - 它应该做你想做的事。

注意:我没有使用它,因为它(但是?)已被移植到2.6.30ish内核API。

答案 4 :(得分:-7)

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

查看man limits.conf