Montar dispositivos desde la terminal con udevil

Como habitualmente me gusta usar la terminal, suelo montar dispositivos desde ella. Para no tener que recurrir a la cuenta de root cada vez que necesito montar algo, utilizo alguna herramienta que me permita montar como usuario sin privilegios. Antiguamente usaba pmount para eso, y hasta hace poco estaba usando un script que había encontrado aquí para montar particiones usando hal.

El caso es que hal está descontinuado desde hace tiempo, ya que ahora sus características se han incorporado a udev, y en una de las últimas actualizaciones de mi ArchLinux ha desaparecido de una de mis máquinas. No sé por qué se ha ido de una y de la otra no 🙂 pero eso me ha hecho investigar otras alternativas. La opción en la que había pensado era udevil, ya que había leído algo sobre él hace tiempo, pero todavía no lo había probado, y me he llevado una sorpresa muy grata.

Qué es udevil

Udevil es un programa que permite montar dispositivos e incluso URLs desde linea de comandos y desde una cuenta sin privilegios. Admite montar discos USB, dispositivos ópticos (CD/DVD/BD), ficheros a través de loop device y unidades compartidas por red usando NFS, SMB, FTP, SSH y WebDav. Su uso es muy simple, ya que la sintaxis que tiene es similar a la del comando mount simplemente añadiendo “udevil” delante, y además no es necesario especificar las opciones ni el punto de montaje.

Udevil cuenta con un fichero de configuración en /etc/udevil/udevil.conf, con el que se puede controlar qué dispositivos se permite montar, con qué opciones y en qué punto. Con esto, permite controlar la seguridad razonablemente, ya que no es buena idea dejar que cualquiera pueda montar cualquier cosa.

El programa ha sido desarrollado para reemplazar a udisk en el gestor de ficheros SpaceFM, así que se lleva especialmente bien con él, pero puede usarse e instalarse de forma independiente. Si queremos automontar los dispositivos podemos usar el script devmon que viene con udevil o usar SpaceFM, que hace todo el automontaje por sí mismo, así que no hace falta usar devmon si estamos usando SpaceFM.

Instalando udevil

Existen paquetes para la mayoría de las distribuciones y muchas de ellas lo incluyen por defecto o en los repositorios, así que os remito a la forma de instalar paquetes específica de vuestra distro. En ArchLinux sería así:

$ sudo pacman -S udevil

Una vez instalado tendremos disponibles los comandos udevil y devmon, así como sus ficheros de configuración y un servicio de systemd para devmon. Como no uso automontaje no voy a decir nada más de devmon, pero ahí está para quien quiera usarlo.

Montando dispositivos y carpetas

Como he dicho antes, la sintaxis de udevil es similar a la de mount poniendo “udevil” delante, pero permite simplificar el comando. Además de autodetectar el sistema de ficheros, no es necesario especificar el punto de montaje, ya que utiliza por defecto el que aparezca en el fichero de configuración (normalmente /media). También usa las opciones por defecto que aparezcan en dicho fichero. Con todo esto, la forma más básica de montar un dispositivo es la siguiente:

$ udevil mount /dev/sdb1

Esto nos montará el dispositivo /dev/sdb1 en /media con un nombre que determinará automáticamente según la etiqueta de volumen del dispositivo, el modelo, el nombre, etc. También es posible especificar a propósito el punto de montaje, siempre que esté en uno de los directorios permitidos en el fichero de configuración.

$ udevil mount /dev/sdb1 /media/datos

Esto es útil si no queremos dejar que udevil escoja el nombre automáticamente.

Otra cosa que podemos hacer es poner opciones. En este caso solo se pueden poner las que estén permitidas en el fichero de configuración.

$ udevil mount -o ro /dev/sdb1 /media/datos

Si quisiéramos montar una carpeta compartida por SMB, tendríamos que especificar el protocolo, el nombre o IP del servidor y el nombre del recurso compartido usando una URL con una sintaxis similar a la que usan otros programas. El comando sería algo así:

$ udevil mount smb://192.168.0.10/compartido # Usando una dirección IP
$ udevil mount smb://tatooine/compartido     # Usando el nombre del servidor

