阅读了一些不错的答案后这个问题,我仍然不清楚为什么你会想假装你是 root 而没有获得实际 root 的任何好处。
到目前为止,我可以收集到的是,fakeroot 用于在解压缩/压缩文件时授予需要 root 权限的文件的所有权。我的问题是,为什么你不能用 chown 来做到这一点?
Google 网上论坛讨论这里指出您需要 fakeroot 来编译 Debian 内核(如果您想从非特权用户执行此操作)。我的评论是,您需要 root 才能编译的原因可能是因为没有为其他用户设置读取权限。如果是这样,那么 fakeroot 允许编译是否会违反安全性(这意味着 gcc 现在可以读取 root 的文件)?
这个答案这里描述实际的系统调用是使用用户的真实 uid/gid 进行的,那么 fakeroot 有什么帮助呢?
fakeroot 如何阻止 Linux 上不必要的权限升级?如果 fakeroot 可以欺骗 tar 来创建一个属于 root 的文件,为什么不使用 SUID 做类似的事情呢?
根据我收集的信息,当您想要将构建为 root 的任何包文件的所有者更改为 root 时,fakeroot 才有用。但你可以用 chown 做到这一点,那么我对这个组件的使用方式缺乏理解吗?
答案1
到目前为止,我可以收集到的是,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;如果您有一个二进制文件,作为普通用户evilbinary
运行,将创建一个包含root 拥有的 tarball 和 suid 的 tarball。但是,除非您以 root 身份执行此操作,否则您将无法提取该 tarball 并保留这些权限:此处没有权限升级。是一种特权tar cf evil.tar --mode=4755 --owner=root --group=root evilbinary
evilbinary
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。
答案2
不。假root允许您运行权限操作和报告工具,它将一致地报告。但它实际上不会授予这些权限。它看起来就像你拥有它们(假的)。它不会改变环境之外的任何东西。
如果您想创建一个包含所有权和权限的目录结构,但您的用户无法设置该目录结构,那么您可以 tar、zip 或其他包,这很有用。
它才不是真的提升权限,那是假的。它不允许您执行任何您无法执行的操作(删除、写入、读取)。您可以在没有它的情况下生产包(理论上)。ls
如果没有它,您可能会得到一份虚假报告 ( )。
这不是一个安全缺陷,因为它才不是允许访问,或任何没有它就无法执行的操作。它无需特权即可运行。它所做的只是拦截对 、 等的调用chown
。chmod
它使它们成为无操作,只是它记录了可能发生的情况。它还拦截对stat
等的调用,以便从其自己的内部数据库报告权限和所有权,就像其他命令已完成一样。这很有用,因为如果您随后压缩该目录,它将具有伪造的权限。如果您随后以 root 身份解压,那么权限将变为真实。
任何以前不可读/不可写的文件将保持不可读/不可写。创建的任何特殊文件(例如设备)将没有特殊的权力。任何set-uid(给另一个用户)的文件都不会set-uid。任何其他权限升级都不起作用。
它是虚拟机的一种:一般来说,虚拟机可以模拟任何环境/操作系统,但不能对主机执行任何其他应用程序无法执行的操作。在虚拟机中,您似乎可以做任何事情。您可以将安全系统重新设计为相同或不同,但是这一切都将作为运行虚拟环境的进程的用户/组拥有的资源存在于主机上。
答案3
这里已经有两个很好且非常详细的答案,但我只想指出原来的 fakeroot
手册页1实际上解释得非常清楚和简洁:
假根在似乎具有文件操作 root 权限的环境中运行命令。这对于允许用户创建包含 root 权限/所有权的文件的存档(tar、ar、.deb 等)非常有用。没有假根人们需要拥有root权限才能创建具有正确权限和所有权的档案的组成文件,然后将它们打包,或者必须直接构建档案,而不使用归档程序。
Fakeroot 允许非 root 用户创建包含 root 拥有的文件的存档,这是在 Linux 中生成和分发二进制软件包的关键部分。如果没有fakeroot
,则必须在以实际 root 身份运行时生成包存档,以便它们包含正确的文件所有权和权限。那会存在安全风险。如果使用 root 权限来构建和打包可能不受信任的软件,则会面临巨大的风险。感谢fakeroot
,具有非特权文件的非特权用户仍然可以生成包含具有 root 所有权的文件的存档。2
但这不是安全风险,因为存档中没有任何内容实际上由 root 拥有,直到文件被提取。即便如此,如果是由特权用户完成的,则只有在根权限完好无损的情况下才能提取文件。这一步——fakeroot
由特权用户提取包含“根”文件的辅助存档——是“假”根最终变成真实的地方。直到那时,还没有获得或绕过任何实际的 root 权限。
笔记
- Fakeroot 已经催生了一些竞争对手/模仿者,它们会伪装成
fakeroot
已安装的状态,包括fakeroot-ng
和pseudo
。但恕我直言,这两个“模仿者”的手册页都没有那么清楚地说明了这个问题的要点。坚持原创,独一无二的fakeroot
OG 其他发行版/打包系统通过简单地克服了这个问题不是在其包档案中使用 root 所有权。例如,在 Fedora 上,非特权用户可以编译、安装和打包软件,而不需要
fakeroot
.这一切都是在用户$HOME/rpmbuild/
空间内完成的,通常特权步骤如make install
重定向(通过--prefix
和等机制DESTDIR
)到$HOME/rpmbuild/BUILDROOT/
可以被视为某种“fakechroot”空间的层次结构(无需实际使用fakechroot
)。但即使在 期间
make install
,所有内容都以非特权用户身份执行并由非特权用户拥有。默认情况下,提取的文件所有权和权限将设置为root,root
and0644
(或0755
对于可执行文件),除非在包定义 (.spec
) 文件中被覆盖,在这种情况下,它们将作为元数据存储在最终包中。由于在 rpm 软件包(特权)安装过程之前不会实际应用任何权限或所有权,因此fakeroot
在打包过程中既不需要 root,也不需要 root。但这fakeroot
实际上只是达到相同结果的不同途径。