非ルートユーザーが Linux 上で任意の外部 USB ドライブをマウントできるようにする良い方法はありますか?

非ルートユーザーが Linux 上で任意の外部 USB ドライブをマウントできるようにする良い方法はありますか?

あるサイト オフィスには Rocky Linux 8 サーバーが 2 台あり、クライアントから定期的に大量のデータを受け取っています。データはさまざまな外付け USB ハード ドライブや、場合によっては USB メモリ スティックで届きます。これらのドライブにはさまざまなファイル システムがありますが、最も一般的なのは NTFS と exFAT です。

RL8 では NTFS がネイティブでサポートされていますが、exFAT はサポートされていません。rpmfusion の fuse-exfat パッケージを使用しました。(出典: relan)。

ルート アクセスを持たない、または持つべきではないユーザーが、これらをスムーズにマウントできるようにしたいと思います。以前は 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

ユーザーが特別に作成されたスクリプトを実行して、デバイスのみを示す固定マウント ポイントに USB ドライブをマウントできるように設定できますsudo。たとえば、次のように実行できます。

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 の代わりに別のエディターを使用します)。これにより、一部のユーザーまたはグループがパスワードを要求せずに特定のコマンドを root として実行できるようになります。ユーザー 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、では無効にするヌル文字列に注意してくださいumount-usbsudoers マニュアル)。この定義を使用すると、スクリプト内の /dev/xx のテストを省略できますが、いずれにしてもこれを保持することを好みます。

関連情報