如何在没有root的情况下“监禁”进程?


26

如果是root用户,我可以简单地创建一个虚拟用户/组,相应地设置文件许可权,然后以该用户身份执行该过程。但是我不是,所以有没有办法做到这一点而无需root?


1
@alex:我有一个脚本可以执行多个模拟(在不同目录中),并且想要确保无论编程多么糟糕,它们都只能访问自己目录中的文件,而不会意外修改例如其他模拟的输出
Tobias Kienzler

2
@Tobias:我明白你的意思。 chroot会自然地适合那里,但又又不是根。
alex

1
我认为selinux,apparmor和grsecurity 也许可以做到这一点,但我不确定。但是如果这些都不可用或由系统管理员配置,则可以解决。
xenoterracide 2011年

4
多年来,我一直想知道这个问题。这似乎是一个自然的愿望:无需root用户,便能够在放弃用户某些权限的情况下运行进程,即能够将进程限制为用户设置的“监狱”,这甚至会使进程权限少于您的用户。遗憾的是,通常的Unices并没有提供这种标准!
imz-伊万·扎哈拉里舍夫(Ivan Zakharyaschev)2011年

2
尝试让系统管理员为您提供第二个用户帐户。
LawrenceC

Answers:


23

更多类似的Qs和更多值得关注的答案:

注意:某些答案指向此处尚未提及的特定解决方案。

实际上,有许多实施方法不同的jaail工具,但是其中的许多工具要么设计不安全(例如fakerootLD_PRELOAD基于-),要么不完整(例如fakeroot-ngptrace基于-),或者需要root用户(chrootplashfakechroot中提到)警告标签)。

这些只是示例;我想将所有这些功能并排列出,并指明这两个功能(“可以信任吗?”,“需要建立根目录?”),也许在操作系统级别的虚拟化实现中就可以了

通常,这些答案涵盖了所描述的所有可能性,甚至还包括:

虚拟机/操作系统

内核扩展(例如SELinux)

  • (在此处的评论中提到),

chroot

基于Chroot的助手(但是必须为setUID root,因为它chroot需要root;或者可能chroot在隔离的名称空间中工作-参见下文):

[更多地介绍它们!]

基于chroot的已知隔离工具:

跟踪

另一个值得信赖的隔离解决方案(基于a seccomp解决方案除外)将是通过进行完整的syscall拦截ptrace,如联机帮助页中有关fakeroot-ng以下内容的说明:

与以前的实现不同,fakeroot-ng使用的技术使跟踪的进程不会选择是否使用fakeroot-ng的“服务”。静态编译程序,直接调用内核并操纵自己的地址空间是所有可用于绕过基于LD_PRELOAD的进程控制的技术,这些技术并不适用于falseroot-ng。从理论上讲,有可能以对跟踪过程进行完全控制的方式来铸造假根。

尽管从理论上讲这是可能的,但尚未完成。Fakeroot-ng确实假设了有关要跟踪的过程的某些“行为良好”的假设,并且打破这些假设的过程可能能够(如果不能完全逃脱)至少规避了fakeroot-施加于其上的某些“假”环境。 ng。因此,强烈警告您不要将fakeroot-ng用作安全工具。错误报告称,某个进程可以故意(而不是无意间)逃脱了假root-ng的控制,或者被关闭为“不是错误”,或者被标记为低优先级。

将来可能会重新考虑此政策。但是,暂时已经警告您。

不过,正如您所阅读的那样,它fakeroot-ng本身并不是为此目的而设计的。

(顺便说一句,我想知道为什么他们选择seccomp对铬使用基于方法,而不是ptrace基于...)

在上面未提及的工具中,我为自己提到了Geordi,因为我喜欢控制程序是用Haskell编写的。

基于ptrace的已知隔离工具:

seccomp

实现隔离的一种已知方法是通过Google Chromium中使用的seccomp沙箱方法。但是这种方法假设您编写了一个助手,该助手将处理某些(允许的)“拦截”文件访问和其他系统调用。当然,还要努力“拦截”系统调用并将它们重定向到帮助程序(也许,这甚至意味着在受控进程的代码中替换被拦截的系统调用;这样,听起来不相当简单;如果您有兴趣,最好阅读详细信息,而不仅仅是我的回答)。

更多相关信息(来自Wikipedia):

(如果要seccomp在Chromium之外寻找基于通用的解决方案,那么最后一项似乎很有趣。还有一篇博客文章值得“ seccomp-nurse”的作者阅读:SECCOMP作为Sandboxing解决方案?。)

“ seccomp-nurse”项目中的这种方法的说明:

                      在此处输入图片说明

未来Linux可能有“灵活”的seccomp吗?

在2009年曾经出现过对Linux内核进行修补的建议,以使该seccomp模式具有更大的灵活性-从而“可以避免我们目前需要的许多杂技”。(“杂技”指的是编写帮助程序必须代表被监禁的进程执行许多可能无辜的syscall,并在被监禁的进程中替换可能无辜的syscall的复杂情况。)LWN文章写道:

提出的一个建议是向seccomp添加新的“模式”。API的设计思想是不同的应用程序可能具有不同的安全性要求。它包含一个“模式”值,该值指定应施加的限制。只有原始模式曾经实现过,但肯定可以添加其他模式。创建允许启动过程指定将允许哪些系统调用的新模式,将使该功能在诸如Chrome沙箱之类的情况下更加有用。

