![如何允许非超级用户挂载任何文件系统?](https://linux22.com/image/51543/%E5%A6%82%E4%BD%95%E5%85%81%E8%AE%B8%E9%9D%9E%E8%B6%85%E7%BA%A7%E7%94%A8%E6%88%B7%E6%8C%82%E8%BD%BD%E4%BB%BB%E4%BD%95%E6%96%87%E4%BB%B6%E7%B3%BB%E7%BB%9F%EF%BC%9F.png)
是否可以允许某些特定用户(例如组的成员)挂载任何Linux 上没有超级用户权限的文件系统?
另一个问题可能是“用户可以通过什么方式通过挂载文件系统来损害系统?”
答案1
有几种方法,其中一些大多是安全的,另一些则根本不安全。
不安全的方式
让任何使用 run mount
,例如,通过 sudo 。你不妨给他们root;这是同一件事。用户可以使用bash
—running 的 suid root 副本挂载文件系统,该副本会立即提供 root 权限(除了运行的事实之外,可能没有任何日志记录mount
)。
或者,用户可以将自己的文件系统安装在 之上/etc
,包含他/她自己的/etc/shadow
或副本,然后使用或/etc/sudoers
获取 root 权限。或者可能对这两个文件之一进行绑定安装 ( )。或者将新文件放入.su
sudo
mount --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 权限。