在阅读了这个问题的一些非常好的答案之后,我仍然不清楚为什么你要假装自己是 root 却没有获得任何真正成为 root 的好处。
到目前为止,我可以收集到的是,fakeroot 用于为解压缩/tar 时需要 root 的文件授予所有权。我的问题是,为什么你不能用 chown 来做呢?
此处的 Google Groups 讨论指出,您需要 fakeroot 来编译 Debian 内核(如果您想从非特权用户那里编译)。我的评论是,您需要成为 root 才能编译的原因可能是因为没有为其他用户设置读取权限。如果是这样,fakeroot 允许编译不是安全违规吗(这意味着 gcc 现在可以读取用于 root 的文件)?
这里的这个答案描述了实际的系统调用是使用用户的真实 uid/gid 进行的,那么 fakeroot 又有什么帮助呢?
fakeroot 如何阻止 Linux 上不必要的权限提升?如果 fakeroot 可以欺骗 tar 制作一个属于 root 的文件,为什么不使用 SUID 做类似的事情呢?
根据我收集到的信息,当您想将构建的任何包文件的所有者更改为 root 时,fakeroot 非常有用。但是你可以用 chown 做到这一点,那么我对这个组件的使用方式缺乏了解吗?
因为您不能只使用 来做到这一点
chown
,至少不能作为非 root 用户。(如果您以 root 身份运行,则不需要fakeroot
。)这就是 : 的全部意义所在fakeroot
:允许期望以 root 身份运行的程序以普通用户身份运行,同时假装需要 root 的操作成功。这通常在构建包时使用,以便正在安装的包的安装过程可以继续进行而不会出错(即使它运行
chown root:root
,或install -o root
等)。fakeroot
记住它假装提供文件的虚假所有权,因此查看所有权的后续操作看到的是这个而不是真实的;这允许后续tar
运行,例如将文件存储为 root 所拥有的。fakeroot
不会欺骗tar
做任何事情,它会保留构建想要进行的更改,而不会让这些更改在托管构建的系统上生效。您不需要fakeroot
生成包含 root 和 suid 拥有的文件的 tarball;如果您有一个二进制文件evilbinary
,以普通用户身份运行tar cf evil.tar --mode=4755 --owner=root --group=root evilbinary
,将创建一个包含evilbinary
由 root 和 suid 拥有的 tarball。但是,除非您以 root 身份执行此操作,否则您将无法提取该 tarball 并保留这些权限:这里没有权限提升。是一种fakeroot
特权-升级工具:它允许您以普通用户身份运行构建,同时保留构建以 root 身份运行时的效果,允许稍后重播这些效果。“真正”应用效果总是需要 root 权限;fakeroot
没有提供任何获取它们的方法。要更详细地了解 的使用
fakeroot
,请考虑典型的发行版构建涉及以下操作(以及许多其他操作):如果您不是 root,第一部分显然会失败。但是,当在 下运行时
fakeroot
,作为普通用户,进程变为fakeroot
假装成功,并记住更改的所有权tar
(或正在使用的任何归档程序)询问系统文件所有权是什么时,fakeroot
更改答案以匹配它之前记录的所有权因此,您可以在没有 root 身份的情况下运行包构建,同时获得与真正以 root 身份运行时相同的结果。使用
fakeroot
更安全:系统仍然无法执行用户无法执行的任何操作,因此恶意安装过程不会损坏您的系统(除了触摸您的文件)。在 Debian 中,构建工具已经过改进,不再需要这个,您可以构建没有
fakeroot
. 这由指令dpkg
直接支持(请参阅 参考资料)。Rules-Requires-Root
rootless-builds.txt
要了解 的目的
fakeroot
以及是否以 root 身份运行的安全性方面,考虑打包的目的可能会有所帮助。当您从源代码安装一个软件以在系统范围内使用时,您将按照以下步骤进行:当你打包一个软件时,你在延迟第二部分;但要成功做到这一点,您仍然需要将软件“安装”到软件包中,而不是安装到系统中。所以当你打包软件的时候,流程就变成了:
现在,用户通过安装软件包来完成该过程,这需要以 root 身份完成(或者再次,具有适当权限的用户可以写入适当的位置)。这是延迟特权进程实现的地方,也是该进程中唯一需要特权的部分。
fakeroot
通过允许我们在不以 root 身份运行的情况下运行软件安装过程并捕获它们的行为来帮助执行上述步骤 2 和 3。不。假根允许您运行权限操作和报告工具,它将一致地报告。但是,它实际上不会授予这些权限。它看起来就像你拥有它们(假的)。它不会改变环境之外的任何东西。
如果您想创建一个目录结构,其中包含您的用户无法设置的所有权和权限,那么您将使用 tar、zip 或其他程序包,这很有用。
它并没有真正提升权限,它是假的。它不允许你做任何你不能做的事情(删除、写、读)。你可以在没有它的情况下生产包(理论上)。没有它,你可能会得到一份虚假的报告 (
ls
)。这不是一个安全漏洞,因为它不允许访问,或者没有它你不能做的任何事情。它在没有特权的情况下运行。它所做的只是拦截对 , 等的调用
chown
。chmod
它使它们成为无操作,除了它记录会发生的事情。它还拦截对stat
等的调用,以便它从自己的内部数据库报告权限和所有权,就好像其他命令已经完成一样。这很有用,因为如果您随后压缩目录,它将具有假权限。如果您随后以 root 身份解压缩,则权限将变为真实。任何以前不可读/写的文件都将保持不可读/写。创建的任何特殊文件(例如设备)都没有特殊权限。任何 set-uid(给另一个用户),文件都不会 set-uid。任何其他权限提升都不起作用。
它是一种虚拟机:一般来说,虚拟机可以模拟任何环境/操作系统,但不能对主机做任何其他应用程序无法做的事情。在虚拟机中,您似乎可以做任何事情。您可以将安全系统重新设计为相同或不同,但是这将全部存在于主机上,作为运行虚拟环境的进程的用户/组所拥有的资源。
这里已经有两个很好且非常详细的答案,但我只想指出,原始
fakeroot
手册页1的介绍性段落实际上非常清晰简洁地解释了它:Fakeroot 允许非 root 用户创建包含 root 拥有的文件的存档,这是在 Linux 中生成和分发二进制软件包的关键部分。如果没有
fakeroot
,则必须在以实际 root 身份运行时生成包存档,以便它们包含正确的文件所有权和权限。那将是一个安全风险。如果使用 root privs 来构建和打包可能不受信任的软件,则会带来巨大的风险。多亏了fakeroot
,拥有非特权文件的非特权用户仍然可以生成包含具有 root 所有权的文件的档案。2但这不是安全风险,因为在文件被EXTRACTED之前,档案中的任何内容实际上都不归 root所有。即使这样,如果由特权用户完成,文件也只会在其根权限完整的情况下被提取。这一步——由特权用户提取包含“根”文件的辅助存档——是“假”根最终成为真实的地方。直到那时,还没有获得或绕过任何实际的 root 权限。
fakeroot
笔记
fakeroot
已安装,包括fakeroot-ng
和pseudo
. 但是恕我直言,“模仿者”的手册页都几乎没有清楚地说明这个问题。坚持原创,唯一的fakeroot
OG其他发行版/打包系统通过在其包档案中不使用根所有权来克服这一点。例如,在 Fedora 上,软件可以由非特权用户编译、安装和打包,而无需
fakeroot
. 这一切都在用户的$HOME/rpmbuild/
空间内完成,并且通常特权的步骤make install
(通过类似--prefix
and的机制DESTDIR
)被重定向到$HOME/rpmbuild/BUILDROOT/
可以被视为一种“fakechroot”空间的层次结构(实际上没有使用fakechroot
)。但即使在 期间
make install
,一切都以非特权用户的身份执行并归非特权用户所有。默认情况下,提取的文件所有权和权限将设置为root,root
和0644
(或0755
可执行文件),除非在包定义 (.spec
) 文件中被覆盖,在这种情况下,它们将作为元数据存储在最终包中。因为直到 rpm 包的(特权)安装过程才实际应用权限或所有权,所以fakeroot
在打包过程中既不需要 root,也不需要。但fakeroot
实际上只是获得相同结果的不同途径。