¿Cómo montar un archivo de imagen sin permiso de root?

41

¿Puedo montar una imagen del sistema de archivos sin permiso de root? Normalmente haría:

mount -o loop DISK_IMAGE FOLDER

Sin usar sudo o configurar el suid mount, ¿hay alguna forma adecuada de hacerlo?

Sé que puedo usar fusermountcon algunas imágenes ISO, pero eso es bastante limitado, incluso para las imágenes ISO, algunas de mis imágenes no se pueden montar, pero mountsiempre funcionan.

margarita
fuente
1
Si su mountbinario no requiere permisos SUID, entonces debería poder usar fakeroot sin problemas.
sakisk
55
@faif fakerootno va a ayudar aquí: pretende que la propiedad del archivo es diferente, pero no puede otorgarle permisos que no tiene, como llamar mount(2)cuando no es root.
Gilles 'SO- deja de ser malvado'
@faif Mount requiere absolutamente permisos de root. Las posibles consecuencias de lo contrario serían bastante desastrosas.
Shadur
relacionado: unix.stackexchange.com/questions/96625/…
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

Respuestas:

25

No puede montar nada que el administrador de alguna manera no le haya dado permiso para montar. Solo root puede llamar a la llamada del mountsistema. La razón de esto es que hay muchas formas de escalar privilegios mediante el montaje, como montar algo sobre la ubicación de un sistema, hacer que los archivos parezcan pertenecer a otro usuario y explotar un programa que depende de la propiedad del archivo, crear archivos setuid o explotar errores en controladores de sistema de archivos.

El mountcomando es setuid root. Pero solo te permite montar cosas que se mencionan en fstab.

El fusermountcomando es setuid root. Solo le permite montar cosas a través de un controlador FUSE, y restringe sus habilidades para proporcionar archivos con propiedad arbitraria o permisos de esa manera (en la mayoría de las configuraciones, todos los archivos en un montaje FUSE le pertenecen).

Su mejor opción es encontrar un sistema de archivos FUSE que sea capaz de leer su imagen de disco. Para las imágenes ISO 9660, intente con fuseiso y el soporte ISO 9660 de UMfuse (disponible en Debian como fuseiso9660paquete ).

Gilles 'SO- deja de ser malvado'
fuente
+1 para explicar que sudo(aunque tiene el bit SUID establecido) solo permite montar fstabentradas. De esto se deduce que (a) el bit SUID tiene sentido, ya que un usuario normal puede montar fstabentradas (y se le permite realizar la mountllamada al sistema) y (b) que mountla restricción de la utilidad es permitir que solo las fstabentradas sean montadas por usuarios root.
David
Si está trabajando con imágenes de disquete, también puede usar mtools para escribir datos en la imagen. Ver: stackoverflow.com/questions/11202706/…
Giles Bathgate
@David, ¿esto ha cambiado ahora? Las únicas entradas que tengo en mi fstabson para rootfs y boot. Para montar unidades USB miro lsblky en mountconsecuencia. No he tenido problemas para hacer esto.
sherrellbc
16

El Wiki de Debian muestra varias formas de hacerlo. Aquí hay una manera. (Esto requiere el udisks2paquete).

primero

$ udisksctl loop-setup -f $PATH_TO_IMAGE
Mapped file $PATH_TO_IMAGE as /dev/loop0.

/dev/loop0 se usará para lo siguiente.

Pero si el udisksctl loop-setupcomando hubiera regresado /dev/loop1, entonces /dev/loop1se habría utilizado para lo siguiente.

Es posible que deba ejecutar si el dispositivo de bucle invertido (creado anteriormente) no se monta automáticamente:

$ udisksctl mount -b /dev/loop0
Mounted /dev/loop0 at /media/$USER/$IMAGE_NAME

Puedes mirar los archivos en el disco

$ ls -l /media/$USER/$IMAGE_NAME/

Puedes desmontarlo cuando hayas terminado

$ udisksctl unmount -b /dev/loop0
Unmounted /dev/loop0.

y si es necesario:

