到目前为止,我可以收集到的是,fakeroot用于为文件解压缩/压缩后需要root的所有权。我的问题是,为什么您不能只用chown呢?
因为您不能只使用来执行此操作chown
,至少不能以非root用户身份执行。(并且,如果您是以root用户身份运行的,则不需要fakeroot
。)这就是要点fakeroot
:允许希望以root用户身份运行的程序以普通用户身份运行,同时假装需要root权限的操作成功。
通常在构建软件包时使用它,以便正在安装的软件包的安装过程可以继续进行而不会出现错误(即使它运行chown root:root
,或install -o root
等)。fakeroot
记住它假装提供文件的虚假所有权,因此随后的查看所有权的操作将看到该伪造的所有权而不是真实的所有权;tar
例如,这允许后续运行将文件存储为root拥有的文件。
fakeroot如何阻止Linux上不必要的特权升级?如果fakeroot可以欺骗tar来创建root拥有的文件,那么为什么不对SUID做类似的事情?
fakeroot
不会欺骗tar
任何事情,它会保留构建要进行的更改,而不会使这些更改在承载该构建的系统上生效。您无需fakeroot
生成包含root和suid拥有的文件的tarball。如果您具有binary evilbinary
,则以tar cf evil.tar --mode=4755 --owner=root --group=root evilbinary
普通用户身份运行,将创建一个tarball,其中包含evilbinary
,由root和suid拥有。但是,除非以root用户身份进行,否则您将无法提取tarball并保留这些权限:此处没有特权升级。fakeroot
是一种特权德-升级工具:它允许您以常规用户身份运行构建,同时保留以root身份运行时所产生的效果,并允许稍后重播这些效果。要“真实地”应用效果,始终需要具有root权限。fakeroot
不提供任何获取方法。
要fakeroot
更详细地了解的用法,请考虑典型的发行版构建涉及以下操作(在许多其他操作中):
- 安装文件,由root拥有
- ...
- 存档那些仍由root拥有的文件,以便在提取文件时将它们归root所有
如果您不是root用户,那么第一部分显然会失败。但是,fakeroot
以普通用户身份在下运行时,该过程将变为
- 安装文件,由root拥有-失败,但
fakeroot
假装成功,并且记住更改的所有权
- ...
- 归档仍由root拥有的那些文件-当
tar
(或正在使用的任何归档程序)询问系统文件所有权是什么时,fakeroot
更改答案以匹配先前记录的所有权
因此,您可以在没有root用户的情况下运行软件包构建,同时获得与以root用户身份运行时所获得的相同结果。使用起来fakeroot
更安全:系统仍然无法执行用户无法执行的任何操作,因此恶意的安装过程不会损坏您的系统(除了触摸文件之外)。
在Debian中,对构建工具进行了改进,以便不再需要它,您可以在不使用的情况下构建软件包fakeroot
。指令dpkg
直接支持此功能Rules-Requires-Root
(请参阅参考资料rootless-builds.txt
)。
要了解的目的fakeroot
以及是否以root用户身份运行的安全性方面,可能有助于考虑打包的目的。当从源安装软件时,要在系统范围内使用,请按以下步骤操作:
- 编译软件(无需特权即可完成)
- 安装软件(需要以root身份完成,或者至少以允许写入适当系统位置的用户身份完成)
打包软件时,您要延迟第二部分。但是要成功完成此操作,您仍然需要将软件“安装”到软件包中,而不是“安装”到系统上。因此,当您打包软件时,该过程将变为:
- 编译软件(无特殊特权)
- 假装安装软件(同样没有特殊特权)
- 将软件安装捕获为软件包(同上)
- 使软件包可用(同上)
现在,用户通过安装软件包来完成该过程,这需要以root用户身份进行(或者再次,具有适当特权的用户可以写入适当的位置)。这是实现延迟特权进程的地方,并且是进程中需要特殊特权的唯一部分。
fakeroot
通过允许我们运行软件安装过程并捕获其行为而无需以root用户身份运行,从而对上面的步骤2和3有所帮助。