如果是root用户,我可以简单地创建一个虚拟用户/组,相应地设置文件许可权,然后以该用户身份执行该过程。但是我不是,所以有没有办法做到这一点而无需root?
chroot
会自然地适合那里,但又又不是根。
如果是root用户,我可以简单地创建一个虚拟用户/组,相应地设置文件许可权,然后以该用户身份执行该过程。但是我不是,所以有没有办法做到这一点而无需root?
chroot
会自然地适合那里,但又又不是根。
Answers:
更多类似的Qs和更多值得关注的答案:
注意:某些答案指向此处尚未提及的特定解决方案。
实际上,有许多实施方法不同的jaail工具,但是其中的许多工具要么设计不安全(例如fakeroot
,LD_PRELOAD
基于-),要么不完整(例如fakeroot-ng
,ptrace
基于-),或者需要root用户(chroot
或plash
在fakechroot中提到)警告标签)。
这些只是示例;我想将所有这些功能并排列出,并指明这两个功能(“可以信任吗?”,“需要建立根目录?”),也许在操作系统级别的虚拟化实现中就可以了。
通常,这些答案涵盖了所描述的所有可能性,甚至还包括:
基于Chroot的助手(但是必须为setUID root,因为它chroot
需要root;或者可能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编写的。
实现隔离的一种已知方法是通过Google Chromium中使用的seccomp沙箱方法。但是这种方法假设您编写了一个助手,该助手将处理某些(允许的)“拦截”文件访问和其他系统调用。当然,还要努力“拦截”系统调用并将它们重定向到帮助程序(也许,这甚至意味着在受控进程的代码中替换被拦截的系统调用;这样,听起来不相当简单;如果您有兴趣,最好阅读详细信息,而不仅仅是我的回答)。
更多相关信息(来自Wikipedia):
(如果要seccomp
在Chromium之外寻找基于通用的解决方案,那么最后一项似乎很有趣。还有一篇博客文章值得“ seccomp-nurse”的作者阅读:SECCOMP作为Sandboxing解决方案?。)
“ seccomp-nurse”项目中的这种方法的说明:
在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)进行编程的人来说,有沙盒工具。
cf. “沙盒Haskell”项目建议书。
氯化钠 --not这里提到 --belongs到这个组,不是吗?
那里的答案中也指向一些积累有关该主题信息的页面:
chroot
,但这仍然可能需要真正的根特权...
这是unix权限模型的基本限制:只有root可以委托。
您无需root用户即可运行虚拟机(并非所有VM技术都如此),但这是一个重量级的解决方案。
用户模式Linux是一种相对轻量级的Linux-on-Linux虚拟化解决方案。设置起来并不容易。你需要填充一个根分区(在一个目录)至少需要启动的最小(在几个文件/etc
,/sbin/init
和它的依赖,登录程序,外壳和实用程序)。
我想您可能会幸运LD_PRELOAD
地拦截对某些文件的访问,但这可能真的很棘手。
LD_PRELOAD
无法被信任(可以绕开),但是可以拦截ptrace
。
LD_PRELOAD
基于基础的解决方案不能作为一种安全措施而被信任。
Firejail是用于监禁任何进程的好工具,无论是否具有root用户访问权限,它都有很多选项,而且非常灵活: