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 définir le suid sur mount
, existe-t-il un moyen approprié de le faire?
Je sais que je peux utiliser fusermount
avec certaines images ISO, mais c'est assez limité, même pour les images ISO, certaines de mes images ne peuvent pas être montées, mais mount
fonctionne toujours.
Vous ne pouvez pas monter quoi que ce soit que l'administrateur ne vous ait pas donné l'autorisation de monter. Seul root peut appeler l'appel système mount
. La raison en est qu'il existe de nombreuses façons d'augmenter les privilèges lors du montage, comme monter quelque chose sur un emplacement système, faire en sorte que les fichiers appartiennent à un autre utilisateur et exploiter un programme qui repose sur la propriété des fichiers, créer des fichiers setuid ou exploiter les bogues dans les pilotes de système de fichiers.
La commande mount
est root setuid. Mais si vous n'êtes pas root, il vous permet uniquement de monter des éléments mentionnés dans fstab
.
La commande fusermount
est root setuid. Il vous permet uniquement de monter des choses via un pilote Fuse et restreint vos capacités à fournir des fichiers avec une propriété ou des autorisations arbitraires de cette façon (dans la plupart des configurations, tous les fichiers sur une monture Fuse vous appartiennent).
Votre meilleur pari est de trouver un système de fichiers Fuse capable de lire votre image disque. Pour les images ISO 9660, essayez à la fois fuseiso et prise en charge ISO 9660 d'UMfuse (disponible sous Debian sous le nom fuseiso9660
package ).
Debian Wiki montre plusieurs façons de le faire. Voici une façon. (Cela nécessite le udisks2
package à installer.
Tout d'abord, créez un "périphérique en boucle". Cela nous permettra de monter le fichier image.
$ udisksctl loop-setup -f $PATH_TO_IMAGE
Mapped file $PATH_TO_IMAGE as /dev/loop0.
Notez qu'il a mappé l'image à /dev/loop0
. Cependant, si la commande précédente avait renvoyé /dev/loop1
, alors vous remplaceriez /dev/loop0
avec /dev/loop1
dans toutes les commandes suivantes.
Vous devrez peut-être exécuter cette commande si le périphérique de bloc que nous avons créé n'est pas monté automatiquement avec la commande précédente:
$ udisksctl mount -b /dev/loop0
Mounted /dev/loop0 at /media/$USER/$IMAGE_NAME
Vous pouvez consulter 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
$ udisksctl loop-delete -b /dev/loop0
Vous pouvez utiliser le module invité Fuse pour monter plusieurs types d'images de disque. Il fait partie de l'écosystème guestfs et ne nécessitera pas d'autorisations root.
Jetez un œil à la page de manuel pour plus de détails.
1. Pour un invité Windows typique qui a son système de fichiers principal sur la première partition:
guestmount -a windows.img -m /dev/sda1 --ro /mnt
2. Pour un invité Linux typique qui a 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
La manière possible serait d'ajouter un /etc/fstab
entrée pour l'ISO avec le paramètre 'user', comme
/test.iso /mnt/iso auto defaults,user 0 1
Mais vous avez généralement besoin d'un accès root pour modifier ce fichier, donc ce n'est pas très utile.
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, les modifications de /etc/fstab
nécessite 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 supplémentaire de /etc/fstab
.
Voici deux scripts Bash très courts (5 lignes + commentaires) qui feront l'affaire:
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). Le /etc/fstab
l'entrée ne change jamais non plus.
AVERTISSEMENT VITAL: Le montage est restreint 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 recommande d'ouvrir les portes pas plus que ce qui est absolument nécessaire ... en utilisant des options pour restreindre ce qui peut être fait avec les systèmes de fichiers qui peuvent ainsi être montés. Si un contributeur bien informé pouvait commenter davantage les problèmes de sécurité, cela pourrait être utile.
Diverses options sont disponibles pour restreindre l'utilisation des systèmes de fichiers montés, comme noexec
qui empêche l'exécution des binaires ou nosuid
, et contribuent ainsi à la sécurité. En fait, ces options sont ajoutées comme options par défaut lorsque les options user
ou users
sont utilisées, ce qui est nécessairement le cas dans ce que nous faisons ci-dessous. Réfléchissez bien avant de remplacer ces valeurs par défaut.http://en.wikipedia.org/wiki/Fstab
D'autres options peuvent être ajoutées pour plus de protection. Par exemple, l'optionowner
dans le/etc/fstab
l'entrée permettra aux utilisateurs de traiter uniquement les fichiers ou les périphériques dont ils sont propriétaires. Voirman mount
pour une liste d'options:http://linux.die.net/man/8/mount .
L'utilisation de ce /etc/fstab
l'entrée peut également être restreinte par la propriété user.group du répertoire (ou des répertoires) contenant les liens symboliques.
Explication
Cette explication a été écrite avant de réaliser que je pouvais simplifier les choses avec les deux scripts ci-dessus. Je n'y ai pas pensé tout de suite en partie parce que j'ai à portée de main un problème un peu plus complexe qu'ils ne résolvent pas sans quelques machines supplémentaires. Ainsi, mon explication peut être un peu plus complexe qu'elle ne 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 dans /etc/fstab
qui incluent l'option user
ou users
afin qu'un utilisateur puisse demander à mount
de faire le montage spécifié dans cette entrée en donnant comme argument le fichier à monter ou point de montage à utiliser (mais pas les deux dans mon expérience).
Vous avez également besoin d'une entrée appropriée pour umount
(qui est un problème légèrement différent - voir ci-dessous). L'option user
est généralement meilleure que users
car elle restreint l'autorisation à umount
à l'utilisateur qui a monté le système de fichiers, tandis que users
le permettra à tous . Malheureusement, l'option user
ne fonctionne pas toujours et peut impliquer d'autres étapes à effectuer pour fonctionner. Ceci est discuté dans L'option "user" fonctionne pour le montage, pas pour umount .
Vous ajoutez d'abord à /etc/fstab
une entrée telle que:
/tmp/UFS/drive /tmp/UFS/mountpoint auto users,noauto, 0 0
et utilise /tmp/UFS/drive
en tant que 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/mountpoint
en tant que lien symbolique vers le point de montage que vous souhaitez utiliser, par exemple /mnt/iso
.
Vous pouvez ensuite monter john-image-file.iso
avec la commande:
$ mount /tmp/UFS/drive
C'est suffisant sur mon Mageia Linux, puisque l'utilisation des périphériques de boucle est désormais implicite et ne nécessite plus d'utiliser -o loop
explicitement. 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 en boucle?
Ce montage apparaît dans les tableaux et 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 à partir de /tmp/UFS/drive
à ce fichier ou au périphérique du lecteur. Bien sûr, un autre nom et lieu pourrait être choisi pour le lien symbolique, tant qu'il ne change jamais.
Le démontage du fichier repose de la même manière sur une utilisation appropriée des liens symboliques. Dans le cas d'un périphérique normal correspondant à un lecteur de matériel informatique, vous utilisez simplement les mêmes liens.
Cependant, 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 de boucle, alloué automatiquement lorsque vous montez le fichier.
Pour démonter le fichier, vous devez vous référer au périphérique de boucle, pas au fichier. Vous avez donc besoin de /etc/fstab
une entrée qui correspond à la fois au périphérique de boucle utilisé dans /etc/mtab
, ici /dev/loop0
, et le point de montage, ici /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 dynamiquement. Notez qu'il est également possible d'utiliser un périphérique à boucle fixe, mais il est 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 demandant au système, comme nous l'avons fait ci-dessus de plusieurs manières différentes. Ensuite, notre standard /etc/fstab
une entrée peut être effectuée pour pointer vers le périphérique de la boucle droite via le lien symbolique /tmp/UFS/drive
, et au point de montage comme précédemment avec /tmp/UFS/mountpoint
. Cela fait, le fichier peut être démonté avec l'une des commandes suivantes (à condition qu'il n'y ait aucune ambiguïté avec /etc/mtab
, qui est un problème différent):
$ umount /tmp/UFS/drive
$ umount /dev/loop0
$ umount /mnt/iso
$ umount /tmp/UFS/mountpoint
Étant donné que les deux liens symboliques ne sont nécessaires que lorsque les commandes sont émises, ils peuvent être modifiés dynamiquement. Donc, notre single /etc/fstab
L'entrée permet de monter un nombre illimité de fichiers et de les démonter dans n'importe quel ordre, sans privilèges root.
Autres références:
Le paquet libguestfs-tools-c a la commande guestmount donc
mkdir dvd
guestmount -a image.iso -r -i dvd
df montrera image.iso monté
df
pour démonter nous avons:
guestunmount dvd
MISE À JOUR 2020.03.25:
L'archivemount de paquet semble un outil frais
https://pkgs.org/download/archivemount
exemple:
archivemount zentyal-6.0-development-AMD64.iso tmp3/