【问题标题】:Is it possible to configure Linux capabilities per user? [closed]是否可以为每个用户配置 Linux 功能? [关闭]
【发布时间】:2009-12-24 04:49:31
【问题描述】:

Linux 内核中似乎支持fine-grained capabilities,它允许授予进程权限以执行诸如打开原始套接字或提高线程优先级等操作,而无需授予进程根权限。

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

【问题讨论】:

  • 这个是怎么关闭的?简而言之,现代 stackoverflow
  • 我无法回答,因为它已关闭,但解决方案(使用 Linux 4.3+)是Ambient capabilies——它们完全授予继承的每用户功能。

标签: linux security permissions linux-capabilities


【解决方案1】:

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

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

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

每个文件都有相同的能力集。当一个新的二进制文件被 exec()'d 时,进程的能力会根据以下规则发生变化,其中:

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

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

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

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

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

查看最后一条规则 (pE' = fE & pP') 很明显,要将 CAP_NET_ADMIN 包含在进程的有效集中,CAP_NET_ADMIN 必须文件的有效集中。因此,功能系统不允许我们简单地说“将 CAP_NET_ADMIN 授予用户 sqweek” - 程序的功能始终很重要。

仅仅在文件的有效集中是不够的,上限还需要在进程的新允许集中。让我们看看这条规则:pP' = fP | (pI & fI)。所以我们有两种方法可以在pP' 中获取上限,或者将 CAP_NET_ADMIN 添加到文件的 Permitted 集中,或者将其添加到文件的 Inheritable 集中并确保它在进程的 Inheritable 集中。

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

注意第一条规则,pI' = pI。进程的 Inheritable 功能不受 exec() 的影响。这意味着,我们只需要一个可识别 libcap 的程序将 CAP_NET_ADMIN 设置为 Inheritable cap,并且从那里产生的每个进程具有 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

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

【讨论】:

  • 不过,它对我们来说用处不大,所以让我们看看另一个选项。 为什么它没有多大用处?在多用户系统中,我可以看到限制,它授予所有用户该功能,所以如果你想在每个用户的基础上这样做,它没有多大用处。但是今天的大多数 Linux 机器实际上都是单用户机器,所以我看不出有什么问题。 (嗯,可能有一些服务以不同的用户身份运行。)
  • 我不确定该说什么,因为您已经回答了自己的问题。 OP 询问如何设置 per user 的功能,并在文件的允许集上添加大写以 per binary 为基础控制它们(需要明确的是,这仍然很有用功能)。我同意这在许多系统上是一个有争议的问题,但即便如此解释如何为特定二进制文件设置功能并不能回答所提出的问题。
  • 你当然是对的。在研究您的答案时,我已经忘记了原来的问题。我现在已经阐明了原因,让我们看看我的编辑是否获得批准。
  • 看起来像。顺便说一句,我不得不收回我的声明“我同意这在许多系统上是一个有争议的问题”,我昨天一定感觉非常愉快:P。即使在单个用户系统上,不同的帐户也有应用程序。例如,虽然我是笔记本电脑的唯一用户,但我在单独的用户帐户下运行 Web 浏览器,这样浏览器中的漏洞本身就无法暴露我的个人数据。显然我不想让这个帐户修改我的网络路由:P
  • @John libcap 提供了一个使用 linux 功能的接口。大概您可以通过直接系统调用获得相同的结果,但是答案中提到的实用程序(setcappam_cap.so)都依赖于 libcap(在我的系统上,它们甚至分布在同一个包中)。
【解决方案2】:

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

来自capabilities(7) 手册页:

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


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

【讨论】:

  • 是的,我知道您可以为每个可执行文件设置功能。但是,我的问题是,您是否可以设置 per-user 的功能,也就是说,在该用户下运行的所有可执行文件都被授予某些功能。
【解决方案3】:

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

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

【讨论】:

  • +1 用于 SELinux。它很好地解决了这个问题。
  • 谢谢,我会考虑的,但是切换到 SELinux 对现有基础架构来说可能相当繁琐。
【解决方案4】:

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

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

【讨论】:

    猜你喜欢
    • 2021-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-28
    相关资源
    最近更新 更多