为什么mount需要root权限?

Cra*_*sta 55 linux mount linux-kernel

为什么 Linux 要求用户是根用户/使用 sudo/每个挂载特别授权才能挂载某些东西?关于是否允许用户挂载某些东西的决定似乎应该基于他们对源卷/网络共享和挂载点的访问权限。非根挂载的几个用途是将文件系统映像挂载到用户拥有的方向,并将网络共享挂载到用户拥有的目录。似乎如果用户可以控制安装方程的两边,一切都应该很酷。

访问限制说明:

我觉得我应该能够挂载用户可以访问的任何内容,否则用户将拥有该用户拥有的挂载点。

例如,在我的计算机上, /dev/sda1 由用户 root 和具有权限的组磁盘拥有brw-rw----。因此,非 root 用户不能弄乱 /dev/sda1 并且显然 mount 不应该允许他们挂载它。但是,如果用户拥有 /home/my_user/my_imagefile.img 和挂载点 /home/my_user/my_image/ 为什么他们不能在该挂载点上挂载该图像文件:

mount /home/my_user/my_imagefile.img /home/my_user/my_image/ -o loop
Run Code Online (Sandbox Code Playgroud)

正如科尔马克指出的那样,存在一个 suid 问题。因此,必须添加一些限制以防止 suid 成为问题以及潜在的其他一些问题。也许一种方法是让操作系统将所有文件视为属于进行安装的用户。但是对于简单的读/写/执行,我不明白为什么这会是一个问题。

用例:

我在实验室有一个帐户,我的家庭空间限制为 8GB。这是很小的,非常非常烦人。我想从我的个人服务器安装一个 nfs 卷,以从本质上增加我拥有的空间量。然而,因为 Linux 不允许这样的事情,我被困在 scp 文件来回保持在 8GB 限制之下。

Gil*_*il' 41

这既是历史限制,也是安全限制。

从历史上看,大多数驱动器是不可移动的。因此,将挂载限制为具有合法物理访问权限的人是有意义的,并且他们可能有权访问 root 帐户。fstab 条目允许管理员将可移动驱动器的安装委托给其他用户。

从安全的角度来看,允许任意用户在任意位置挂载任意块设备或文件系统映像存在三个主要问题。

  • 挂载到非拥有位置会隐藏该位置的文件。例如:在 上安装您选择的文件系统/etc,其中/etc/shadow包含您知道的 root 密码。这是通过允许用户仅在他拥有的目录上挂载文件系统来解决的。
  • 文件系统驱动程序通常没有经过格式错误的文件系统的彻底测试。有缺陷的文件系统驱动程序可能允许用户提供格式错误的文件系统以将代码注入内核。
  • 挂载文件系统可以让挂载者使某些文件出现,否则他将无权创建。Setuid 可执行文件和设备文件是最明显的例子,它们由in隐含的nosuid和nodev选项固定。 到目前为止执行时user/etc/fstab
    usermount不被root调用就足够了。但更普遍的是,能够创建由另一个用户拥有的文件是有问题的:该文件的内容有可能被声称的所有者而不是安装者归因。由 root 到不同文件系统的临时属性保留副本将生成一个由声明但未参与的所有者拥有的文件。一些程序通过检查文件是否为特定用户所有来检查使用文件的请求是否合法,这将不再安全(程序还必须检查访问路径上的目录是否为该用户所有;如果允许任意挂载,他们还必须检查这些目录中没有一个是挂载点不是由 root 用户创建的,也不是由所需用户创建的)。

出于实际目的,现在可以通过FUSE挂载文件系统而无需 root 。FUSE 驱动程序作为挂载用户运行,因此不存在通过利用内核代码中的错误来提升权限的风险。FUSE 文件系统只能公开用户有权创建的文件,解决了上面的最后一个问题。


psu*_*usi 26

如果用户对块设备具有直接写访问权限,并且可以挂载该块设备,那么他们可以将 suid 可执行文件写入块设备,挂载并执行该文件,从而获得对系统的 root 访问权限。这就是为什么挂载通常仅限于 root。

