Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否可以为每个用户配置Linux功能?_Linux_Security_Permissions_Linux Capabilities - Fatal编程技术网

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

是否可以为每个用户配置Linux功能?,linux,security,permissions,linux-capabilities,Linux,Security,Permissions,Linux Capabilities,Linux内核中似乎有对的支持,它允许向进程授予权限,以便在不授予进程根权限的情况下执行诸如打开原始套接字或提高线程优先级之类的操作 然而,我想知道的是,是否有一种方法可以授予每个用户的功能。也就是说,允许非root和非suid进程获得这些功能。我还没有确认,但我认为SELinux的这一方面可能是您的答案: 是的,您可以使用setcap为可执行文件指定一个功能集,该功能集可以在可执行文件运行时授予特定的功能 从手册页: 文件功能 从内核2.6.24开始, 内核支持关联 具有可执行文件的功能集 文

Linux内核中似乎有对的支持,它允许向进程授予权限,以便在不授予进程根权限的情况下执行诸如打开原始套接字或提高线程优先级之类的操作


然而,我想知道的是,是否有一种方法可以授予每个用户的功能。也就是说,允许非root和非suid进程获得这些功能。

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


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

从手册页:

文件功能 从内核2.6.24开始, 内核支持关联 具有可执行文件的功能集 文件使用setcap(8)。档案 功能集存储在 扩展属性(参见setxattr(2)) 命名为security.capability。写信给 此扩展属性需要 CAP_设置FCAP功能。档案 功能集,与 线程的功能集, 确定线程的功能 在一个execve(2)之后


为每个用户(甚至每个组)授予功能的方法是使用PAM模块。演示如何使用pam_cap执行此操作查看-它应该可以执行您想要的操作


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

它可以通过libcap完成-它提供了一个PAM模块PAM_cap.so。 然而,事情并不是那么简单:)

每个流程有三个功能集:

  • 有效(此流程实际具有的上限)
  • 允许(此过程可能具有的上限-有效值的超集)
  • 可继承(此进程可以传递给子进程的上限)
每个文件都有相同的功能集。当新二进制文件为exec()d时,进程的功能将根据以下规则进行更改,其中:

  • pI/pP是流程的初始可继承/允许功能
  • pI'/pP'/pE'是流程的新的可继承/允许/有效功能
  • fI/fP/fE是文件的可继承/允许/有效功能
  • &表示交叉点
  • |代表联盟

    pI' = pI pP' = fP | (pI & fI) pE' = fE & pP' π'=π pP'=fP |(pI&fI) pE'=fE&pP'
(简化自)

在大多数情况下,pE'是我们唯一关心的结果。链接到libcap的程序可以调用setcap()来更改它们的有效上限(只要它们尝试请求的上限在允许的范围内),但绝大多数程序都没有显式地触及它们的上限,因此我们必须安排上限在执行后生效()

有一个具体的例子将有助于理解这里。。。我受够了必须“su”来运行openvpn,所以我想授予自己CAP_NET_ADMIN功能,允许设置路由等等

查看最后一条规则(
pE'=fE&pP'
)很明显,要使CAP\u NET\u ADMIN位于流程的有效集合中,CAP\u NET\u ADMIN必须位于文件的有效集合中。因此,能力系统不允许我们简单地说“向用户sqweek授予CAP_NET_ADMIN”-程序的能力始终很重要

但是,仅在文件的有效集合中是不够的,cap还需要在流程的新允许集合中。让我们看看这个规则:
pP'=fP |(pI&fI)
。因此,有两种方法可以在
pP'
中获取cap,要么将cap\u NET\u ADMIN添加到文件的允许集,要么将其添加到文件的可继承集,并确保它位于进程的可继承集中

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

注意第一条规则,
pI'=pI
。进程的可继承功能不受exec()的影响。这意味着,我们只需要一个libcap感知程序将CAP_NET_ADMIN设置为可继承的CAP,由此产生的每个进程也将具有CAP_NET_ADMIN可继承性。这就是pam模块所扮演的角色——它在登录期间修改可继承集,然后为该用户的所有进程继承该可继承集

总结如下:

  • 安装libcap
  • 配置pam_cap模块(将行
    cap_net_admin sqweek
    添加到
    /etc/security/capability.conf
    。如果该文件以前不存在,请添加另一行
    none*
    ,以获得合理的默认值
  • 在登录期间启用PAM模块(将
    auth required PAM_cap.so
    添加到
    /etc/PAM.d/login
    )。在进行PAM更改时,请确保在注销前在单独的终端中测试您的登录,以免将自己锁定在外
  • 将CAP_NET_ADMIN添加到openvpn的有效和可继承集(
    setcap CAP_NET_ADMIN+ie/usr/sbin/openvpn
  • openvpn
    调用
    ip
    来更改路由表等,因此需要相同的处理(
    setcap-cap\u-net\u-admin+ie/sbin/ip

  • 请注意,
    /etc/pam.d/login
    仅管理本地登录-您可能希望给予例如
    /etc/pam.d/sshd
    类似的处理。此外,当您的包管理器安装新版本的目标二进制文件时,您通过
    setcap添加的任何功能都将被破坏,因此您必须重新添加它们。

    +1用于SELinux。它解决了这个问题很好。谢谢,我会考虑的,但是对SELinux来说,对于现有的基础设施来说可能是相当繁重的。是的,我知道你可以设置每个可执行文件的能力。但是,我的问题是,如果你能设置能力。