
У нас есть ситуация, когда в офисе есть пара серверов 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 в скрипте с этим определением, но я предпочитаю сохранить ее в любом случае.