Comment monter un fichier image sans autorisation root?

41

Puis-je monter une image de système de fichiers sans autorisation root? Normalement je ferais:

mount -o loop DISK_IMAGE FOLDER

Sans utiliser sudo ou régler le suid sur mount , existe-t-il un moyen approprié de procéder?

Je sais que je peux utiliser fusermountcertaines images ISO, mais cela reste assez limité. Même pour les images ISO, certaines de mes images ne peuvent pas être montées, mais mountfonctionnent toujours.

Marguerite
la source
1
Si votre mountbinaire ne nécessite pas d'autorisations SUID, vous devriez pouvoir utiliser fakeroot sans problème.
Sakis
5
@faif fakerootne va pas aider ici: il prétend que la propriété du fichier est différente, mais il ne peut pas vous donner d'autorisations que vous ne possédez pas, par exemple appeler mount(2)lorsque vous n'êtes pas root.
Gilles, arrête de faire le mal
@faif Mount requiert absolument des autorisations root. Les conséquences potentielles sinon seraient plutôt désastreuses.
Shadur
liées: unix.stackexchange.com/questions/96625/…
Ciro Santilli a été ajouté

Réponses:

25

Vous ne pouvez rien monter que l'administrateur ne vous ait pas donné l'autorisation de monter. Seul root peut appeler l' mountappel système. La raison en est qu’il existe de nombreuses façons d’élever les privilèges via le montage, comme monter quelque chose sur un emplacement système, donner l’apparence de fichiers à un autre utilisateur et exploiter un programme reposant sur la propriété du fichier, créer des fichiers setuid ou exploiter des bogues. dans les pilotes de système de fichiers.

La mountcommande est setuid root. Mais cela ne vous permet que de monter des objets mentionnés dans fstab.

La fusermountcommande est setuid root. Il vous permet uniquement de monter des éléments à l'aide d'un pilote FUSE et limite votre capacité à fournir des fichiers avec des droits de propriété ou des autorisations arbitraires (dans la plupart des configurations, tous les fichiers d'un montage FUSE vous appartiennent).

Votre meilleur choix est de trouver un système de fichiers FUSE capable de lire votre image disque. Pour les images ISO 9660, essayez les deux fuseiso et support ISO 9660 de UMfuse (disponible sous Debian comme fuseiso9660package ).

Gilles, arrête de faire le mal
la source
+1 pour expliquer que sudo(bien que le bit SUID soit défini) ne permet de monter des fstabentrées. Il en résulte que (a) le bit SUID fstabest mountutile, puisqu'un utilisateur normal peut monter des entrées (et est autorisé à effectuer l' appel système) et (b) qu'il est de la mountrestriction de l' utilitaire de n'autoriser que les fstabentrées à être montées par des tiers. utilisateurs root.
David
Si vous travaillez avec des images de disquettes, vous pouvez également utiliser mtools pour simplement écrire des données sur l'image. Voir: stackoverflow.com/questions/11202706/…
Giles Bathgate
@ David, cela a-t-il changé maintenant? Les seules entrées que j'ai dans mon fstabsont pour le rootfs et le démarrage. Pour monter des clés USB, je regarde lsblket en mountconséquence. Je n'ai pas eu de problèmes à le faire.
sherrellbc
16

Le wiki Debian montre plusieurs manières de le faire. Voici un moyen. (Cela nécessite le udisks2package.)

Première

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

/dev/loop0 sera utilisé pour les suivants.

Mais si la udisksctl loop-setupcommande était revenue /dev/loop1, alors /dev/loop1 aurait été utilisée pour les opérations suivantes.

Vous devrez peut-être exécuter si le périphérique de bouclage (créé précédemment) n'est pas monté automatiquement:

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

Vous pouvez regarder les fichiers sur le disque

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

Vous pouvez le démonter lorsque vous avez terminé

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

et si nécessaire:

$ udisksctl loop-delete -b /dev/loop0
Nick ODell
la source
1
Udevil était une option plus pratique
Anwar
Cela a fonctionné sur Ubuntu 16.04, mais comment? Il semble utiliser des dispositifs en boucle, ce que je m'attendrais à être sudoseulement. setsen ou manigances connexes ?
Ciro Santilli新疆改造中心法轮功六四事件
1
@CiroSantilli 中心 事件 法轮功 Je ne suis pas sûr. Le code source de l'outil est ici . Il semble utiliser DBus pour parler à un démon, mais je ne connais pas bien DBus ou Glib.
Nick ODell
1
Notez que l' -roption udisksctl loop-setupsignifie en lecture seule, ce que l'OP n'a pas demandé, alors laissez tomber cela pour obtenir un montage en écriture.
Pelle Nilsson
15

