
Tenemos una situación en la que una oficina de sitio tiene un par de servidores Rocky Linux 8 y recibe regularmente grandes cantidades de datos de los clientes. Los datos llegan a una variedad de discos duros USB externos y, ocasionalmente, a una memoria USB. Estas unidades pueden tener todo tipo de sistemas de archivos, pero los más comunes son NTFS y exFAT.
NTFS es compatible de forma nativa con RL8, pero exFAT no. Hemos utilizado el paquete fuse-exfat de rpmfusion. (https://github.com/relan/exfat).
Me gustaría que mis usuarios, que no tienen ni deberían tener acceso de root, pudieran montarlos sin problemas. Anteriormente, hemos usado pmount, pero pmount no funciona bien con exFAT. Creo que es porque es FUSE, no porque sea exFAT.
¿Existe una forma buena y segura de lograrlo?
Editar: pmount parece ser un contenedor muy delgado alrededor del montaje, y los permisos se logran mediante un bit setuid en el ejecutable. Básicamente es un conjunto finito de comandos de montaje, y exfat no es uno de ellos. Hay algo de discusión aquí:https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=755434y un parche propuesto aquí: launchpadlibrarian.net/229524614/pmount.exfat.patch
Respuesta1
Podrías usar udisks2
, que permite a los usuarios administrar y montar dispositivos de almacenamiento sin acceso de root.
Configuración
- Instale la herramienta:
sudo dnf install udisks2 ntfs-3g fuse-exfat
- Permitir al usuario administrar:
sudo usermod -a -G disk <username>
Los usuarios no root del disk
grupo pueden utilizar la udisksctl
herramienta de línea de comandos para administrar y montar unidades externas.
Reemplace <username>
con el usuario al que desea permitirle administrar las unidades.
Ejemplos de uso
- Montar una unidad:
udisksctl mount -b /dev/sdXY
- Desmontar una unidad:
udisksctl unmount -b /dev/sdXY
- Obtener información:
udisksctl info -b /dev/sdXY
Respuesta2
Creo que lo logré. Agregue la siguiente regla 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 probar, monte el disco, como usuario normal, con:
udisksctl mount -b /dev/sdb
Y verifique la salida con journalctl
.
Respuesta3
Puede configurarlo sudo
para permitir que los usuarios ejecuten algún script especialmente diseñado para montar unidades USB en un punto de montaje fijo que indique solo el dispositivo. Como ejemplo, podrían ejecutar:
sudo mount-usb /dev/sdb
donde el script intentará montar /dev/usb y montarlo, por ejemplo, en /mnt/usb, e informar de ello al usuario. De manera similar, podemos tener un umount-usb
script para desmontar la unidad con:
sudo umount-usb
El script mount-usb podría ser así:
#!/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 SUDO* vars para obtener la identificación/gid real del usuario que llama y realizar una verificación simple de la especificación del dispositivo con una expresión regular. Lo correspondiente umount-usb
será entonces:
#!/bin/bash
# umount-usb: unmounts the device in /mnt/usb
umount /mnt/usb
La configuración de sudo
se realiza editando el /etc/sudoers
archivo con el visudo
comando (o VISUAL=nano visudo
usar otro editor en lugar de vi), donde podemos dejar que algunos usuarios o grupos ejecuten ciertos comandos como root sin pedir contraseña. Ejemplo para el usuario john y el grupo usb-mounters:
Defaults !lecture
Cmnd_Alias USBMNT = /root/mount-usb ^/dev/.*$, umount-usb ""
john ALL=NOPASSWD: USBMNT
%usb-mounters ALL=NOPASSWD: USBMNT
Tenga en cuenta la expresión regular para habilitar solo los argumentos /dev/xx mount-usb
y la cadena nula para deshabilitarlos umount-usb
(como se describe en elmanual de usuario). Podemos omitir la prueba para /dev/xx en el script con esta definición, pero prefiero mantenerla en cualquier caso.