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

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

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

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

答案1

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

不安全的方式

让任何使用 run mount,例如,通过 sudo 。你不妨给他们root;这是同一件事。用户可以使用bash—running 的 suid root 副本挂载文件系统,该副本会立即提供 root 权限(除了运行的事实之外,可能没有任何日志记录mount)。

或者,用户可以将自己的文件系统安装在 之上/etc,包含他/她自己的/etc/shadow或副本,然后使用或/etc/sudoers获取 root 权限。或者可能对这两个文件之一进行绑定安装 ( )。或者将新文件放入.susudomount --bind/etc/sudoers.d

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

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

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

实际上,各种桌面环境已经为此构建了解决方案,以允许用户安装可移动媒体。它们的工作方式是安装在 only 的子目录中/media,并通过内核选项关闭 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 

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

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

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

我所知道的关于用户命名空间的最好文档是一篇 LWN 文章 操作中的命名空间,第 5 部分:用户命名空间

现在,我会选择 udisks2。

答案2

您可以这样做,但您需要修改与要挂载的文件系统相对应的条目,向该条目/etc/fstab添加标志。user然后非特权用户就可以安装它。

man mount更多细节。

答案3

这里是配置的wiki波尔基特规则乌迪卡/乌迪卡2为了通过非root(例如用户)组挂载分区。

将下面的代码保存到/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];
  }
});

假设您位于“users”组中,使用以下命令挂载分区(无​​需 sudo)。

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

# udisks
udisks --mount /dev/sda1

答案4

您可以配置sudo为允许一组用户运行该mount命令。

更新:至于如何通过安装来损坏系统?例如,您可以在文件系统上创建 setuid root shell,然后挂载并执行该 shell 以获得 root 权限。

相关内容