$ udisksctl loop-delete -b /dev/loop0
Nick ODell
fuente
1
udevil era la opción más conveniente
Anwar
Funcionó en Ubuntu 16.04, pero ¿cómo? Parece usar dispositivos de bucle que esperaría que fueran sudosolo. setsid o travesuras relacionadas ?
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
1
@CiroSantilli 新疆 改造 中心 六四 事件 法轮功 No estoy seguro. El código fuente de la herramienta está aquí . Parece usar DBus para hablar con un demonio, pero no conozco a DBus ni a Glib tan bien.
Nick ODell
1
Tenga en cuenta que la -ropción de udisksctl loop-setupsignifica solo lectura, que el OP no solicitó, así que suéltelo para obtener un montaje grabable.
Pelle Nilsson
15

Puede usar el módulo FUSE guestmount para montar varios tipos de imágenes de disco. Es parte del ecosistema guestfs y no requerirá permisos de root.

Echa un vistazo a la página del manual para más detalles.

Ejemplos

1. Para un invitado típico de Windows que tiene su sistema de archivos principal en la primera partición:

guestmount -a windows.img -m /dev/sda1 --ro /mnt

2. Para un invitado típico de Linux que tiene un sistema de archivos / boot en la primera partición y el sistema de archivos raíz en un volumen lógico:

guestmount -a linux.img -m /dev/VG/LV -m /dev/sda1:/boot --ro /mnt
Mateo
fuente
1
Molesto, ejecutar guestmount en Ubuntu ahora requiere acceso de root para leer las imágenes del kernel: bugs.launchpad.net/ubuntu/+source/linux/+bug/759725
Clément
@ Clément Me gustaría entender por qué libguestfs necesita una imagen del núcleo para su trabajo ...
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
1
@CiroSantilli 新疆 改造 中心 六四 事件 法轮功 porque libguestfs evita la necesidad de root iniciando un sistema Linux mínimo dentro de una máquina virtual qemu (cualquiera puede iniciar una máquina virtual qemu sin ser root). Para arrancar esa máquina, necesita algo de kernel e initrd.
josch
3

La forma posible sería agregar una /etc/fstabentrada para la ISO con el parámetro 'usuario', como

/test.iso /mnt/iso auto defaults,user 0 1

Pero generalmente necesita acceso root de todos modos para editar este archivo, por lo que no es muy útil.

Renan
fuente
2

En realidad, es muy fácil montar más o menos lo que desee como usuario normal sin privilegios de root, siempre que se haya creado la entrada correcta /etc/fstab.

Por supuesto, modificaciones para /etc/fstabrequerir privilegios de root. Pero una sola entrada se puede usar con mucha flexibilidad para (u) montar muchos archivos diferentes en diferentes puntos de montaje, sin necesidad de editarlos /etc/fstab.

Aquí hay dos scripts de Bash muy cortos (5 líneas + comentarios) que harán el trabajo:

para montar

#!/bin/sh
# usage: usmount device dir
# author: babou 2013/05/17 on https://unix.stackexchange.com/questions/32008/mount-an-loop-file-without-root-permission/76002#76002
# Allows normal user to mount device $1 on mount point $2
# Use /etc/fstab entry :
#       /tmp/UFS/drive /tmp/UFS/mountpoint  auto users,noauto 0 0
# and directory /tmp/UFS/
# Both have to be created (as superuser for the /etc/fstab entry)
rm -f /tmp/UFS/drive /tmp/UFS/mountpoint
ln -s `realpath -s $1` /tmp/UFS/drive
ln -s `realpath -s $2` /tmp/UFS/mountpoint
mount /tmp/UFS/drive || mount /tmp/UFS/mountpoint
# The last statement should be a bit more subtle
# Trying both is generally not useful.

y para desmontar

#!/bin/sh
# usage: usumount device dir
# author: babou 2013/05/17 on https://unix.stackexchange.com/questions/32008/mount-an-loop-file-without-root-permission/76002#76002
# Allows normal user to umount device $1 from mount point $2
# Use /etc/fstab entry :
#       /tmp/UFS/drive /tmp/UFS/mountpoint  auto users,noauto 0 0
# and directory /tmp/UFS/
# Both have to be created (as superuser for the /etc/fstab entry)
rm -f /tmp/UFS/drive /tmp/UFS/mountpoint
ln -s `realpath -s $1` /tmp/UFS/drive
ln -s `realpath -s $2` /tmp/UFS/mountpoint
umount /tmp/UFS/drive || umount /tmp/UFS/mountpoint
# One of the two umounts may fail because it is ambiguous
# Actually both could fail, with careless mounting organization :-)