Vous pouvez utiliser le module FUSE guestmount pour monter plusieurs types d’images disque. Cela fait partie de l'écosystème guestfs et ne nécessite pas d'autorisations root.

Consultez la page de manuel pour plus de détails.

Exemples

1. Pour un invité Windows typique dont le système de fichiers principal se trouve sur la première partition:

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

2. Pour un invité Linux typique ayant un système de fichiers / boot sur la première partition et le système de fichiers racine sur un volume logique:

guestmount -a linux.img -m /dev/VG/LV -m /dev/sda1:/boot --ro /mnt
Matthieu
la source
1
De manière ennuyeuse, exécuter guestmount sur Ubuntu nécessite désormais un accès root pour lire les images du noyau: bugs.launchpad.net/ubuntu/+source/linux/+bug/759725
Clément
@ Clément, j'aimerais comprendre pourquoi libguestfs a besoin d'une image du noyau pour accomplir son travail ...
Ciro Santilli il y a 10 jours 10/10
1
@CiroSantilli, car libguestfs évite de recourir à la racine en démarrant un système Linux minimal dans une machine virtuelle qemu (n'importe qui peut démarrer une machine virtuelle qemu sans être root). Pour démarrer cette machine, il faut du noyau et initrd.
josch
3

La manière possible serait d'ajouter une /etc/fstabentrée pour l'ISO avec le paramètre 'utilisateur', comme

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

Cependant, vous avez généralement besoin d’un accès root pour modifier ce fichier, ce qui n’est donc pas très utile.

Renan
la source
2

Il est en fait très facile de monter plus ou moins ce que vous voulez en tant qu'utilisateur normal sans privilèges root, à condition que la bonne entrée ait été créée dans /etc/fstab .

Bien sûr, des modifications /etc/fstabnécessitant des privilèges root. Mais une seule entrée peut être utilisée avec beaucoup de flexibilité pour (u) monter de nombreux fichiers différents sur différents points de montage, sans aucune modification ultérieure de /etc/fstab.

Voici deux scripts Bash très courts (5 lignes + commentaires) qui feront le travail:

pour le montage

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

et pour démonter

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

Le répertoire /tmp/UFS/est créé pour isoler les liens et éviter les conflits. Mais les liens symboliques peuvent être n'importe où dans l'espace utilisateur, tant qu'ils restent au même endroit (même chemin). L' /etc/fstabentrée ne change jamais non plus.

AVERTISSEMENT VITAL: Le montage est limité pour de bonnes raisons de sécurité. Le rendre plus flexible peut ouvrir des portes aux logiciels malveillants. Je ne suis pas un expert en sécurité et je vous recommanderais de ne pas ouvrir les portes plus que nécessaire - en utilisant des options permettant de restreindre l'utilisation des systèmes de fichiers pouvant ainsi être montés. Si un contributeur averti pouvait commenter davantage sur les questions de sécurité, cela pourrait être utile.

Diverses options sont disponibles pour limiter l’utilisation des systèmes de fichiers montés, telles que celles noexecqui empêchent l’exécution des fichiers binaires ou nosuidqui contribuent ainsi à la sécurité. En réalité, ces options sont ajoutées en tant qu'options par défaut lorsque les options userou userssont utilisées, ce qui est nécessairement le cas dans ce que nous faisons ci-dessous. Réfléchissez à deux fois avant de remplacer ces valeurs par défaut. http://en.wikipedia.org/wiki/Fstab

D'autres options peuvent être ajoutées pour une protection supplémentaire. Par exemple, l'option owner dans l' /etc/fstab entrée permet aux utilisateurs de gérer uniquement les fichiers ou les périphériques qu'ils possèdent. Voir man mount pour une liste d'options: http://linux.die.net/man/8/mount .

L'utilisation de cette /etc/fstabentrée peut également être limitée par la propriété user.group du ou des répertoires contenant les liens symboliques.

Explication

Cette explication a été écrite avant que je réalise que je pouvais simplifier les choses aux deux scripts ci-dessus. Je n'y ai pas pensé tout de suite, en partie parce que j'ai sous les yeux un problème légèrement plus complexe qu'ils ne résolvent pas sans machines supplémentaires. Ainsi, mon explication est peut-être un peu plus complexe qu’elle ne le devrait, mais je n’ai pas le courage de tout réécrire à partir de zéro.

L'idée de base est de créer des entrées /etc/fstabqui incluent l'option userou usersafin qu'un utilisateur puisse demander mountle montage spécifié dans cette entrée en donnant comme argument le fichier à monter ou le point de montage à utiliser (mais pas les deux à ma connaissance). .

Vous devez également avoir une entrée correcte dans umount(problème légèrement différent - voir ci-dessous). Cette option userest généralement préférable userscar elle limite l’autorisation à umountl’utilisateur qui a monté le système de fichiers, mais usersl’autorise à tous. Malheureusement, l'option userne fonctionne pas toujours et peut nécessiter d'autres étapes. Ceci est discuté dans Option "utilisateur" fonctionne pour le montage, pas pour umount .

Tout d'abord, vous ajoutez à /etc/fstabune entrée telle que:

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

et utilisez-le /tmp/UFS/drivecomme lien symbolique (ou lien symbolique) vers le périphérique ou le fichier que vous souhaitez monter, par exemple un fichier contenant l'image d'un système de fichiers ISO /home/johndoe/john-image-file.iso.

Vous définissez également /tmp/UFS/mountpointun lien symbolique vers le point de montage que vous souhaitez utiliser, par exemple /mnt/iso.

Vous pouvez ensuite monter john-image-file.isoavec la commande:

$ mount /tmp/UFS/drive

Ceci est suffisant sous Mageia Linux, car l’utilisation de périphériques en boucle est désormais implicite et ne nécessite plus d’être -o loopexplicite. Je ne sais pas à quel point c'est général aujourd'hui. Voir Lors du montage, quand dois-je utiliser un périphérique à boucle?

Ce montage apparaît dans les tables et les commandes:

$ 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

L'opération de montage peut fonctionner pour n'importe quel fichier ou lecteur et nécessite uniquement de créer un lien symbolique /tmp/UFS/drivevers ce fichier ou vers le périphérique correspondant au lecteur. Bien entendu, vous pouvez choisir un autre nom et un autre emplacement pour le lien symbolique, à condition que celui-ci ne change jamais.

Le démontage du fichier repose de la même manière sur l'utilisation appropriée des liens symboliques. Dans le cas d'un périphérique normal correspondant à un lecteur matériel, vous utilisez simplement les mêmes liens.

Toutefois, les fichiers contenant l'image d'un système de fichiers sont montés via un type spécial de périphérique appelé périphérique en boucle, qui est automatiquement alloué lorsque vous montez le fichier.

Pour démonter le fichier, vous devez vous référer au périphérique en boucle, pas au fichier. Par conséquent, vous avez besoin d' /etc/fstabune entrée qui corresponde à la fois au périphérique de boucle utilisé /etc/mtabici /dev/loop0et au point de montage /mnt/iso.

Vous ne pouvez pas créer une telle entrée à l'avance car le périphérique de boucle peut varier, car ils sont alloués de manière dynamique. Notez qu'il est également possible d'utiliser un périphérique à boucle fixe, mais cela peut être gênant à d'autres égards. Voir http://igurublog.wordpress.com/2011/01/22/how-to-allow-mounting-of-iso-files-by-a-regular-user/ ( ce blog a en fait inspiré la réponse ici ).

Cependant, vous pouvez trouver le nom du périphérique de boucle, ici /dev/loop0, en interrogeant le système, comme nous l'avons fait ci-dessus, de différentes manières. Ensuite, notre /etc/fstabentrée standard peut être faite pour pointer vers le bon dispositif de boucle via le lien symbolique /tmp/UFS/drive, et vers le point de montage comme cela a été fait précédemment avec /tmp/UFS/mountpoint. Ceci fait, le fichier peut être démonté avec l’une des commandes suivantes (à condition qu’il n’y ait aucune ambiguïté /etc/mtab, ce qui pose un problème différent):

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

Comme les deux liens symboliques ne sont nécessaires que lorsque les commandes sont émises, ils peuvent être modifiés de manière dynamique. Ainsi, notre /etc/fstabentrée unique permet de monter un nombre quelconque de fichiers et de les monter dans n'importe quel ordre, sans privilèges root.

Autres références:

babou
la source
Lorsque les entrées fstab pointent vers des liens symboliques, ne peuvent-elles pas être exploitées pour monter quoi que ce soit sans racine, en créant simplement des liens symboliques? Indirectement, n’est-ce pas simplement une mountcommande d’ élévation pour chaque utilisateur normal?, Et donc les problèmes de sécurité qui y sont associés? Corrige moi si je me trompe.
Bharat G
De plus, les versions récentes des distributions GNU / Linux (par exemple, Debian Jessie) ne fourniront pas de login gui si elles détectent une entrée non valide dans fstab. La session de connexion à la console est renvoyée si la deviceou la mountpointsection de fstab ne pointe pas vers une entrée valide. L'utilisateur doit se connecter via une session de console et entrer startxpour lancer explicitement un gestionnaire d'affichage.
Bharat G
0

Le paquet libguestfs-tools-c a la commande guestmount afin

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

df montrera image.iso monté

df

pour décompter nous avons:

guestunmount dvd
Sérgio
la source