Есть ли хороший способ разрешить пользователям без прав root монтировать произвольные внешние USB-накопители в Linux?

Есть ли хороший способ разрешить пользователям без прав root монтировать произвольные внешние USB-накопители в Linux?

У нас есть ситуация, когда в офисе есть пара серверов Rocky Linux 8, и он регулярно получает большие объемы данных от клиентов. Данные поступают на различные внешние жесткие диски USB и иногда на USB-флешки. Эти диски могут иметь все виды файловых систем, но наиболее распространенными являются NTFS и exFAT.

NTFS изначально поддерживается на RL8, а exFAT — нет. Мы использовали пакет fuse-exfat из rpmfusion. (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 в скрипте с этим определением, но я предпочитаю сохранить ее в любом случае.

Связанный контент