
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 disk
grupo podem usar a udisksctl
ferramenta 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 sudo
para 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-usb
script 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-usb
será então:
#!/bin/bash
# umount-usb: unmounts the device in /mnt/usb
umount /mnt/usb
A configuração do sudo
é feita editando o /etc/sudoers
arquivo com o visudo
comando (ou VISUAL=nano visudo
usando 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-usb
e 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.