Come montare un file di immagine senza il permesso di root?


41

Posso montare un'immagine del file system senza il permesso di root? Normalmente farei:

mount -o loop DISK_IMAGE FOLDER

Senza usare sudo o impostando il suid mount, c'è un modo adatto per farlo?

So che posso usare fusermountcon alcune immagini ISO, ma questo è piuttosto limitato, anche per le immagini ISO, alcune delle mie immagini non possono essere montate, ma mountfunzionano sempre.


1
Se il tuo mountbinario non richiede autorizzazioni SUID, dovresti essere in grado di usare fakeroot senza problemi.
sabato

5
@faif fakerootnon aiuta qui: finge che la proprietà del file sia diversa, ma non può darti permessi che non hai, come chiamare mount(2)quando non sei root.
Gilles 'SO- smetti di essere malvagio' il

@faif Mount richiede assolutamente i permessi di root. Le potenziali conseguenze altrimenti sarebbero piuttosto disastrose.
Shadur,

Risposte:


25

Non puoi montare nulla che l'amministratore non ti abbia in qualche modo autorizzato a montare. Solo root può chiamare la mountchiamata di sistema. La ragione di ciò è che ci sono molti modi per aumentare i privilegi attraverso il montaggio, come montare qualcosa su una posizione del sistema, far apparire i file come appartenenti a un altro utente e sfruttare un programma che si basa sulla proprietà dei file, creare file setuid o sfruttare i bug nei driver del filesystem.

Il mountcomando è setuid root. Ma ti permette solo di montare le cose che sono menzionate in fstab.

Il fusermountcomando è setuid root. Ti consente solo di montare le cose attraverso un driver FUSE e limita le tue capacità di fornire file con proprietà o autorizzazioni arbitrarie in quel modo (nella maggior parte delle configurazioni, tutti i file su un supporto FUSE appartengono a te).

La soluzione migliore è trovare un filesystem FUSE in grado di leggere l'immagine del disco. Per le immagini ISO 9660, prova sia fuseiso che il supporto ISO 9660 di UMfuse (disponibile sotto Debian come fuseiso9660pacchetto ).


+1 per spiegare che sudo(sebbene abbia il bit SUID impostato) consente solo di montare le fstabvoci. Da ciò ne consegue che (a) il bit SUID ha senso, poiché un utente normale può montare le fstabvoci (ed è autorizzato a eseguire la mountsyscall) e (b) che è mountuna limitazione dell'utilità consentire solo alle fstabvoci di essere montate da non- utenti root.
David

Se stai lavorando con immagini di floppy disk, puoi anche usare mtools per scrivere semplicemente dati sull'immagine. Vedi: stackoverflow.com/questions/11202706/…
Giles Bathgate,

@ David, ora è cambiato? Le uniche voci che ho nel mio fstabsono per rootfs e boot. Per montare le unità USB guardo lsblke di mountconseguenza. Non ho avuto problemi a farlo.
Sherrellbc,

16

Il Debian Wiki mostra diversi modi per farlo. Ecco un modo. (Questo richiede il udisks2pacchetto.)

Primo

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

/dev/loop0 verrà utilizzato per quanto segue.

Ma se il udisksctl loop-setupcomando fosse tornato /dev/loop1, /dev/loop1sarebbe stato usato per quanto segue.

Potrebbe essere necessario eseguire se il dispositivo di loopback (precedentemente creato) non viene montato automaticamente:

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

Puoi guardare i file sul disco

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

Puoi smontarlo quando hai finito

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

e se necessario:

$ udisksctl loop-delete -b /dev/loop0

1
udevil era l'opzione più conveniente
Anwar

Ha funzionato su Ubuntu 16.04, ma come? Sembra usare dispositivi loop che mi aspetterei di essere sudosolo. Shenanigans setsid o correlati ?
Ciro Santilli 10 改造 中心 法轮功 六四 事件

1
@CiroSantilli 新疆 改造 中心 六四 事件 法轮功 Non ne sono sicuro. Il codice sorgente dello strumento è qui . Sembra usare DBus per parlare con un demone, ma non conosco bene DBus o Glib.
Nick ODell,

1
Si noti che l' -ropzione udisksctl loop-setupsignifica sola lettura, cosa che l'OP non ha richiesto, quindi rilasciarla per ottenere un montaggio scrivibile.
Pelle Nilsson,

15

