如何允许非超级用户挂载任何文件系统?

60 linux mount not-root-user

是否可以允许某些特定用户(例如组成员)在 Linux 上没有超级用户权限的情况下挂载任何文件系统?

另一个问题可能是“用户可以通过哪些方式通过挂载文件系统来损害系统?”

der*_*ert 57

有几种方法,其中一些大多是安全的,而另一些则根本不安全。

不安全的方式

让任何使用运行mount,例如,通过 sudo。你不妨给他们根;这是同一件事。用户可以挂载一个 suid root 副本的文件系统bash-running 立即给出 root(可能没有任何日志记录,超出了mount运行的事实)。

或者,用户可以将他自己的文件系统挂载在 之上/etc,包含他/她自己的/etc/shadow或副本/etc/sudoers,然后使用su或获取根sudo。或者可能mount --bind对这两个文件之一进行绑定挂载 ( )。或者一个新文件到/etc/sudoers.d.

类似的攻击可以在/etc/pam.d许多其他地方进行。

请记住,文件系统甚至不需要在设备上,-o loop将挂载用户拥有(因此可修改)的文件。

最安全的方式:udisks 或类似的

各种桌面环境实际上已经为此构建了解决方案,以允许用户安装可移动媒体。它们的工作方式是挂载在/mediaonly的子目录中,并通过内核选项关闭 set-user/group-id 支持。此处的选项包括udisks、udisks2、pmount、usbmount、

如果必须,您可以编写自己的脚本来执行类似的操作,并通过 sudo 调用它——但您必须非常小心地编写此脚本,以免留下 root 漏洞。如果您不希望您的用户必须记住 sudo,您可以在脚本中执行以下操作:

#!/bin/bash
if [ $UID -ne 0 ]; then       # or `id -u`
    exec sudo -- "$0" "$@"
fi

# rest of script goes here 
Run Code Online (Sandbox Code Playgroud)

总有一天会安全的方式:用户命名空间

Linux 命名空间是一种非常轻量级的虚拟化形式(更具体地说,是容器)。特别是,对于用户命名空间,系统上的任何用户都可以创建自己的 root 环境。这将允许他们挂载文件系统,除了少数虚拟文件系统外已被明确阻止。最终,FUSE 文件系统可能会被允许,但我能找到的最新补丁不包括块设备,只包括 sshfs 之类的东西。

此外,许多发行版内核(出于安全原因)默认不允许非特权用户使用用户名称空间;例如,Debian的kernel.unprivileged_userns_clone默认值为 0。其他发行版也有类似的设置,但名称通常略有不同。

我所知道的关于用户命名空间的最好的文档是 LWN 文章 Namespaces in operation,第 5 部分:用户命名空间。

现在,我会选择 udisks2。

  • @derobert 多么悲伤。我读了答案,看到它是 2015 年的,心想“我想知道我们现在是否有这个!” (3认同)
  • @derobert 我们可以得到“**有一天安全的方式:用户命名空间**”部分的更新吗? (2认同)
  • @malan 好的,我已经更新了。如果说有什么不同的话,我认为使用用户命名空间来实现这一点看起来会更遥远。 (2认同)

MBR*_*MBR 24

你可以这样做,但是你需要修改/etc/fstab你要挂载的文件系统对应的条目,在user这个条目中添加标志。非特权用户将能够安装它。

有关man mount更多详细信息,请参阅。


Meo*_*eow 8

这是为udisks/udisks2配置polkit规则以便按非 root(例如用户)组挂载分区的 wiki 。

将下面的代码保存到/etc/polkit-1/rules.d/50-udisks.rules

polkit.addRule(function(action, subject) {
  var YES = polkit.Result.YES;
  var permission = {
    // only required for udisks1:
    "org.freedesktop.udisks.filesystem-mount": YES,
    "org.freedesktop.udisks.filesystem-mount-system-internal": YES,
    "org.freedesktop.udisks.luks-unlock": YES,
    "org.freedesktop.udisks.drive-eject": YES,
    "org.freedesktop.udisks.drive-detach": YES,
    // only required for udisks2:
    "org.freedesktop.udisks2.filesystem-mount": YES,
    "org.freedesktop.udisks2.filesystem-mount-system": YES,
    "org.freedesktop.udisks2.encrypted-unlock": YES,
    "org.freedesktop.udisks2.eject-media": YES,
    "org.freedesktop.udisks2.power-off-drive": YES,
    // required for udisks2 if using udiskie from another seat (e.g. systemd):
    "org.freedesktop.udisks2.filesystem-mount-other-seat": YES,
    "org.freedesktop.udisks2.encrypted-unlock-other-seat": YES,
    "org.freedesktop.udisks2.eject-media-other-seat": YES,
    "org.freedesktop.udisks2.power-off-drive-other-seat": YES
  };
  if (subject.isInGroup("users")) {
    return permission[action.id];
  }
});
Run Code Online (Sandbox Code Playgroud)

假设您在“users”组中,使用以下命令挂载一个分区(不需要 sudo)。

# udisks2
udisksctl mount --block-device /dev/sda1

# udisks
udisks --mount /dev/sda1
Run Code Online (Sandbox Code Playgroud)

  • 似乎是要走的路,但对我不起作用。 (2认同)

Sté*_*hon 7

1 看看它在哪里工作

在Xubuntu 上,它可以开箱即用地安装和弹出USB 大容量存储器、硬盘分区、CD/DVD 等。

让我们假设 Ubuntu 选择的使用 policyKit 的解决方案足够安全。

2 选择相关部分

在 Debian 8.3 上的 XFCE 上,我需要允许用户在没有密码的情况下从 thunar 挂载和弹出文件系统。对我有用的是从 Ubuntu 中挑选一个权限文件。

将下面的行作为 root 添加到名为的文件中/var/lib/polkit-1/localauthority/10-vendor.d/com.ubuntu.desktop.pkla应该可以解决问题:

[Mounting, checking, etc. of internal drives]
Identity=unix-group:admin;unix-group:sudo
Action=org.freedesktop.udisks.filesystem-*;org.freedesktop.udisks.drive-ata-smart*;org.freedesktop.udisks2.filesystem-mount-system;org.freedesktop.udisks2.encrypted-unlock-system;org.freedesktop.udisks2.filesystem-fstab;
ResultActive=yes
Run Code Online (Sandbox Code Playgroud)

3 利润!

(我所做的实际上是从 Ubuntu 16.04 上的同名文件中选择更多,它对我有用。如果你需要它,它主要看起来像https://gist.github.com/kafene/5b4aa4ebbd9229fa2e73的内容)