El directorio /tmp/UFS/se crea para aislar los enlaces y evitar conflictos. Pero los enlaces simbólicos pueden estar en cualquier lugar del espacio del usuario, siempre y cuando permanezcan en el mismo lugar (misma ruta). La /etc/fstabentrada nunca cambia tampoco.

ADVERTENCIA VITAL: El montaje está restringido por buenas razones de seguridad. Hacerlo más flexible puede abrir puertas para software malicioso. No soy un experto en seguridad y recomendaría que abra las puertas no más de lo absolutamente necesario ... utilizando opciones para restringir lo que se puede hacer con los sistemas de archivos que se pueden montar. Si un colaborador experto pudiera comentar más sobre problemas de seguridad, podría ser útil.

Hay varias opciones disponibles para restringir el uso de sistemas de archivos montados, como el noexecque impide la ejecución de archivos binarios, y nosuid, por lo tanto, contribuyen a la seguridad. En realidad, estas opciones se agregan como opciones predeterminadas cuando se usan las opciones usero users, lo cual es necesariamente el caso en lo que hacemos a continuación. Piénselo dos veces antes de anular estos valores predeterminados. http://en.wikipedia.org/wiki/Fstab

Se pueden agregar otras opciones para mayor protección. Por ejemplo, la opción owner en la /etc/fstab entrada permitirá a los usuarios lidiar solo con los archivos o dispositivos que poseen. Consulte man mount para obtener una lista de opciones: http://linux.die.net/man/8/mount .

El uso de esta /etc/fstabentrada también puede restringirse a través de la propiedad user.group del directorio (o directorios) que contiene los enlaces simbólicos.

Explicación

Esta explicación fue escrita antes de darme cuenta de que podía simplificar las cosas a los dos scripts anteriores. No pensé en ellos de inmediato, en parte porque tengo a mano un problema un poco más complejo que no resuelven sin un poco de maquinaria adicional. Por lo tanto, mi explicación puede ser un poco más compleja de lo que debería, pero no tengo el coraje de volver a escribir todo desde cero.

La idea básica es crear entradas /etc/fstabque incluyan la opción usero userspara que un usuario pueda solicitar mountel montaje especificado en esa entrada dando como argumento el archivo a montar o el punto de montaje a usar (pero no ambos en mi experiencia) .

También necesita una entrada adecuada para umount(que es un problema ligeramente diferente, ver más abajo). La opción usergeneralmente es mejor que usersya que restringe el permiso al umountusuario que montó el sistema de archivos, mientras que userslo permitirá a todos. Lamentablemente, la opción userno siempre funciona y puede implicar algunos otros pasos que deben realizarse para funcionar. Esto se discute en la opción "usuario" para el montaje, no para el montaje .

Primero agrega a /etc/fstabuna entrada como:

/tmp/UFS/drive /tmp/UFS/mountpoint  auto users,noauto, 0 0

y úselo /tmp/UFS/drivecomo un enlace simbólico (o enlace simbólico) a cualquier dispositivo o archivo que desee montar, digamos un archivo que contenga la imagen de un sistema de archivos ISO /home/johndoe/john-image-file.iso.

También se define /tmp/UFS/mountpointcomo un enlace simbólico al punto de montaje que desea utilizar, por ejemplo /mnt/iso.

Luego puede montar john-image-file.isocon el comando:

$ mount /tmp/UFS/drive

Esto es suficiente en mi Mageia Linux, ya que el uso de dispositivos de bucle ahora se ha hecho implícito y ya no requiere su uso -o loopexplícito. No sé cuán general es eso hoy. Consulte Al montar, ¿cuándo debo usar un dispositivo de bucle?

Este montaje aparece en tablas y comandos:

