为什么安装需要root特权?


54

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

澄清访问限制:

我认为我应该能够装载用户可以访问的任何装载点,否则该装载点将是用户的所有者。

例如,在我的计算机上,/ 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

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

用例:

我在实验室中有一个帐户,我的家庭空间限制为8GB。这很小,很烦人。我想从我的个人服务器上挂载nfs卷,以实质上增加我所拥有的空间。但是,由于Linux不允许这种事情,所以我只能将来回传输文件的速度限制在8GB以下。


4
听起来问题不在于“ Linux不允许这样的事情”,因为可以在系统中配置系统以允许您这样做,因此您在实验室中不允许这样做。您可以与管理系统的人员讨论此问题。如果他们不友好,那就是政治而不是计算机;)
goldilocks 2013年

是否可以安装一个可以正常访问的任意安装点?似乎管理员必须为我的nfs挂载在fstab中添加一条显式行才能允许它。反过来,这可能会开创一个先例,他们必须对要求这样做的其他所有人也这样做,我知道这是站不住脚的。因此,人们质疑为什么Linux不允许您挂载任何安全的东西(以某种受限方式)。
CrazyCasta

10
你试过了sshfs吗?它将像您一样通过挂载远程目录ssh,而无需root访问。它只需要安装FUSE(UserSpacE中的Filesystem)。
Arcege

1
您已经听说过硬盘驱动器问题,等等。所以,我知道我已经说过很多次了,但是我们的哲学是“装载任意东西” 不能保证安全,这就是为什么要这样设置的原因是(必须安排特定的例外)。顺便说一句,如果您没有FUSE,sftp它会比更好用scp
goldilocks

1
好像已经在这里被问过了(变种):未经root许可挂载循环文件?
Daniel Pryden

Answers:


37

它既有历史限制,也有安全限制。

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

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

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

出于实际目的,如今可以通过FUSE挂载文件系统而无需成为root用户。FUSE驱动程序以挂载用户身份运行,因此不会因为利用内核代码中的错误而导致特权升级的风险。FUSE文件系统只能公开用户有权创建的文件,从而解决了上面的最后一个问题。


24

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

现在root可以允许普通用户以特定的限制进行挂载,但是他需要确保,如果用户具有对块设备的写访问权限,则该挂载将禁止suid以及devnode,这也存在类似的问题(用户可以自己制作)一个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.

是的,您是正确的,我的问题有点不准确。我知道可以逐个安装具体授权一个人。但是,如果安装点和卷都由用户所有,则用户应该可以在没有特定授权的情况下进行安装。

3
@CrazyCasta:安装点可能归用户所有,但设备节点不属于该用户。分区中数据的所有权等内容是:a)未知,b)不相关。
goldilocks

但是如果设备节点归用户所有怎么办。
CrazyCasta

然后,在fstab中应该有一个并行异常,因为用户拥有的设备节点开始时会比较特殊(尝试并创建一个)。同样,该原则是限制安全系统,并为人们授予特权...如果您没有被授予特权,那么您很不幸。请注意,* nix不会在柜台上出售大容量杂志,您需要许可证。
goldilocks

需要明确的是,mount()系统调用始终需要root用户。suid实用程序可以成为root用户,并允许非root用户安装,如果该mount命令已安装suid,则它将基于fstab中的user标志执行此操作。还编写了其他suid可执行文件以允许用户挂载,例如pmount,允许用户挂载外部媒体并实施适当的限制,例如nosuid,nodev。
psusi

5

科马克(Kormac)和其他人已经表明,这并不是您所提出的困境。在我看来,这归结为明确授予用户特权的哲学,而不是一种系统,即所有用户都拥有安装文件系统的不变权利

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

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

  1. 我到底想做什么?

  2. 我要在哪里做?

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

该系统允许超级用户显式地或通过省略来限制您的活动(“我们不提供保险丝”,等等)。特权是一种可以实现此目的的机制。被告知“您不需要执行此操作”可能不是一件好事,但是,如果这是真的……que血清……您就不需要这样做。使用ftp等。如果不正确,则应让那些负责任的人烦恼。


您的答案令人困惑,是否没有保护卷本身(例如,/ dev / sda1,/ dev / sda2等),防止用户读取/写入它们?我想知道为什么用户不能装载他们原本可以访问的东西。为了明确起见,如果我有一个名为ext2的映像文件,我可以编写一个应用程序,使我可以从该映像读取/写入该映像(当然,这不属于操作系统文件系统的一部分)。该应用程序将无法从/ dev中的分区读取/写入(除非更改了这些分区以允许用户访问它们,通常这没有意义)。
CrazyCasta

