Monter un file image sans autorisation root?

Puis-je monter une image de système de files sans l'autorisation root? Normalement, je ferais:

mount -o loop DISK_IMAGE FOLDER

Sans utiliser sudo ou paramétrer le suid sur le mount , y a-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 a pas donné la permission de monter. Seule la racine peut appeler l'appel système de mount . La raison en est qu'il existe plusieurs façons d'augmenter les privilèges par le biais du assembly, comme monter quelque chose sur un location du système, faire apparaitre les files pour appartenir à un autre user et exploiter un programme qui dépend de la propriété du file, créer des files setuid ou exploiter des bogues dans les pilotes de système de files.

La command mount est la racine setuid. Mais cela ne vous permet de monter que des éléments mentionnés dans fstab .

La command fusermount est root setuid. Il vous permet uniquement de monter des objects à l'aide d'un pilote FUSE et limite vos capacités à fournir des files avec une propriété ou des permissions arbitraires (dans la plupart des configurations, tous les files d'un assembly FUSE vous appartiennent).

Votre meilleur pari est de find un système de files FUSE capable de lire votre image disque. Pour les images ISO 9660, essayez fuseiso et le support ISO 9660 d'UMfuse (disponible sous Debian sous le package fuseiso9660 ).

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'permissions root.

Jetez un oeil à la page de man pour plus de détails.

Exemples

1. Pour un invité Windows classique qui a son système de files principal sur la première partition:

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

2. Pour un invité Linux classique disposant d'un système de files / boot sur la première partition et du système de files 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'append une input /etc/fstab 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 access root pour éditer ce file, donc ce n'est pas très utile.

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

Bien sûr, les modifications de /etc/fstab nécessitent des privilèges root. Mais une seule input peut être utilisée avec beaucoup de flexibilité pour (u) monter plusieurs files différents sur différents points de assembly, sans autre édition de /etc/fstab .

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

pour le assembly

 #!/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 directory /tmp/UFS/ est créé pour isoler les liens et éviter les conflits. Mais les liens symboliques peuvent être n'importe où dans l'espace user, tant qu'ils restnt au même endroit (même path). L'input /etc/fstab ne change jamais non plus.

AVERTISSEMENT VITAL: Le assembly est restreint pour de bonnes raisons de security. Le rendre plus flexible peut ouvrir des portes pour les logiciels malveillants. Je ne suis pas un expert en security et je vous conseille d'ouvrir les portes pas plus que nécessaire … en utilisant des options pour restreindre ce qui peut être fait avec les filesystems qui peuvent ainsi être montés. Si un consortingbuteur averti pouvait commenter davantage les problèmes de security, cela pourrait être utile.

Diverses options sont disponibles pour limiter l'utilisation des filesystems montés, tels que noexec qui empêche l'exécution des binarys, ou nosuid , et consortingbuent ainsi à la security. En fait, ces options sont ajoutées comme options par défaut lors de l' user options user ou users , ce qui est forcément le cas dans ce que nous faisons ci-dessous. Réfléchissez à deux fois avant de replace 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, le owner l'option dans l' input /etc/fstab permet aux users de traiter uniquement les files ou les périphériques qu'ils possèdent. Voir man mount pour une list d'options: http://linux.die.net/man/8/mount .

L'utilisation de cette input /etc/fstab peut également être restreinte par l'intermédiaire de la propriété user.group du directory (ou des directorys) contenant les liens symboliques.

Explication

Cette explication a été écrite avant que je réalise que je pourrais simplifier les choses aux deux scripts ci-dessus. Je n'ai pas pensé à eux tout de suite, en partie parce que j'ai à scope 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 compliquée qu'il ne le devrait, mais je n'ai pas le courage de le réécrire à partir de zéro.

L'idée de base est de créer des inputs dans /etc/fstab qui incluent l'option user ou users afin qu'un user puisse requestr à mount de faire le assembly spécifié dans cette input en donnant comme argument le file à monter ou le sharepoint assembly à utiliser mais pas les deux dans mon expérience).

Vous avez également besoin d'une input correcte à umount (qui est un problème légèrement différent – voir ci-dessous). L'option user est généralement meilleure que les users car elle restreint l'autorisation de umount à l'user qui a monté le système de files, alors que les users le permettent à tous. Malheureusement, l'option user ne fonctionne pas toujours, et peut entraîner d'autres étapes à faire pour fonctionner. Ceci est discuté dans l' option "user" pour mount, pas pour umount .

Vous ajoutez d'abord à /etc/fstab une input telle que:

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

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

Vous définissez également /tmp/UFS/mountpoint comme lien symbolique vers le sharepoint assembly que vous souhaitez utiliser, par exemple /mnt/iso .

Vous pouvez ensuite monter john-image-file.iso avec la command:

 $ mount /tmp/UFS/drive 

Cela est suffisant sur mon Mageia Linux, puisque l'utilisation de périphériques en boucle a été rendue implicite et ne nécessite plus l'utilisation explicite de la -o loop . Je ne sais pas à quel point c'est général aujourd'hui. Voir Lors du assembly, quand devrais-je utiliser un périphérique en boucle?

Ce assembly apparaît dans les tables et les commands:

 $ 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 assembly peut fonctionner pour n'importe quel file ou lecteur et nécessite seulement de créer un lien symbolique depuis /tmp/UFS/drive vers ce file ou vers le périphérique du lecteur. Bien sûr, un autre nom et location pourrait être choisi pour le lien symbolique, tant qu'il ne change jamais.

Le déassembly du file 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 harware, utilisez simplement les mêmes liens.

Cependant, les files contenant l'image d'un système de files sont montés via un type particulier de périphérique appelé périphérique de boucle, automatiquement alloué lorsque vous montez le file.

Pour démonter le file, vous devez vous référer au périphérique de boucle, pas au file. Vous devez donc dans /etc/fstab une input correspondant à la fois au périphérique de boucle utilisé dans /etc/mtab , ici /dev/loop0 , et au sharepoint assembly, ici /mnt/iso .

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

Cependant, vous pouvez find le nom du périphérique de boucle, ici /dev/loop0 , en demandant au système, comme nous l'avons fait ci-dessus de différentes manières. Ensuite, notre input standard /etc/fstab peut être dirigée vers le bon périphérique de boucle via le lien symbolique /tmp/UFS/drive et le sharepoint assembly comme précédemment avec /tmp/UFS/mountpoint . Cela fait, le file peut être démonté avec l'une des commands suivantes (à condition qu'il n'y ait pas d'ambiguïté avec /etc/mtab , ce qui est un problème différent):

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

Puisque les deux liens symboliques sont nécessaires seulement quand les commands sont émises, elles peuvent être changées dynamicment. Ainsi, notre input unique /etc/fstab permet de monter n'importe quel nombre de files, et de les démonter dans n'importe quel ordre, sans privilèges root.

Autres references:

Le package libguestfs-tools-c a la command guestmount

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

df affichera image.iso monté

 df 

pour démonter nous avons:

 guestunmount dvd