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

Ale*_*x B 32 linux security permissions linux-capabilities

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

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

sqw*_*eek 49

它可以用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集中,或者我们将它添加到文件的Inheritable集中,并确保它在进程的Inheritable集中.

如果我们将它添加到文件的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)

请注意,/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.

  • 是的,我知道您可以为每个可执行文件设置功能.但是,我的问题是,如果您可以设置*per-user*的功能,也就是说,在用户下运行的所有可执行文件都被授予某些功能. (6认同)

gah*_*ooa 6

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

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