是否可以允许某些特定用户(例如,组的成员)在Linux上挂载任何文件而无需超级用户特权?
另一个问题可能是“用户可以通过挂载文件系统以什么方式损害系统?”
是否可以允许某些特定用户(例如,组的成员)在Linux上挂载任何文件而无需超级用户特权?
另一个问题可能是“用户可以通过挂载文件系统以什么方式损害系统?”
Answers:
有几种方法,其中有些大多是安全的,有些则根本没有。
让任何用户运行mount
,例如通过sudo。您不妨让他们扎根;这是同一件事。用户可以使用suid根副本装载文件系统,该副本的根目录为-bash
运行时会立即提供根目录(可能没有任何日志记录,超出了mount
运行的事实)。
或者,用户可以将自己的文件系统挂载在之上/etc
,其中包含自己的/etc/shadow
或副本/etc/sudoers
,然后使用su
或获得根目录sudo
。或mount --bind
在这两个文件之一上绑定()。或将新文件放入/etc/sudoers.d
。
类似的攻击可能会在/etc/pam.d
其他许多地方展开。
请记住,文件系统甚至不必位于设备上,-o loop
而是会挂载用户拥有(因此可修改)的文件。
实际上,各种桌面环境已经为此构建了解决方案,以允许用户安装可移动媒体。它们的工作方式是/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名称空间是一种非常轻量级的虚拟化形式(具体来说是容器)。特别是,使用用户名称空间,系统上的任何用户都可以创建自己的根用户环境。这将允许他们挂载文件系统,除了已被明确阻止的虚拟系统(除了少数虚拟文件系统)外。最终,可能会允许使用FUSE文件系统,但是我发现的最新补丁并没有涵盖块设备,仅涵盖了sshfs之类的东西。
此外,出于安全原因,许多发行版内核都默认不允许不特权用户使用用户名称空间。例如Debian的kernel.unprivileged_userns_clone
默认值是0。其他发行版具有相似的设置,尽管名称经常略有不同。
我所了解的有关用户名称空间的最佳文档是LWN文章“ 操作中的名称空间,第5部分:用户名称空间”。
现在,我将使用udisks2。
mount
命令的权限,则与授予root 权限相同。
您可以执行此操作,但是您需要修改与/etc/fstab
要挂载的文件系统相对应的条目,并将标志添加user
到该条目。然后,非特权用户将能够安装它。
请参阅man mount
以获取更多详细信息。
vfs.usermount
)来挂载文件系统。我要…… 与此类似。我使用许多可移动驱动器,每个驱动器上都有多个分区,并且为每个驱动器在fstab中添加一打或两个条目会很麻烦。
udev
随着新设备的出现和消失而管理条目。
这是用于为udisks / udisks2配置polkit规则的Wiki,以便按非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];
}
});
假设您在“用户”组中,请使用以下命令来安装分区(无需sudo)。
# udisks2
udisksctl mount --block-device /dev/sda1
# udisks
udisks --mount /dev/sda1
在Xubuntu上,它可以立即使用,以挂载和弹出USB大容量存储,硬盘分区,CD / DVD以及更多内容。
假设Ubuntu使用policyKit选择的解决方案足够安全。
在Debian 8.3的XFCE上,我需要允许用户无需密码即可从thunar挂载和弹出文件系统。对我有用的是从Ubuntu中挑选权限文件。
将以下几行作为根添加到名为的文件中/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
(实际上,我所做的是从Ubuntu 16.04上的同名文件中选择了更多内容,它对我有用。如果需要,它看起来像https://gist.github.com/kafene/5b4aa4ebbd9229fa2e73的内容)
您可以配置sudo
为允许一组用户运行mount
命令。
更新:关于如何通过安装来损坏系统?例如,您可以在文件系统上创建setuid根shell,然后可以挂载并执行该shell以获取root特权。
mount
到sudo mount
或使用包装脚本。
user
到fstab也只能起作用,因为它mount
是setuid root。内核正在检查root或CAP_SYS_ADMIN
功能,因此您无法真正避免涉及root。
要用括号回答您的问题,由于文件系统是文件的占位符,因此用户可能会对该文件系统执行有害的操作,例如删除文件。
总结其他两个问题,我会这样说:
fstab
非常适合在引导时安装永久存储。当您要插入USB驱动器或偶尔挂载某些网络共享时,它不是很好。
sudo mount
如果您使用的是ubuntu *系统,也可以。不过,您仍然需要输入密码。
udev
将负责在ubuntu *系统中安装USB记忆棒,相机和闪存卡之类的东西(但不会在用户友好度较低的发行版中,例如debian,slackware等)
从历史上讲,我将添加授予某些用户(或组)权限的Unix方式是通过sudoers
文件。
有很多使用它的指南,因此我不建议任何特别的用法。我会说我使用Linux文档项目网站来了解它。
更重要的sudoers
是,您可以透明地挂载设备和共享-即使您选择这样做也不必提供密码(请特别小心)。
我通常在控制环境中执行的操作是使用sudoers
文件允许特定组的用户透明地安装网络共享。所以我添加的命令mount.nfs
,并mount.cifs
在sudoers文件中,允许的操作,如“从网络文件服务器安装用户的主文件夹,当用户登录到客户端”和studd这样。
autofs
挂载/home/$USER
到/home/$USER/fromFS/
客户端PC上的位置。
guestmount
libguestfs的诡计
sudo apt-get install libguestfs-tools
# Workarounds for Ubuntu 18.04 bugs.
# https://serverfault.com/questions/246835/convert-directory-to-qemu-kvm-virtual-disk-image/916697#916697
sudo rm -rf /var/cache/.guestfs-*
echo dash | sudo tee /usr/lib/x86_64-linux-gnu/guestfs/supermin.d/zz-dash-packages
sudo chmod +r /boot/vmlinuz-*
# Create a test image.
mkdir sysroot
dd if=/dev/urandom of=sysroot/myfile bs=1024 count=1024
virt-make-fs --format=raw --type=ext2 sysroot sysroot.ext2
# Mount it, have fun, unmount!
mkdir -p mnt
# /dev/sda becuase we have a raw filesystem.
guestmount -a sysroot.ext2.qcow2 -m /dev/sda mnt
cmp sysroot/myfile mnt/myfile
guestunmount mnt
依靠:
文件:http://libguestfs.org/guestmount.1.html
在Ubuntu 18.04上测试,libguestfs-tools 1:1.36.13-1ubuntu3。
gvfs-mount
-d /dev/sdX