También podemos especificar un nombre de usuario.

$ udevil mount smb://hexborg@tatooine/compartido

Si no especificamos un nombre de usuario, montará la carpeta como guest. Si el usuario que especificamos tiene contraseña en el servidor, nos la preguntará.

En el caso de querer montar recursos compartidos mediante otro protocolo el uso es exactamente el mismo. Solo es necesario especificar el protocolo correcto.

$ udevil mount ftp://hexborg@tatooine/ftppub

Otra posibilidad que udevil nos ofrece es montar ficheros a través de loop device. Por ejemplo, imágenes ISO. El comando sería tan sencillo como los anteriores:

$ udevil mount Core-current.iso

La forma de desmontar cualquier cosa que hayamos montado es usando “udevil umount” con el nombre del dispositivo, fichero o URL tal y como lo hemos puesto al montar. Por ejemplo:

$ udevil umount /dev/sdb1
$ udevil umount smb://hexborg@tatooine/compartido
$ udevil umount Core-current.iso

Es tan fácil desmontar como montar.

Configuración

En principio no es necesario configurar nada, ya que la configuración por defecto, tal cual viene, ya es suficiente para que todo funcione correctamente. Sin embargo, puede ser interesante conocer el fichero de configuración para mejorar la seguridad o para personalizar la forma de montar algunas cosas.

Dicho fichero de configuración está en /etc/udevil y se llama udevil.conf. No voy a detenerme mucho en él, ya que está muy bien explicado en los comentarios que hay en el propio fichero, pero comentaré algunas cosas que me parecen interesantes.

