루트가 아닌 사용자가 Linux에 임의의 외부 USB 드라이브를 마운트할 수 있도록 하는 좋은 방법이 있습니까?

루트가 아닌 사용자가 Linux에 임의의 외부 USB 드라이브를 마운트할 수 있도록 하는 좋은 방법이 있습니까?

사이트 사무실에 두 대의 Rocky Linux 8 서버가 있고 클라이언트로부터 정기적으로 많은 양의 데이터를 받는 상황이 있습니다. 데이터는 다양한 외부 USB 하드 드라이브와 가끔 USB 메모리 스틱에 도착합니다. 이러한 드라이브에는 모든 종류의 파일 시스템이 있을 수 있지만 가장 일반적인 것은 NTFS 및 exFAT입니다.

NTFS는 기본적으로 RL8에서 지원되지만 exFAT는 지원되지 않습니다. 우리는 rpmfusion의 퓨즈-exfat 패키지를 사용했습니다. (https://github.com/relan/exfat).

루트 액세스 권한이 없거나 없어도 되는 사용자가 이러한 기능을 원활하게 마운트할 수 있기를 바랍니다. 이전에는 pmount를 사용했지만 pmount는 exFAT와 잘 작동하지 않습니다. exFAT이 아니라 FUSE이기 때문인 것 같습니다.

이를 달성할 수 있는 훌륭하고 안전한 방법이 있습니까?

편집: pmount는 마운트 주변의 매우 얇은 래퍼로 보이며 실행 파일의 setuid 비트를 통해 권한이 부여됩니다. 따라서 기본적으로 이는 한정된 마운트 명령 세트이며 exfat는 그중 하나가 아닙니다. 여기에 몇 가지 토론이 있습니다.https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=755434제안된 패치는 여기에 있습니다: launchpadlibrarian.net/229524614/pmount.exfat.patch

답변1

를 사용하면 udisks2사용자가 루트 액세스 없이 저장 장치를 관리하고 마운트할 수 있습니다.

설정

  • 도구를 설치합니다.sudo dnf install udisks2 ntfs-3g fuse-exfat
  • 사용자가 다음을 관리하도록 허용합니다.sudo usermod -a -G disk <username>

그룹 의 루트가 아닌 사용자는 명령줄 도구를 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* 변수를 사용하여 호출 사용자의 실제 ID/gid를 얻고 정규식을 사용하여 장치 사양을 간단하게 확인합니다. 그러면 해당 내용은 umount-usb다음과 같습니다.

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

구성은 명령 을 사용하여 파일 sudo편집을 완료합니다 (또는 vi 대신 다른 편집기를 사용). 여기서 일부 사용자나 그룹은 암호를 묻지 않고 루트로 특정 명령을 실행할 수 있습니다. 사용자 john 및 그룹 usb-mounters의 예:/etc/sudoersvisudoVISUAL=nano visudo

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

/dev/xx 인수만 활성화하는 정규식 mount-usb과 이를 비활성화하는 null 문자열에 유의하세요 umount-usb(sudoers 매뉴얼). 이 정의를 사용하면 스크립트에서 /dev/xx에 대한 테스트를 생략할 수 있지만 어떤 경우에도 이를 유지하는 것을 선호합니다.

관련 정보