为什么强制执行 root 安全性但 $HOME 通常不受保护?

信息安全 linux 权限 须藤
2021-08-31 02:51:11

来自this question中的评论为什么以root身份登录不好?

sudo机制正在使用中,因此非管理工具“不会损害您的系统”。我同意如果我克隆的某个 github 项目能够将恶意代码注入/bin. 但是,在台式电脑上的推理是什么样的?相同的 github 代码一旦执行,就可以在没有 sudo 权限的情况下清除我的整个主文件夹,在我的自动启动会话中放置一个键盘记录器,或者在~.

除非您有备份,否则主文件夹通常是唯一的,并且包含宝贵的(如果不是敏感数据)数据。然而,根目录构建了系统,并且通常可以通过简单地重新安装系统来恢复。有保存的配置/var等等,但它们对用户的意义往往不如 2011 年的假日照片。root 权限系统是有道理的,但在桌面系统上,感觉就像它保护了错误的数据。

有没有办法防止恶意代码发生$HOME为什么没有人关心它?

4个回答

我不同意那些说 Unix 安全模型的时代或它的开发环境有问题的答案。我认为情况并非如此,因为有适当的机制来处理这个问题。

根权限系统是有道理的,但在桌面系统上,感觉就像它保护了错误的数据。

超级用户的权限是为了保护系统免受其用户的侵害。用户帐户的权限用于保护该帐户免受其他非 root 帐户的侵害。

通过执行程序,您授予它使用您的 UID 执行操作的权限。由于您的 UID 对您的主目录具有完全访问权限,因此您已传递性地授予该程序相同的访问权限。正如超级用户有权更改需要保护免受恶意行为(密码、配置、二进制文件)的系统文件一样,您的主目录中可能有需要相同类型保护的数据。

最小特权原则说,您不应该提供比绝对必要更多的访问权限运行任何程序的决策过程对于您的文件应该与对于系统文件的决策过程相同。如果您不提供一段您不相信为了保护系统而不受限制地使用超级用户帐户的代码,那么不应该为了保护您的数据而不受限制地使用您的帐户。

有没有办法防止 $HOME 中发生恶意代码?为什么没有人关心它?

Unix 不提供细粒度的权限,原因与 rm 命令周围没有刀片防护装置的原因相同:权限不是为了保护用户免受他们自己的伤害。

防止恶意代码破坏主目录中文件的方法是不要使用您的帐户运行它。创建一个没有任何特殊权限的单独用户并在该 UID 下运行代码,直到您确定是否可以信任它。

还有其他方法可以做到这一点,例如 chrooted jails,但是设置它们需要更多的工作,并且逃脱它们不再是曾经的挑战。

因为基于 UNIX 的安全模型已有 50 年的历史。

UNIX 是最广泛使用的操作系统的基础,即使是大例外 Windows 也受到了它的影响。它起源于一个时代,当时计算机是大而昂贵的缓慢机器,专门由神秘的专家使用。

当时,用户根本没有在任何计算机上收集大量的个人数据,而不是他们的大学服务器,不是他们的个人计算机(当然也不是他们的手机)。因用户而异的数据通常是科学计算过程的输入和输出数据——丢失它们可能会构成损失,但很大程度上可以通过重新计算来弥补,这与当今数据泄露的后果完全不同。

没有人会在计算机上保存他们的日记、银行信息或裸照,因此保护他们免受恶意访问并不是最重要的事情——事实上,如果其他人表现出兴趣,大多数 70 年代的本科生可能会很兴奋在他们的研究数据中。因此,防止数据丢失被认为是计算机安全的重中之重,并且通过定期备份而不是访问控制来充分确保这一点。

这是一个非常敏锐的观察。是的,以您的用户身份运行的恶意软件可能会损坏/破坏/修改您主目录中的数据。是的,单用户系统上的用户分离不如服务器上有用。但是,仍然有一些只有 root 用户(或同等用户)可以做的事情:

  • 在内核中安装 rootkit。
  • 修改引导加载程序以包含用于持久性的早期后门。
  • 擦除硬盘的所有块,使您的数据无法恢复。

老实说,我发现工作站上的权限分离对于保护工作站免受它最大的敌人:我最有用。这让我更难搞砸和破坏我的系统。

此外,您始终可以以 root 身份设置一个 cron 作业,以备份您的主目录(例如,使用rsnapshot)并将其存储为您的用户不可写。在您描述的情况下,这将是某种程度的保护。

强制性 xkcd

Unix/Linux 安全性的最初设计是保护一个用户免受其他用户的侵害,并保护系统文件免受用户的侵害。请记住,30 到 40 年前,大多数 Unix 系统都是多用户设置,许多人同时登录到同一台机器。这些系统花费数万美元,拥有自己的个人机器极为罕见,因此在多用户登录环境中共享机器。

该设计从未打算保护用户或用户文件免受恶意代码的侵害,只是为了保护用户免受其他用户的侵害、用户修改底层系统以及用户使用过多的系统资源。在我们当前每个人都有自己的计算机的时代,设计已经(大部分)转化为单用户机器,以保护一个进程不占用过多的系统资源。

由于这个原因,用户执行的程序可以访问用户拥有的任何文件。没有对用户自己的文件进行任何进一步访问的概念。换句话说,作为用户 A 执行的进程有权读取、修改和删除属于用户 A 的所有文件。这包括(如您所见)自动启动文件。

更现代的方法可能需要对某些文件进行某种形式的进一步控制。访问这些文件时需要“重新验证”之类的东西,或者可能是某种形式的进一步保护一个程序文件免受另一个程序文件的影响。AFAIK(目前)在 Linux 桌面世界中没有这样的东西。如我错了请纠正我?