È possibile utilizzare il modulo FUSE guestmount per montare diversi tipi di immagini del disco. Fa parte dell'ecosistema guestfs e non richiede autorizzazioni di root.

Dai un'occhiata alla pagina man per ulteriori dettagli.

Esempi

1. Per un tipico guest Windows che ha il suo filesystem principale nella prima partizione:

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

2. Per un tipico guest Linux che ha un filesystem / boot sulla prima partizione e il filesystem di root su un volume logico:

guestmount -a linux.img -m /dev/VG/LV -m /dev/sda1:/boot --ro /mnt

1
Stranamente, eseguire guestmount su Ubuntu ora richiede un po 'di accesso root per leggere le immagini del kernel: bugs.launchpad.net/ubuntu/+source/linux/+bug/759725
Clément

@ Clément Vorrei capire perché libguestfs ha bisogno dell'immagine di un kernel per il suo lavoro ...
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

1
@CiroSantilli 法轮功 改造 中心 六四 事件 法轮功 perché libguestfs evita di aver bisogno del root avviando un sistema Linux minimo all'interno di una macchina virtuale qemu (chiunque può avviare una macchina virtuale qemu senza essere root). Per avviare quella macchina, ha bisogno di un po 'di kernel e initrd.
giovedì

3

Il modo possibile sarebbe aggiungere una /etc/fstabvoce per l'ISO con il parametro "utente", come

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

Ma di solito hai bisogno dell'accesso root per modificare questo file, quindi non è molto utile.


2

In realtà è molto facile montare più o meno quello che vuoi come un normale utente senza i privilegi di root, a condizione che sia stata creata la voce giusta /etc/fstab.

Naturalmente, le modifiche /etc/fstabrichiedono privilegi di root. Ma una singola voce può essere utilizzata con molta flessibilità per (u) montare molti file diversi su punti di montaggio diversi, senza ulteriori modifiche di /etc/fstab.

Ecco due script Bash molto brevi (5 righe + commenti) che faranno il lavoro:

per il montaggio

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

e per smontare

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

La directory /tmp/UFS/viene creata per isolare i collegamenti ed evitare gli scontri. Ma i collegamenti simbolici possono trovarsi ovunque nello spazio utente, purché rimangano nello stesso posto (stesso percorso). /etc/fstabNemmeno la voce cambia.

AVVISO VITAL: il montaggio è limitato per buoni motivi di sicurezza. Renderlo più flessibile può aprire le porte a software dannoso. Non sono un esperto di sicurezza e consiglierei di aprire le porte non più di quanto assolutamente necessario ... utilizzando le opzioni per limitare ciò che può essere fatto con i file system che possono quindi essere montati. Se un collaboratore esperto potesse commentare ulteriormente i problemi di sicurezza, potrebbe essere utile.

Sono disponibili varie opzioni per limitare l'uso dei file system montati, ad esempio noexecche impedisce l'esecuzione di file binari o nosuid, e quindi contribuisce alla sicurezza. In realtà, queste opzioni sono aggiunti come opzioni predefinite quando le opzioni usero userssono utilizzati, che è necessariamente il caso in quello che facciamo qui di seguito. Pensaci due volte prima di ignorare queste impostazioni predefinite. http://en.wikipedia.org/wiki/Fstab

Altre opzioni possono essere aggiunte per ulteriore protezione. Ad esempio, l'opzione owner nella /etc/fstab voce consentirà agli utenti di gestire solo file o dispositivi di loro proprietà. Vedere man mount per un elenco di opzioni: http://linux.die.net/man/8/mount .

L'uso di questa /etc/fstabvoce può anche essere limitato tramite la proprietà user.group della directory (o directory) contenente i collegamenti simbolici.

Spiegazione

Questa spiegazione è stata scritta prima che mi rendessi conto che potevo semplificare le cose ai due script sopra. Non li ho pensati subito in parte perché ho a portata di mano un problema leggermente più complesso che non risolvono senza qualche macchinario aggiuntivo. Quindi la mia spiegazione potrebbe essere un po 'più complessa di quanto dovrebbe, ma non ho il coraggio di riscriverla da zero.

L'idea di base è creare voci /etc/fstabche includano l'opzione usero userscosì che un utente possa chiedere mountdi eseguire il montaggio specificato in quella voce fornendo come argomento il file da montare o il punto di montaggio da usare (ma non entrambi nella mia esperienza) .

