Existe uma boa maneira de permitir que usuários não-root montem unidades USB externas arbitrárias no Linux?

Existe uma boa maneira de permitir que usuários não-root montem unidades USB externas arbitrárias no Linux?

Temos uma situação em que um escritório local possui alguns servidores Rocky Linux 8 e recebe regularmente grandes quantidades de dados de clientes. Os dados chegam em uma variedade de discos rígidos USB externos e em cartões de memória USB ocasionais. Essas unidades podem ter todos os tipos de sistemas de arquivos, mas os mais comuns são NTFS e exFAT.

NTFS é suportado nativamente em RL8, mas exFAT não. Usamos o pacote fuse-exfat do rpmfusion. (https://github.com/relan/exfat).

Gostaria que meus usuários, que não têm e não deveriam ter acesso root, pudessem montá-los sem problemas. Anteriormente, usamos pmount, mas pmount não funciona bem com exFAT. Acho que é porque é FUSE, não porque é exFAT.

Existe uma maneira boa e segura de conseguir isso?

Editar: pmount parece ser um invólucro muito fino em torno da montagem, e as permissões são obtidas por meio de um bit setuid no executável. Então, basicamente, é um conjunto finito de comandos de montagem, e exfat não é um deles. Há alguma discussão aqui:https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=755434e um patch proposto aqui: launchpadlibrarian.net/229524614/pmount.exfat.patch

Responder1

Você poderia usar udisks2, que permite aos usuários gerenciar e montar dispositivos de armazenamento sem acesso root.

Configurar

  • Instale a ferramenta:sudo dnf install udisks2 ntfs-3g fuse-exfat
  • Permitir que o usuário gerencie:sudo usermod -a -G disk <username>

Os usuários não root do diskgrupo podem usar a udisksctlferramenta de linha de comando para gerenciar e montar unidades externas.

Substitua <username>pelo usuário que você deseja permitir o gerenciamento das unidades.

Exemplos de uso

  • Monte uma unidade:udisksctl mount -b /dev/sdXY
  • Desembale uma unidade:udisksctl unmount -b /dev/sdXY
  • Obter informação:udisksctl info -b /dev/sdXY

Responder2

Acho que acertei. Adicione a seguinte regra polkit a /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;
    }
  }
});

Para testar, monte o disco, como usuário normal, com:

udisksctl mount -b /dev/sdb

E verifique a saída com journalctl.

Responder3

Você pode configurar sudopara permitir que os usuários executem algum script especialmente criado para montar unidades USB em um ponto de montagem fixo indicando apenas o dispositivo. Por exemplo, eles poderiam executar:

sudo mount-usb /dev/sdb

onde o script tentará montar /dev/usb e montá-lo, por exemplo, em /mnt/usb, e informar isso ao usuário. Da mesma forma, podemos ter um umount-usbscript para desmontar a unidade com:

sudo umount-usb

O script mount-usb poderia ser assim:

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

Usamos vars SUDO* para obter o id/gid real do usuário chamador e fazer uma verificação simples da especificação do dispositivo com um regex. O correspondente umount-usbserá então:

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

A configuração do sudoé feita editando o /etc/sudoersarquivo com o visudocomando (ou VISUAL=nano visudousando outro editor em vez do vi), onde podemos deixar alguns usuários ou grupos executarem determinados comandos como root sem pedir senha. Exemplo para o usuário john e o grupo usb-mounters:

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

Observe o regex para ativar apenas os argumentos /dev/xx mount-usbe a string nula para desabilitá-los umount-usb(conforme descrito nomanual do sudoers). Podemos omitir o teste para /dev/xx no script com esta definição, mas prefiro mantê-lo de qualquer maneira.

informação relacionada