$ df | tail -1
/dev/loop0       5,1G  5,1G     0 100% /mnt/iso
$ tail -1 /etc/mtab
/dev/loop0 /mnt/iso udf ro,nosuid,nodev,noexec,relatime,utf8 0 0
$ mount | tail -1
/home/johndoe/john-image-file.iso on /mnt/iso type udf (ro,nosuid,nodev,noexec,relatime,utf8)
$ tail -1 /proc/mounts
/dev/loop0 /mnt/iso udf ro,nosuid,nodev,noexec,relatime,utf8 0 0
$ tail -1 /proc/self/mountinfo
46 22 7:0 / /mnt/iso rw,nosuid,nodev,noexec,relatime - udf /dev/loop0 ro,utf8
$ tail -1 /proc/self/mountstats 
device /dev/loop0 mounted on /mnt/iso with fstype udf

La operación de montaje podría funcionar para cualquier archivo o unidad y solo requiere hacer un enlace simbólico desde /tmp/UFS/driveese archivo o al dispositivo para la unidad. Por supuesto, podría elegirse otro nombre y ubicación para el enlace simbólico, siempre que nunca cambie.

Desmontar el archivo se basa de la misma manera en el uso apropiado de los enlaces simbólicos. En el caso de un dispositivo normal correspondiente a una unidad de hardware, solo usa los mismos enlaces.

Sin embargo, los archivos que contienen la imagen de un sistema de archivos se montan a través de un tipo especial de dispositivo llamado dispositivo de bucle, que se asigna automáticamente al montar el archivo.

Para desmontar el archivo, debe hacer referencia al dispositivo de bucle, no al archivo. Por lo tanto, necesita /etc/fstabuna entrada que coincida con el dispositivo de bucle utilizado /etc/mtabaquí /dev/loop0y el punto de montaje aquí /mnt/iso.

No puede crear dicha entrada de antemano ya que el dispositivo de bucle puede variar, ya que se asignan dinámicamente. Tenga en cuenta que también es posible usar un dispositivo de bucle fijo, pero es inconveniente de otras maneras. Ver http://igurublog.wordpress.com/2011/01/22/how-to-allow-mounting-of-iso-files-by-a-regular-user/ ( este blog realmente inspiró la respuesta aquí ).

Sin embargo, puede encontrar el nombre del dispositivo de bucle, aquí /dev/loop0, preguntando al sistema, como lo hicimos anteriormente de varias maneras diferentes. Luego, /etc/fstabse puede hacer que nuestra entrada estándar apunte al dispositivo de bucle correcto a través del enlace simbólico /tmp/UFS/drivey al punto de montaje como se hizo anteriormente con /tmp/UFS/mountpoint. Hecho esto, el archivo se puede desmontar con cualquiera de los siguientes comandos (siempre que no haya ambigüedad /etc/mtab, lo cual es un problema diferente):

$ umount /tmp/UFS/drive
$ umount /dev/loop0
$ umount /mnt/iso
$ umount /tmp/UFS/mountpoint

Dado que los dos enlaces simbólicos son necesarios solo cuando se emiten los comandos, se pueden cambiar dinámicamente. Por lo tanto, nuestra /etc/fstabentrada única permite montar cualquier número de archivos y desmontarlos en cualquier orden, sin privilegios de root.

Otras referencias:

revs babou
fuente
Cuando las entradas fstab apuntan a enlaces simbólicos, ¿no se pueden explotar para montar nada sin root, simplemente creando enlaces simbólicos? Indirectamente, ¿no se trata solo de elevar el mountcomando para cada usuario normal? ¿Y los problemas de seguridad asociados con él? Corrígeme si me equivoco.
Bharat G
Y las versiones recientes de las distribuciones de GNU / Linux (digamos debian jessie) no proporcionarán un inicio de sesión gui cuando detecten una entrada no válida en fstab. Vuelve a la sesión de inicio de sesión de la consola si la sección deviceo mountpointde fstab no apunta a una entrada válida. El usuario debe iniciar sesión a través de la sesión de consola e ingresar startxpara iniciar explícitamente un administrador de pantalla.
Bharat G
0

El paquete libguestfs-tools-c tiene un comando guestmount

mkdir dvd    
guestmount -a image.iso -r -i dvd 

df mostrará image.iso montado

df

para desmontar tenemos:

guestunmount dvd
Sergio
fuente