PS我不同意用户应该能够挂载他们没有其他权限就无法访问的文件系统,因为只有挂载该文件系统的行为才可能导致根用户不希望执行的某种操作(例如文件系统检查)。
CrazyCasta

挂载映像仍然涉及设备节点(例如/ dev / loop)。没错,这会造成麻烦,但是针对此情况的“安排”将因系统而异(一方面,环路设备的供应有限),因此,这也是默认情况下全部受限制的原因。但是,超级用户仍然可以代表其他任何人覆盖该默认值。
goldilocks

关于环回设备节点的限制,这是一个很好的观点。我不太清楚为什么需要一个回送设备,似乎有点多余。我知道这是因为挂载需要逐块文件而不是普通文件。我不明白为什么会这样。您能否提供任何见解,例如内核对块设备和常规文件的处理方式有很大不同吗?
CrazyCasta

1
@goldilocks:这个答案是bollocks的原因是因为您对限制的了解非常有说服力,但这是完全错误的,您提到的问题不存在。允许创建虚拟文件系统(如FUSE)不允许您使用IPC以更round回的方式执行任何不可能的事情。您关于设备中断的说明完全无关紧要;发生在远程文件系统上的唯一重要中断来自网卡,该网卡完全由内核处理。
Lie Ryan

5

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

但是,它并没有赋予您“真正的”超级用户权限-您只能执行已经被允许执行的操作(即,您只能安装已经可以读取的设备)。

http://lwn.net/Articles/531114/ 参见第4节。


命名空间比这更受限制。您可以出现root在用户名称空间内,但是即使您可以读写块设备,也不能挂载普通的文件系统类型。看到这里实验2:unix.stackexchange.com/questions/517317/...
sourcejedi

0

因为他们打算装入的文件系统上的数据可能会危及服务器的安全性,甚至会使其崩溃(如果以这种方式故意构造的话)。


您能详细说明一下吗?我不确定“他们打算挂载的文件系统上的数据”将如何危害安全性。如果您可以正常读取/写入文件,则应该可以挂载它(这是我的观点)。如果我可以读取/写入安装点,那么除了实际将其安装到目录之外,我应该能够进行所有安装。如果您无法读取/写入它,或者无法查看它所在的目录以查看它是否存在,则挂载将以与ls或cat type命令相同的方式失败。

如果“您”是单个用户,则您的论点有效;请记住,Linux(和Unix)是多用户系统,用户不一定是受信任的。
sendmoreinfo

suid可执行文件可以被添加到一个设备,安装在你的盒子,并用于根框,默认情况下是为什么owneruser(s)设置nosuid。您不希望有人能够轻松地绕过该漏洞,而是允许他们手动删除nosuid
RS

@sendmoreinfo我很清楚Linux是一个多用户系统,不需要光顾。我想知道为什么限制我安装网络共享和映像文件,否则我将拥有很多访问权限。kormoc的答案很有启发性,尽管我很好奇为什么不能对非root用户(例如nosuid)强制使用某些标志来解决此问题。看来我应该能够挂载,以便简单地读取/写入本来可以访问的映像文件/网络共享,然后将其挂接到我拥有的挂载点上。
CrazyCasta

1
@CrazyCasta WRT“使系统崩溃”,当然有可能安装有缺陷的硬件,从而利用硬件接口中的漏洞。任何拥有足够坏块的硬盘驱动器的人都可以告诉您它如何影响内核(进而影响整个系统)-它进入繁忙的循环并有效地使整个套件和kaboodle瘫痪。可能存在某种逻辑,导致无法解决,因为这是一个众所周知的问题,已经存在了很长时间,没有解决方案。
goldilocks

0

在GNOME中,gvfs不需要root来安装远程文件系统(ftp或ssh),并且gnome-mount也不需要root来安装外部存储(usb驱动器,CD / DVD等)。

大多数系统可能不希望整个GNOME仅用于某些远程安装,然后可以使用lufssshfsftpfs

gvfs,lufs,sshfs和ftpfs使用FUSE允许非root用户安装虚拟文件系统;与安装不同-o user,FUSE不需要系统管理员来安排特定的安装。只要您拥有安装目录的特权以及构建文件系统所需的任何资源,就可以创建FUSE装载。

为什么安装需要root特权?

因为mount主要/最初用于本地文件系统,所以几乎总是涉及硬件。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.