是否可以允许某些特定用户(例如组成员)在 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将挂载用户拥有(因此可修改)的文件。
各种桌面环境实际上已经为此构建了解决方案,以允许用户安装可移动媒体。它们的工作方式是挂载在/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。
这是为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)
在Xubuntu 上,它可以开箱即用地安装和弹出USB 大容量存储器、硬盘分区、CD/DVD 等。
让我们假设 Ubuntu 选择的使用 policyKit 的解决方案足够安全。
在 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)
(我所做的实际上是从 Ubuntu 16.04 上的同名文件中选择更多,它对我有用。如果你需要它,它主要看起来像https://gist.github.com/kafene/5b4aa4ebbd9229fa2e73的内容)
| 归档时间: |
|
| 查看次数: |
167442 次 |
| 最近记录: |