Hai anche bisogno di una voce corretta per umount(che è un problema leggermente diverso - vedi sotto). L'opzione userè di solito migliore rispetto a usersquando limita l'autorizzazione umountall'utente che ha montato il file system, mentre userslo consentirà a tutti. Sfortunatamente l'opzione usernon funziona sempre e può comportare alcuni altri passaggi per funzionare. Questo è discusso nell'opzione "user" work per mount, non per umount .

Per prima cosa aggiungi /etc/fstabuna voce come:

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

e utilizzare /tmp/UFS/drivecome collegamento simbolico (o collegamento simbolico) a qualsiasi dispositivo o file che si desidera montare, ad esempio un file contenente l'immagine di un file system ISO /home/johndoe/john-image-file.iso.

Definisci anche /tmp/UFS/mountpointun collegamento simbolico al punto di montaggio che desideri utilizzare, per esempio /mnt/iso.

È quindi possibile montare john-image-file.isocon il comando:

$ mount /tmp/UFS/drive

Questo è sufficiente sul mio Mageia Linux, dal momento che l'uso dei dispositivi loop è stato ora implicito e non richiede più l'uso -o loopesplicito. Non so quanto sia generale oggi. Vedi Durante il montaggio, quando dovrei usare un dispositivo loop?

Questo montaggio appare in tabelle e comandi:

$ 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'operazione di montaggio potrebbe funzionare per qualsiasi file o unità e richiede solo di creare un collegamento simbolico /tmp/UFS/drivea quel file o al dispositivo per l'unità. Naturalmente, un altro nome e posizione potrebbero essere scelti per il collegamento simbolico, purché non cambi mai.

Lo smontaggio del file si basa allo stesso modo sull'uso appropriato dei collegamenti simbolici. Nel caso di un normale dispositivo corrispondente ad alcune unità harware, basta usare gli stessi collegamenti.

Tuttavia, i file contenenti l'immagine di un file system vengono montati tramite un tipo speciale di dispositivo chiamato dispositivo loop, allocato automaticamente quando si monta il file.

Per smontare il file, è necessario fare riferimento al dispositivo loop, non al file. Quindi è necessario in /etc/fstabuna voce che corrisponda sia al dispositivo loop utilizzato in /etc/mtab, qui /dev/loop0, sia al punto di montaggio, qui /mnt/iso.

Non è possibile creare una voce di questo tipo in anticipo poiché il dispositivo loop può variare, poiché sono allocati in modo dinamico. Si noti che è anche possibile utilizzare un dispositivo ad anello fisso, ma è scomodo in altri modi. Vedi http://igurublog.wordpress.com/2011/01/22/how-to-allow-mounting-of-iso-files-by-a-regular-user/ ( questo blog in realtà ha ispirato la risposta qui ).

Tuttavia, puoi trovare il nome del dispositivo loop, qui /dev/loop0, chiedendo al sistema, come abbiamo fatto sopra in diversi modi. Quindi la nostra /etc/fstabvoce standard può essere fatta per puntare al dispositivo ad anello destro tramite il collegamento simbolico /tmp/UFS/drivee al punto di montaggio come fatto precedentemente /tmp/UFS/mountpoint. Ciò fatto, il file può essere disinstallato con uno dei seguenti comandi (a condizione che non vi sia alcuna ambiguità /etc/mtab, che è un problema diverso):

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

Poiché i due collegamenti simbolici sono necessari solo quando vengono emessi i comandi, possono essere modificati in modo dinamico. Quindi la nostra singola /etc/fstabvoce consente di montare un numero qualsiasi di file e di smontarli in qualsiasi ordine, senza i privilegi di root.

Altre referenze:


Quando le voci fstab puntano a collegamenti simbolici, non possono essere sfruttate per montare nulla senza root, semplicemente creando collegamenti simbolici? Indirettamente, non è solo elevando il mountcomando per ogni utente normale? E quindi i problemi di sicurezza ad esso associati? Correggimi se sbaglio.
Bharat G

E le versioni recenti delle distribuzioni GNU / Linux (diciamo debian jessie) non forniranno un login gui quando rileva una voce non valida in fstab. Torna alla sessione di accesso alla console se devicela mountpointsezione o di fstab non punta a una voce valida. L'utente deve accedere tramite la sessione della console ed entrare startxper avviare esplicitamente un display manager.
Bharat G

0

Il pacchetto libguestfs-tools-c ha il comando guestmount in questo modo

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

df mostrerà image.iso montato

df

per smontare abbiamo:

guestunmount dvd
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.