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


47

是否可以允许某些特定用户(例如,组的成员)在Linux上挂载任何文件而无需超级用户特权?

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


也许gvfs-mount-d /dev/sdX
KrisWebDev '16

Answers:


44

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

不安全的方式

让任何用户运行mount,例如通过sudo。您不妨让他们扎根;这是同一件事。用户可以使用suid根副本装载文件系统,该副本的根目录为-bash运行时会立即提供根目录(可能没有任何日志记录,超出了mount运行的事实)。

或者,用户可以将自己的文件系统挂载在之上/etc,其中包含自己的/etc/shadow或副本/etc/sudoers,然后使用su或获得根目录sudo。或mount --bind在这两个文件之一上绑定()。或将新文件放入/etc/sudoers.d

类似的攻击可能会在/etc/pam.d其他许多地方展开。

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

最安全的方式:udisk或类似方法

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

如果必须的话,您可以编写自己的脚本来执行类似的操作,然后通过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之类的东西。

此外,出于安全原因,许多发行版内核都默认不允许不特权用户使用用户名称空间。例如Debiankernel.unprivileged_userns_clone默认值是0。其他发行版具有相似的设置,尽管名称经常略有不同。

我所了解的有关用户名称空间的最佳文档是LWN文章“ 操作中的名称空间,第5部分:用户名称空间”

现在,我将使用udisks2。


感谢您的回答!顺便说一句,您认为允许组中的用户mount能够像root一样挂载文件系统是安全的吗?我将阅读您链接的名称空间文档,并至少在练习中尝试实现此安装组。

@gkya我希望我的第一部分已经明确指出,允许(a)在不强制使用nosuid [以及nodev]的情况下挂载文件系统;或(b)在任意位置基本上是生根。如果您授予某人运行任意mount命令的权限,则与授予root 权限相同。
derobert

@gkya来自“每个分区都有许多分区的许多可移动驱动器”中的另一个答案,我想您想使用“ udisks或类似的方法”。
derobert

1
@derobert,因为您在谈论用户名称空间,所以您可能想从Bell Labs(这是同一人开发的UNIX的后继产品)中检出Plan 9。它将文件树建模为每个进程的名称空间(没有诸如root之类的东西)。令人着迷的东西。
13年

1
@malan好,我已经更新了。如果有的话,我认为为此使用用户名称空间似乎会更远。
derobert

16

您可以执行此操作,但是您需要修改与/etc/fstab要挂载的文件系统相对应的条目,并将标志添加user到该条目。然后,非特权用户将能够安装它。

请参阅man mount以获取更多详细信息。


1
这是我在Google上可以找到的唯一答案。我发现在FreeBSD上,可以允许用户通过设置变量(即vfs.usermount)来挂载文件系统。我要…… 与此类似。我使用许多可移动驱动器,每个驱动器上都有多个分区,并且为每个驱动器在fstab中添加一打或两个条目会很麻烦。

丑陋的解决方法可能是udev随着新设备的出现和消失而管理条目。
小丑

我还没有发现它可以在Mint或Ubuntu上运行。是的,默认用户帐户无需root即可安装,但是“标准” /“桌面”用户无法安装。
约翰尼,为什么

6

是用于为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

2
似乎要走的路,但对我没有用。
斯特凡纳·古里科

5

1看它在哪里工作

在Xubuntu上,它可以立即使用,以挂载和弹出USB大容量存储,硬盘分区,CD / DVD以及更多内容。

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

2选择相关部分

在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

3利润!

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


只有这样才能在类似debian的系统中起作用,不知道为什么在/ etc /上放置规则不起作用。
安华

在debian上不起作用。
菲利普·路德维希

1
在XFCE上的Debian Buster上工作!谢谢!
Maxwel Leite

3

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

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


我已经想到了这一点,但这不是要求用户使用sudo?运行命令吗?而且,不是root用户使用此方法仅在后台安装文件系统吗?

是的,他们需要sudo,是的,它将以root的身份运行。为了解决第一个问题,你可以别名mountsudo mount或使用包装脚本。
小丑2013年

我想要的是在没有root用户代理的情况下挂载文件系统。用任何东西掩盖这家公司根本不是我想要的。

请注意,即使添加user到fstab也只能起作用,因为它mount是setuid root。内核正在检查root或CAP_SYS_ADMIN功能,因此您无法真正避免涉及root。
小丑2013年

您可以配置,如何?这没有帮助。
Nuzzolilo '16

0

要用括号回答您的问题,由于文件系统是文件的占位符,因此用户可能会对该文件系统执行有害的操作,例如删除文件。

总结其他两个问题,我会这样说:

  • fstab非常适合在引导时安装永久存储。当您要插入USB驱动器或偶尔挂载某些网络共享时,它不是很好。

  • sudo mount如果您使用的是ubuntu *系统,也可以。不过,您仍然需要输入密码。

  • udev 将负责在ubuntu *系统中安装USB记忆棒,相机和闪存卡之类的东西(但不会在用户友好度较低的发行版中,例如debian,slackware等)

从历史上讲,我将添加授予某些用户(或组)权限的Unix方式是通过sudoers文件。

有很多使用它的指南,因此我不建议任何特别的用法。我会说我使用Linux文档项目网站来了解它。

更重要的sudoers是,您可以透明地挂载设备和共享-即使您选择这样做也不必提供密码(请特别小心)。

我通常在控制环境中执行的操作是使用sudoers文件允许特定组的用户透明地安装网络共享。所以我添加的命令mount.nfs,并mount.cifs在sudoers文件中,允许的操作,如“从网络文件服务器安装用户的主文件夹,当用户登录到客户端”和studd这样。


1
如果您使用sudo允许用户在登录时挂载其主文件夹,则应查看autofs。
derobert

我一起使用;我不知道如何单独使用将文件服务器上的文件autofs挂载/home/$USER/home/$USER/fromFS/客户端PC上的位置。
nass 2013年

0

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。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.