Gibt es eine gute Möglichkeit, Nicht-Root-Benutzern das Mounten beliebiger externer USB-Laufwerke unter Linux zu ermöglichen?

Gibt es eine gute Möglichkeit, Nicht-Root-Benutzern das Mounten beliebiger externer USB-Laufwerke unter Linux zu ermöglichen?

Wir haben eine Situation, in der ein Standortbüro über ein paar Rocky Linux 8-Server verfügt und regelmäßig große Datenmengen von Kunden empfängt. Die Daten kommen auf einer Vielzahl externer USB-Festplatten und gelegentlich auf einem USB-Speicherstick an. Diese Laufwerke können alle möglichen Dateisysteme haben, aber die gängigsten sind NTFS und exFAT.

NTFS wird auf RL8 nativ unterstützt, exFAT jedoch nicht. Wir haben das Paket fuse-exfat von rpmfusion verwendet. (https://github.com/relan/exfat).

Ich möchte, dass meine Benutzer, die keinen Root-Zugriff haben und auch nicht haben sollten, diese problemlos mounten können. Bisher haben wir pmount verwendet, aber pmount funktioniert nicht gut mit exFAT. Ich denke, das liegt daran, dass es FUSE ist, nicht daran, dass es exFAT ist.

Gibt es eine gute und sichere Möglichkeit, dies zu erreichen?

Bearbeiten: pmount scheint ein sehr dünner Wrapper um mount zu sein, und Berechtigungen werden über ein Setuid-Bit in der ausführbaren Datei erreicht. Im Grunde handelt es sich also um eine begrenzte Anzahl von Mount-Befehlen, und exfat ist keiner davon. Hier gibt es einige Diskussionen:https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=755434und ein vorgeschlagener Patch hier: launchpadlibrarian.net/229524614/pmount.exfat.patch

Antwort1

Sie könnten verwenden udisks2, wodurch Benutzer Speichergeräte ohne Root-Zugriff verwalten und mounten können.

Aufstellen

  • Installieren Sie das Tool:sudo dnf install udisks2 ntfs-3g fuse-exfat
  • Benutzern die Verwaltung von Folgendem gestatten:sudo usermod -a -G disk <username>

Nicht-Root-Benutzer in der diskGruppe können das udisksctlBefehlszeilentool zum Verwalten und Mounten externer Laufwerke verwenden.

Ersetzen Sie es <username>durch den Benutzer, dem Sie die Verwaltung der Laufwerke erlauben möchten.

Anwendungsbeispiele

  • Mounten Sie ein Laufwerk:udisksctl mount -b /dev/sdXY
  • Ein Laufwerk aushängen:udisksctl unmount -b /dev/sdXY
  • Informationen bekommen:udisksctl info -b /dev/sdXY

Antwort2

Ich glaube, ich habe es geschafft. Fügen Sie die folgende Polkit-Regel hinzu /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;
    }
  }
});

Zum Testen mounten Sie die Festplatte als normaler Benutzer mit:

udisksctl mount -b /dev/sdb

Und überprüfen Sie die Ausgabe mit journalctl.

Antwort3

Sie können die Konfiguration so konfigurieren sudo, dass Benutzer ein speziell gestaltetes Skript ausführen können, um USB-Laufwerke an einem festen Einhängepunkt einzuhängen, der nur das Gerät angibt. Sie könnten beispielsweise Folgendes ausführen:

sudo mount-usb /dev/sdb

Dabei versucht das Skript, /dev/usb zu mounten, z. B. in /mnt/usb, und informiert den Benutzer darüber. Ebenso können wir ein umount-usbSkript haben, um das Laufwerk zu unmounten:

sudo umount-usb

Das Mount-USB-Skript könnte wie folgt aussehen:

#!/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

Wir verwenden SUDO*-Variablen, um die echte ID/GID des aufrufenden Benutzers zu erhalten und eine einfache Überprüfung der Gerätespezifikation mit einem regulären Ausdruck durchzuführen. Das entsprechende Ergebnis umount-usblautet dann:

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

Die Konfiguration sudoerfolgt durch Bearbeiten der /etc/sudoersDatei mit dem visudoBefehl (oder VISUAL=nano visudodurch Verwenden eines anderen Editors anstelle von vi). Hier können wir einigen Benutzern oder Gruppen erlauben, bestimmte Befehle als Root auszuführen, ohne nach einem Passwort zu fragen. Beispiel für den Benutzer John und die Gruppe usb-mounters:

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

Beachten Sie den regulären Ausdruck, um nur /dev/xx-Argumente zu aktivieren, mount-usbund den Null-String, um sie zu deaktivieren umount-usb(wie im Abschnittsudoers-Handbuch). Wir können den Test für /dev/xx im Skript mit dieser Definition weglassen, aber ich ziehe es vor, ihn auf jeden Fall beizubehalten.

verwandte Informationen