【问题标题】:Drop privileges as regular non-root user for sandboxing?以普通非 root 用户身份删除沙盒权限?
【发布时间】:2015-10-01 02:49:03
【问题描述】:

是否可以使用一组 C 库或系统调用来放弃 POSIX 或至少在 Linux 上的所有用户权限?请注意,我不是在问如何删除 root 权限,这是所有其他 StackOverflow 搜索结果似乎都在询问和回答的问题。

我想要与切换到用户nobody 相同的效果,但如果可能的话,效果会更强。也就是说,我希望我的 C 应用程序执行以下操作:

  • 以普通用户身份运行,不是 root,并且没有 setuid 文件权限位
  • 保留访问特定文件和打开传出网络连接的能力
  • 自愿永久失去在指定(或所有)目录中读写文件的能力,尤其是$HOME
  • 如果可能,放弃或沙箱化所有其他不必要的能力,例如使用accept 打开一个监听套接字

到目前为止我考虑过的不符合要求的事情:

  • setuid/setgid切换到用户nobody
    • 禁止普通用户切换到其他用户(如nobody),应用程序不应要求root只是切换到nobody
  • Linux/POSIX.1e Capabilities
    • 功能只增加root-like权限,不带走普通用户权限
  • 传统seccomp
    • 我的应用程序需要的不仅仅是 exitsigreturnreadwrite

看起来很有趣但我找不到文档、似乎未维护或似乎不可移植的东西:


那么,有没有一种记录良好、最好是可移植的方式来放弃不必要的用户权限并将进程沙箱化,而不必先成为root

【问题讨论】:

  • 你考虑过类似 cgroups/namespaces 的东西吗?
  • 请澄清您的具体问题或添加其他详细信息以准确突出您的需要。正如目前所写的那样,很难准确地说出你在问什么。请参阅“如何提问”页面以获得澄清此问题的帮助。
  • @self 强烈反对。这是一个经过充分研究的问题,具有很好的描述和一系列接近但并不真正适合解决方案的事物。这实际上是我长期以来在 SO 上看到的最好的书面问题之一。
  • 问题是这个问题很容易被讨论。
  • 对于遇到这个问题的未来开发人员,OpenBSD 最近提出了一个tame system call 的建议,这正是我所寻找的。希望它被合并,最终出现一个跨平台的 API。

标签: c linux security sandbox privileges


【解决方案1】:

任何解决方案都不太可能适用于所有 POSIX,因为 POSIX 没有定义您正在寻找的机制。

只看需求和 Linux,可能最简单的方法是通过安全模块来满足它们。 apparmor、selinux、RBAC 中的任何一个都可以满足您的需求,但只能通过外部配置文件 - 而不是内置于您的应用程序中的东西。问题可能是在所有这些情况下添加配置文件都需要 root 用户来执行(但配置文件也适用于用户进程)。

几乎满足要求的稍微复杂一点的解决方案是seccomp。虽然它根本不理解路径(您只能看到指针),但有一些方法可以限制访问:可以为每个线程定义 seccomp 策略,因此您可以重新设计系统以具有“路径验证线程”,它不会如果它们符合您的规范,除了读取路径和返回套接字之外,不要做任何事情。然后将该线程限制为仅recv()open()send()。执行其他工作的线程可以删除open() 并使用其他服务。

或者,如果您可以在程序启动时配置路径,您可以将它们放入一个数组中,将该页面标记为只读,并设置 seccomp 策略,该策略将只接受带有来自该数组的文件名的open()(这只是一个这种情况下的指针比较)。

在某种程度上,将应用程序拆分为职责非常有限的单独进程的方法是您可以在其他系统上复制的方法,但没有与 Linux 上相同的保证。例如,qmail 是一种由非常小的进程组成的系统,它充当数据的管道(简化)。在 Linux 上,您仍然可以对它们应用 seccomp,在 Solaris 上只需删除 exec 和其他功能,在其他系统上...我不知道,但也许您可以做点什么。

【讨论】:

    猜你喜欢
    • 2018-01-30
    • 2012-01-30
    • 1970-01-01
    • 2011-10-03
    • 2013-01-29
    • 2019-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多