有没有一个好的方法可以让非 root 用户在 Linux 上挂载任意外部 USB 驱动器?

有没有一个好的方法可以让非 root 用户在 Linux 上挂载任意外部 USB 驱动器?

我们遇到过这样的情况:一个现场办公室有几台 Rocky Linux 8 服务器,并定期从客户那里接收大量数据。数据通过各种外部 USB 硬盘和偶尔的 USB 记忆棒到达。这些驱动器可以有各种文件系统,但最常见的是 NTFS 和 exFAT。

RL8 原生支持 NTFS,但不支持 exFAT。我们使用了 rpmfusion 中的 fuse-exfat 包。(https://github.com/relan/exfat)。

我希望我的用户能够顺利地安装这些文件,他们没有、也不应该有 root 访问权限。以前,我们使用过 pmount,但 pmount 与 exFAT 配合得不好。我认为这是因为它是 FUSE,而不是因为它是 exFAT。

有没有一个好的、安全的方法来达到这个目的?

编辑:pmount 似乎是 mount 的一个非常薄的包装器,权限是通过可执行文件上的 setuid 位实现的。因此,基本上它是一组有限的 mount 命令,而 exfat 不是其中之一。这里有一些讨论:https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=755434此处建议使用以下补丁:launchpadlibrarian.net/229524614/pmount.exfat.patch

答案1

您可以使用udisks2,它允许用户在没有 root 访问权限的情况下管理和安装存储设备。

设置

  • 安装工具:sudo dnf install udisks2 ntfs-3g fuse-exfat
  • 允许用户管理:sudo usermod -a -G disk <username>

组中的非root用户disk可以使用udisksctl命令行工具来管理和挂载外部驱动器。

替换<username>为您允许管理驱动器的用户。

使用示例

  • 安装驱动器:udisksctl mount -b /dev/sdXY
  • 解除驱动器的锁定:udisksctl unmount -b /dev/sdXY
  • 获取信息:udisksctl info -b /dev/sdXY

答案2

我认为我成功了。将以下 polkit 规则添加到/etc/polkit-1/rules.d/10-allow-usb-mounts.rules

polkit.addRule(function(action, subject) {
  if (action.id == "org.freedesktop.udisks2.filesystem-mount-other-seat" && subject.isInGroup("groupforthosewhocanmountusbdisks")) {
    var bus = action.lookup("drive.removable.bus");
    if (bus == "usb" || bus == "firewire") {
      polkit.log("polkit rule for mounting USB drives with udisks2")
      polkit.log("Device: " + action.lookup("device"))
      polkit.log("Drive: " + action.lookup("drive"))
      polkit.log("Bus: " + bus)
      polkit.log("Serial: " + action.lookup("drive.serial"))
      polkit.log("Vendor: " + action.lookup("drive.vendor"))
      polkit.log("Model: " + action.lookup("drive.model"))
      return polkit.Result.YES;
    }
  }
});

要测试,请以普通用户身份安装磁盘,使用以下命令:

udisksctl mount -b /dev/sdb

并使用 检查输出journalctl

答案3

您可以配置sudo让用户执行一些特制的脚本,将 USB 驱动器挂载到仅指示设备的固定挂载点上。例如,他们可以运行:

sudo mount-usb /dev/sdb

脚本将尝试挂载 /dev/usb,例如,挂载在 /mnt/usb 中,并通知用户。同样,我们可以用以下脚本umount-usb卸载驱动器:

sudo umount-usb

mount-usb 脚本可能是这样的:

#!/bin/bash
# mount-usb: mount drives in /mnt/usb
[ -z "$1" ] && echo "Use: $0 device" && exit
if ! [[ $1 =~ ^/dev/.*$ ]] ; then
   echo "Use /dev/xxx as device"
   exit
fi
mount -t auto -o uid=$SUDO_UID,gid=$SUDO_UID,ro "$1" /mnt/usb
mount | grep /mnt/usb    #-- show result

我们使用 SUDO* vars 获取调用用户的真实 id/gid,并使用正则表达式对设备规格进行简单检查。相应的内容umount-usb如下:

#!/bin/bash
# umount-usb: unmounts the device in /mnt/usb
umount /mnt/usb

的配置sudo/etc/sudoers使用visudo命令编辑文件(或VISUAL=nano visudo使用其他编辑器代替 vi)完成的,我们可以让某些用户或组以 root 身份执行某些命令而无需输入密码。以用户 john 和组 usb-mounters 为例:

Defaults       !lecture
Cmnd_Alias     USBMNT = /root/mount-usb ^/dev/.*$, umount-usb ""
john           ALL=NOPASSWD: USBMNT
%usb-mounters  ALL=NOPASSWD: USBMNT

请注意,正则表达式仅启用 /dev/xx 参数,mount-usb而空字符串则禁用它们umount-usb(如sudoers 手册)。我们可以用这个定义来省略脚本中对/dev/xx的测试,但是无论如何我还是喜欢保留它。

相关内容