Las primeras opciones que nos aparecen son log_file y log_keep_days, que sirven para habilitar un fichero de log con todas las operaciones hechas con udevil y el número de días que se va a conservar ese log, pero las opciones más interesantes son la siguientes. Paso a comentároslas ahora:

  • allowed_types: Aquí se pueden especificar los tipos de los sistemas de ficheros que se permite montar. Se puede poner $KNOWN_FILESYSTEMS para los sistemas de ficheros reconocidos por el kernel, como ext4, vfat, etc, o añadir otros sistemas de ficheros específicos de udevil, como smbfs, ftpfs, davfs, etc.
  • allowed_users: Especifica una lista de usuarios que pueden usar udevil. Se pueden poner plantillas usando los caracteres “?” y “*“. Por defecto, el usuario root no puede usar udevil a no ser que aparezca aquí.
  • allowed_groups: Esta opción especifica la lista de grupos de usuarios que pueden usar udevil. Para que un usuario pueda usar udevil tiene que estar en uno de estos grupos. No se pueden poner plantillas, pero se puede poner un único caracter “*” para permitir el uso a todos los grupos.
  • allowed_media_dirs: Esto son los directorios en los que se pueden crear puntos de montaje para cualquier cosa que montemos. Se pueden poner plantillas y se puede especificar $USER para indicar el nombre del usuario. El primer directorio de esta lista que exista y no contenga plantillas será el que se use como directorio por defecto cuando no especifiquemos otro en el comando.
  • allowed_devices: Permite especificar qué dispositivos se pueden montar. Por defecto, su valor es “/dev/*“. No es buena idea permitir montar dispositivos que estén fuera del directorio /dev, así que el valor por defecto está bien.
  • allowed_internal_devices: Normalmente los dispositivos internos no se pueden montar con udevil. En esta opción se pueden especificar qué dispositivos internos queremos permitir. Esto puede ser útil si tenemos algún dispositivo externo que sea erróneamente reconocido como interno, como pasa con algunas unidades ESATA. No es buena idea poner aquí dispositivos que sean internos de verdad.
  • allowed_internal_uuids: Esta opción es similar a la anterior, pero permite especificar los dispositivos por UUID en vez de por nombre de dispositivo. Tampoco aquí se deben poner dispositivos que realmente son internos, ya que provocarían problemas de seguridad.
  • forbidden_devices: Esta opción es la contraria de las anteriores. Los dispositivos que se pongan aquí no se podrán montar con udevil aunque aparezcan en las listas anteriores.
  • allowed_networks: Especifica qué redes se pueden montar cuando se usa alguno de los protocolos para montar carpetas de red. Se pueden poner tanto direcciones IP como nombres de dominio y se admiten plantillas. Dejando esta opción en blanco se impide que se puedan montar carpetas de red, y poniendo “*” permitimos que se monten carpetas que estén en cualquier servidor. Ésta es la opción por defecto.
  • forbidden_networks: La contraria a la anterior. Esta opción indica qué redes NO se pueden montar aunque aparezcan en allowed_networks.
  • allowed_files: Especifica los ficheros que se pueden montar por loop device. Se pueden poner plantillas aquí. Por defecto, se permite cualquier fichero.
  • forbidden_files: Como era de esperar, esta opción es la contraria a la anterior e impide montar los ficheros que se especifiquen.
  • default_options: Esta, junto con la siguiente, son dos de las opciones más importantes del fichero de configuración. Aquí aparecen las opciones por defecto con las que se monta cualquier cosa. También se pueden indicar opciones específicas para cada sistema de ficheros o protocolo que se use, pero eso lo comentaré más abajo.
  • allowed_options: Aquí se especifican las posibles opciones que se puede poner al montar cualquier dispositivo o protocolo. Las opciones que no aparezcan aquí no se pueden usar ni en la linea de comandos ni en default_options, por lo tanto, todas las opciones que aparezcan en default_options deben estar también aquí.
  • mount_point_mode: Esta opción especifica los permisos con los que se montan los dispositivos o protocolos. Los permisos se ponen en octal, en el mismo formato que se usa para el comando chmod.

Una cosa muy interesante acerca de todas estas opciones es que todas ellas, excepto allowed_files y forbidden_files, tienen una variante que permiten personalizarlas más. En el caso de allowed_types, se pueden especificar los tipos de sistemas de ficheros que se permite montar a usuarios específicos. En el caso de las demás opciones, se puede hacer que afecten específicamente a algunos sistemas de ficheros. Para hacer esto, basta con añadir el nombre del usuario o del tipo de sistema de ficheros al final del nombre de la opción separándolo por “_“. Por ejemplo, supongamos que queremos que el usuario “ripley” solo pueda montar dispositivos formateados con vfat. Podríamos añadir esta linea en el fichero de configuración:

allowed_types_ripley = vfat

Si, por ejemplo, quisiéramos que el único usuario capaz de montar unidades compartidas por NFS fuese “ash“, pondríamos:

allowed_users_nfs = ash

Otro cosa que se podría hacer es prohibir montar carpetas compartidas por SMB en una determinada red:

forbidden_networks_smbfs = 192.168.3.*

Combinando estas opciones se puede personalizar la configuración y llegar a conseguir un grado se seguridad bastante razonable.

Dependencias

Udevil es bueno montando muchas cosas, pero para parte de ellas necesita algunos programas de los cuales depende. Por ello, hay algunas dependencias que debemos tener instaladas según lo que queramos montar. Los nombres de los paquetes que voy a poner a continuación corresponden a ArchLinux. En otras distros los nombres pueden cambiar, pero las dependencias son las mismas.

  • nfs-utils: Para montar directorios compartidos por NFS.
  • cifs-utils: Necesario para montar carpetas compartidas por SMB.
  • sshfs: Permite montar directorios compartidos por SSH.
  • curlftpfs: Para montar directorios publicados en un servidor FTP. Si este paquete no está instalado también es posible montarlos automáticamente mediante ftpfs.
  • davfs2: Permite montar directorios web por WebDav. El protocolo que se usa para esto es HTTP.

Así que si no podéis montar lo que queréis puede ser que os falte alguno de estos paquetes. Son dependencias opcionales, así que no hace falta que los tengáis instalados si no váis a usarlos.

Un par de trucos

A continuación os comento un par de trucos para udevil. El primero es una curiosidad útil que he encontrado en su propia web. El segundo es un ajuste que he hecho yo mismo al fichero de configuración.

Crear un ramdisk

Una cosa interesante que se puede hacer fácilmente con udevil es crear un ramdisk. De esta manera podemos tener un directorio temporal en memoria cuyo contenido se elimina automáticamente al desmontarlo o al apagar el equipo. La forma de hacerlo es la siguiente:

$ udevil mount ramfs

Esto creará un ramdisk y lo montará en /media/ramfs, o en algún otro directorio según cómo esté el fichero de configuración. Hay que tener en cuenta que para desmontarlo es necesario especificar el punto de montaje:

$ udevil umount /media/ramfs

También se puede usar tmpfs en lugar de ramfs, que es la forma en la que aparece en la página web, aunque a mi no me ha funcionado con tmpfs.

Permisos correctos para las carpetas de red

Al montar carpetas de red compartidas por SMB, he observado una cosa muy curiosa: A pesar de que las carpetas se están montando con noexec para evitar que se puedan ejecutar los ficheros que contienen, cosa que es importante para mejorar la seguridad, al mostrar el contenido con ls -l los ficheros aparecen con permisos de ejecución. Desde el punto de vista de la seguridad esto no es importante, ya que no deja ejecutarlos de todos modos, pero si tenéis colores para ls, veréis que aparecen todos con el mismo color, lo que hace que sean más dificiles de distinguir.

Para solucionar esto, se pueden usar las opciones default_options y allowed_options, que son bastante importantes. Como he indicado anteriormente, sirven para definir las opciones con las que se montan los sistemas de ficheros. En el fichero de configuración aparecen las variantes de estas opciones para cada uno de los sistemas de ficheros que udevil soporta, ya que cada uno permite unas opciones diferentes. En mi caso, he modificado default_options_cifs y allowed_options_cifs, que son las que se usan para SMB.

La solución al problema es poner en default_options_cifs las opciones necesarias para dar los permisos correctos a los ficheros y directorios. Éstas mismas opciones tendremos que ponerlas también en allowed_options_cifs, ya que si no están en la lista de opciones permitidas, no nos dejará usarlas como opciones por defecto.

default_options_cifs = nosuid, noexec, nodev, file_mode=0644, dir_mode=0755, uid=$UID, gid=$GID
allowed_options_cifs = nosuid, noexec, nodev, ro, rw, remount, port=*, user=*, username=*, pass=*, password=*, guest, domain=*, uid=$UID, gid=$GID, credentials=*, file_mode=0644, dir_mode=0755

El protocolo SMB usa dir_mode y file_mode en vez de fmask y dmask, que son las opciones equivalentes que usan casi todos los demás sistemas de ficheros. La diferencia es que fmask y dmask son máscaras que se aplican sobre los permisos reales de cada fichero, mientras que dir_mode y file_mode fijan exactamente los permisos que van a tener los directorios y los ficheros.

Con los valores que he puesto, los ficheros van a tener permisos de lectura y escritura para el usuario que monta la carpeta y solo permiso de lectura para los demás, mientras que los directorios van a tener esos mismos permisos y además permiso de paso. Con estos permisos, al hacer un ls -l ya se pueden ver los colores correctamente.

Conclusión

Comparado con el script de hal que había estado usando hasta ahora, he encontrado en udevil varias mejoras interesantes. Udevil escoge mejor los nombres de los puntos de montaje. Los dispositivos vfat se montan en UTF8, cosa que hal no hacía y aparecían caracteres extraños en los nombres de los ficheros. Por supuesto se podía controlar con las opciones de montaje, pero udevil lo hace bien desde el principio. Udevil permite montar fácilmente las carpetas compartidas que tengo en mi NAS. Ya no tengo que usar el script que me había hecho para ello. Lo que no hace, al menos de momento, es montar ficheros encriptados, pero eso es un problema menor, ya que también tengo un script para eso.

Lo único que no me gusta de udevil es que es un programa SUID root y, por lo tanto, puede presentar problemas de seguridad. Por suerte, su autor, IgnorantGuru, afirma haber tenido especial cuidado con la seguridad, así que asumiendo ese riesgo, es una opción excelente para montar mucho más que dispositivos desde la linea de comandos.

EOF

Anuncios