现在 root 可以允许普通用户在特定限制下挂载,但他需要确保如果用户对块设备具有写访问权限,则挂载不允许 suid,还有 devnodes,它们有类似的问题(用户可以制作一个允许他们写访问一个他们不应该有写访问的重要设备的 devnode)。


小智 8

它并不总是需要超级权限。从man mount

   The non-superuser mounts.
          Normally,  only  the  superuser can mount filesystems.  However,
          when fstab contains the user option on a line, anybody can mount
          the corresponding system.

          Thus, given a line

                 /dev/cdrom  /cd  iso9660  ro,user,noauto,unhide

          any  user  can  mount  the iso9660 filesystem found on his CDROM
          using the command

                 mount /dev/cdrom

          or

                 mount /cd

          For more details, see fstab(5).  Only the user  that  mounted  a
          filesystem  can unmount it again.  If any user should be able to
          unmount, then use users instead of user in the fstab line.   The
          owner option is similar to the user option, with the restriction
          that the user must be the owner of the special file. This may be
          useful e.g. for /dev/fd if a login script makes the console user
          owner of this device.  The group option  is  similar,  with  the
          restriction  that  the  user  must be member of the group of the
          special file.
Run Code Online (Sandbox Code Playgroud)

  • @CrazyCasta:挂载点可能归用户所有,但设备节点不是。分区中数据的所有权等是什么 a) 不可知,b) 无关紧要。 (3认同)
  • 需要明确的是,`mount()` 系统调用总是需要 root 用户。suid 实用程序可以成为 root 并允许非 root 用户挂载,如果安装了 `mount` 命令 suid,那么它将根据 fstab 中的用户标志执行此操作。已经编写了其他 suid 可执行文件以允许用户挂载,例如 `pmount`,它允许用户挂载外部媒体,并强制执行适当的限制,例如 nosuid、nodev。 (2认同)

gol*_*cks 5

Kormac 和其他人表示,这不是你呈现的困境;在我看来,这归结为明确授予用户特权与系统的哲学,即所有用户都具有安装文件系统的不变权利。

Gilles 解决了一些与挂载文件系统相关的安全问题。我将追溯避免对与此相关的潜在技术问题进行冗长和切题的讨论(请参阅评论),但我确实认为不受信任的用户没有安装硬盘驱动器的一成不变的权利是公平的。

关于虚拟和远程文件系统(或通过虚拟文件系统的远程文件系统,a la FUSE)的问题不太重要,但这并不能解决安全问题(尽管 FUSE 可能,它肯定会解决您的问题)。同样重要的是要考虑到此类文件系统中的数据几乎总是可以在不需要挂载设备的情况下访问,无论是通过文件传输还是从不挂载的图像中提取的工具,因此不允许您挂载某些东西的系统可以对于访问您奇怪地放置在图像文件中的数据,或者(更容易理解)想要从远程系统获取的数据,这并不代表无法解决的问题。如果您遇到的情况并非如此,则可能值得询问:

  1. 我到底想做什么?

  2. 我在哪里努力做到这一点?

如果系统的管理是公平的,那么#2 解释了为什么#1 对您来说是不可能的。如果系统的管理不公平,那就是政治。“我的系统管理员不公平”问题的解决方案不是重新设计操作系统,以便各地的系统管理员都无法限制用户。

系统允许超级用户明确地或省略地限制您的活动(“我们不提供 FUSE”等)。特权是实现这一点的一种机制。被告知“你不需要这样做”可能并不好,但如果这是真的......que sera......你不需要这样做。使用ftp等。如果不是真的,你应该纠缠那些责任人。


小智 5

仅供参考:最新的内核具有“命名空间”支持。普通用户可以创建一个命名空间,并在该命名空间内成为 root 并做一些有趣的事情,比如挂载文件系统。

但是它并没有给你“真正的”超级用户权限——你只能做你已经被允许做的事情(即你只能安装你已经可以读取的设备)。

请参阅运行中的命名空间,第1 部分:命名空间概述,第 4 节。