亚当·兰利(Adam Langley)(也是Google的)发布了一个补丁程序。新的“模式2”实现接受一个位掩码,该位掩码描述了可访问的系统调用。如果其中之一是prctl(),则沙盒代码可以进一步限制其自身的系统调用(但无法恢复对已拒绝的系统调用的访问)。总而言之,这看起来像是一个合理的解决方案,可以使沙盒开发人员的生活更加轻松。

也就是说,此代码可能永远不会合并,因为此后讨论已转移到其他可能性。

这种“灵活的seccomp”将使Linux的可能性更接近于在OS中提供所需的功能,而无需编写复杂的帮助程序。

(一篇博客文章,其内容与此答案基本相同:http : //geofft.mit.edu/blog/sipb/33。)

命名空间(unshare

通过名称空间进行隔离(unshare基于-解决方案)(此处未提及),例如,要限制不可信进程的文件系统访问,取消共享安装点(与FUSE结合使用)可能是可行解决方案的一部分。

现在,有关名称空间的更多信息,因为它们的实现已经完成(这种隔离技术在nme “ Linux容器”或“ LXC”下也是众所周知的,不是吗?):

“命名空间的总体目标之一是支持容器的实现,这是用于轻量级虚拟化(以及其他目的)的工具”

甚至可以创建一个新的用户名称空间,这样“一个进程可以在用户名称空间外具有一个普通的非特权用户ID,而同时在该名称空间内具有一个用户ID0。这意味着该进程具有完全的root特权。用于用户名称空间内的操作,但没有权限用于名称空间外的操作”。

有关执行此操作的实际工作命令,请参见以下答案:

和特殊的用户空间编程/编译

但是好吧,当然,所需的“监狱”保证可以通过在用户空间进行编程来实现(无需操作系统对此功能的额外支持;也许这就是为什么此功能并未被包括在操作系统设计中的原因) ); 或多或少的并发症。

所提到的ptrace-或者seccomp基于沙箱可以被看作是一些写一个沙盒辅助,将控制你的其他进程,这将被视为“黑盒子”,任意Unix程序执行担保的变体。

另一种方法是使用可以关心必须禁止的影响的编程技术。(必须由您来编写程序;然后它们不再是黑匣子了。)要说一种,使用像Haskell这样的纯编程语言(这将迫使您进行编程而没有副作用)只会使程序是显式的,因此程序员可以轻松地确保不会出现不允许的效果。

我猜想,对于那些使用其他语言(例如Java)进行编程的人来说,有沙盒工具。


那里的答案中也指向一些积累有关该主题信息的页面:


无根GoboLinux也可能是一个选择...
Tobias Kienzler 2013年

@tobias但是Rootless Gobolinux是否能保证用户编写的程序不会访问外部环境?..
imz-Ivan Zakharyaschev 2013年

1
并非如此-我在某种程度上误以为它也允许一个人成为“本地”根用户,然后可以简单地为该过程创建虚拟用户-尽管可能可以使用它chroot,但这仍然可能需要真正的根特权...
Tobias Kienzler 2013年

8

这是unix权限模型的基本限制:只有root可以委托。

您无需root用户即可运行虚拟机(并非所有VM技术都如此),但这是一个重量级的解决方案。

用户模式Linux是一种相对轻量级的Linux-on-Linux虚拟化解决方案。设置起来并不容易。你需要填充一个根分区(在一个目录)至少需要启动的最小(在几个文件/etc/sbin/init和它的依赖,登录程序,外壳和实用程序)。


1

我想您可能会幸运LD_PRELOAD地拦截对某些文件的访问,但这可能真的很棘手。


Google Chromium的seccomp沙箱可以做更可靠的事情-syscall拦截。- unix.stackexchange.com/questions/6433/...
IMZ -伊万Zakharyaschev

尝试拦截某物与进行装箱(例如Chromium)之间的区别是隔离的保证。
imz –伊万·扎哈拉里舍夫(Ivan Zakharyaschev)2011年

1
通过拦截LD_PRELOAD无法被信任(可以绕开),但是可以拦截ptrace
imz –伊万·扎哈拉里舍夫(Ivan Zakharyaschev)2011年

1
< joey.kitenet.net/blog/entry/fakechroot_warning_label > 在此处提供了一个简单的示例,该示例显示LD_PRELOAD基于基础的解决方案不能作为一种安全措施而被信任。
imz –伊万·扎哈拉里舍夫(Ivan Zakharyaschev)2011年

0

从完整列表中,我只需添加:

  • fakeroot(来自debian软件包维护者):它旨在使用“友好”工具构建软件包。这不是一个完整的隔离,但是它有助于使用不同的用户,伪造的设备和其他特殊的伪文件来构建软件包。

  • fakechroot(使用fakeroot)。该程序有很多错误。例如,“ / etc / hosts”在glibc中进行了硬编码:您无法通过此工具进行更改。

  • qemu:您需要编译linux内核,但是结果非常快,这是具有真实root特权的“假”(即虚拟)计算机。您可以构建和安装任何引导映像。


0

Firejail是用于监禁任何进程的好工具,无论是否具有root用户访问权限,它都有很多选项,而且非常灵活:


2
欢迎提供更多有关如何使用firejail的详细信息。该链接失效后,您的答案信息内容将仅变为实用程序的名称。(如果分发包中有可用的软件包,如何使用等,请在此处包括)。
安东
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.