Wie kann ich eine Image-Datei ohne Root-Berechtigung mounten?

41

Kann ich ein Dateisystem-Image ohne Root-Berechtigung mounten? Normalerweise würde ich tun:

mount -o loop DISK_IMAGE FOLDER

Gibt mountes eine geeignete Möglichkeit, dies zu tun, ohne sudo zu verwenden oder suid zu aktivieren ?

Ich weiß, dass ich fusermountmit einigen ISO-Images arbeiten kann, aber das ist ziemlich begrenzt. Selbst bei ISO-Images können einige meiner Images nicht gemountet werden, mountfunktionieren aber immer.

Gänseblümchen
quelle
1
Wenn Ihre mountBinärdatei keine SUID-Berechtigungen erfordert, sollten Sie in der Lage sein, fakeroot ohne Probleme zu verwenden.
Sakisk
5
@faif fakeroothilft hier nicht weiter: Es gibt vor, dass der Dateibesitz anders ist, kann Ihnen jedoch keine Berechtigungen erteilen, die Sie nicht haben, z. B. zum Aufrufen, mount(2)wenn Sie nicht als Root angemeldet sind.
Gilles 'SO- hör auf böse zu sein'
Für @faif Mount sind unbedingt Root-Berechtigungen erforderlich. Die möglichen Konsequenzen wären ansonsten ziemlich katastrophal.
Shadur
related: unix.stackexchange.com/questions/96625/…
Ciro Santilli am

Antworten:

25

Sie können nichts bereitstellen, für das der Administrator Ihnen nicht die Berechtigung zum Bereitstellen erteilt hat. Nur root kann den mountSystemaufruf aufrufen. Der Grund dafür ist, dass es viele Möglichkeiten gibt, Berechtigungen durch das Mounten zu eskalieren, z. B. das Mounten von Daten über einen Systemspeicherort, das Erscheinen von Dateien als Eigentum eines anderen Benutzers und das Ausnutzen eines Programms, das auf Dateibesitz angewiesen ist, das Erstellen von Setuid-Dateien oder das Ausnutzen von Fehlern in Dateisystemtreibern.

Der mountBefehl lautet setuid root. Damit können Sie jedoch nur die Dinge einbinden, die in erwähnt werden fstab.

Der fusermountBefehl lautet setuid root. Hiermit können Sie nur Dinge über einen FUSE-Treiber mounten und Ihre Möglichkeiten einschränken, Dateien auf diese Weise mit willkürlichem Eigentum oder Berechtigungen zu versehen (bei den meisten Setups gehören alle Dateien auf einem FUSE-Mount Ihnen).

Am besten suchen Sie sich ein FUSE-Dateisystem , mit dem Sie Ihr Disk-Image lesen können. Für ISO 9660 Bilder, versuchen beide fuseiso und UMfuse der ISO 9660 - Unterstützung (unter Debian als fuseiso9660Paket ).

Gilles 'SO - hör auf böse zu sein'
quelle
+1 zur Erklärung, dass sudo(obwohl das SUID-Bit gesetzt ist) nur ein Benutzer fstabEinträge mounten kann . Daraus folgt, dass (a) das SUID-Bit Sinn macht, da ein regulärer Benutzer fstabEinträge mounten kann (und den mountSyscall ausführen darf ) und (b) es die mountEinschränkung des Dienstprogramms ist, fstabEinträge nur von Nicht- Benutzern mounten zu lassen. Root-Benutzer.
David
Wenn Sie mit Disketten-Images arbeiten, können Sie auch mtools verwenden, um nur Daten in das Image zu schreiben. Siehe: stackoverflow.com/questions/11202706/…
Giles Bathgate
@ David, hat sich das jetzt geändert? Die einzigen Einträge, die ich in meinem habe, fstabsind für rootfs und boot. Zum Einhängen von USB-Laufwerken schaue ich lsblkund mountentsprechend. Ich hatte keine Probleme damit.
Sherrellbc
16

Das Debian-Wiki zeigt verschiedene Möglichkeiten, dies zu tun. Hier ist ein Weg. (Dies erfordert das udisks2Paket.)

Zuerst

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

/dev/loop0 wird für die folgenden verwendet.

Aber wenn der udisksctl loop-setupBefehl zurückgekehrt war /dev/loop1, dann /dev/loop1für die folgenden verwendet worden wäre.

Sie müssen möglicherweise ausgeführt werden, wenn das zuvor erstellte Loopback-Gerät nicht automatisch bereitgestellt wird:

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

Sie können Dateien auf der Festplatte anzeigen

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

Sie können es abhängen, wenn Sie fertig sind

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

und wenn nötig:

$ udisksctl loop-delete -b /dev/loop0
Nick ODell
quelle
1
Udevil war bequemer Option
Anwar
Es hat auf Ubuntu 16.04 funktioniert, aber wie? Es scheint Loop-Geräte zu verwenden, die ich sudonur erwarten würde . setsid oder verwandte shenanigans ?
Ciro Santilli wird am
1
@CiroSantilli Ich bin nicht sicher. Der Quellcode des Tools ist hier . Es scheint DBus zu verwenden, um mit einem Daemon zu sprechen, aber ich kenne DBus oder Glib nicht so gut.
Nick ODell
1
Beachten Sie, dass die -rOption " udisksctl loop-setupNur Lesen" bedeutet, nach der das OP nicht gefragt hat. Löschen Sie diese Option , um einen beschreibbaren Mount zu erhalten.
Pelle Nilsson
15

Sie können das FUSE-Modul guestmount verwenden, um verschiedene Arten von Datenträgerabbildern bereitzustellen. Es ist Teil des guestfs-Ökosystems und erfordert keine Root-Berechtigungen.

Schauen Sie sich die Manpage für weitere Details an.

Beispiele

1. Für einen typischen Windows-Gast, dessen Hauptdateisystem sich auf der ersten Partition befindet:

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

2. Für einen typischen Linux-Gast mit einem / boot-Dateisystem auf der ersten Partition und dem Root-Dateisystem auf einem logischen Volume:

guestmount -a linux.img -m /dev/VG/LV -m /dev/sda1:/boot --ro /mnt
Matthew
quelle
1
Ärgerlicherweise erfordert das Ausführen von guestmount unter Ubuntu jetzt Root-Zugriff, um Kernel-Images lesen zu können: bugs.launchpad.net/ubuntu/+source/linux/+bug/759725
Clément
@ Clément Ich würde gerne verstehen, warum libguestfs ein Kernel-Image benötigt, um seine Aufgabe zu
erfüllen
1
@CiroSantilli 新疆 新疆 法轮功 六四 六四 法轮功, da libguestfs das Root-Verzeichnis umgeht, indem ein minimales Linux-System in einer virtuellen qemu-Maschine gestartet wird (jeder kann eine virtuelle qemu-Maschine starten, ohne root zu sein). Um diesen Rechner zu booten, benötigen Sie einen Kernel und initrd.
josch
3

Die Möglichkeit wäre, einen /etc/fstabEintrag für die ISO mit dem Parameter 'user' hinzuzufügen , wie

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

Normalerweise benötigen Sie jedoch trotzdem Root-Zugriff, um diese Datei zu bearbeiten. Daher ist dies nicht sehr hilfreich.

Renan
quelle
2

Es ist eigentlich sehr einfach, mehr oder weniger das zu mounten, was Sie als normaler Benutzer ohne Root-Rechte wollen, vorausgesetzt, der richtige Eintrag wurde in erstellt /etc/fstab.

Natürlich /etc/fstaberfordern Änderungen Root-Rechte. Ein einzelner Eintrag kann jedoch mit großer Flexibilität verwendet werden, um viele verschiedene Dateien an verschiedenen Einhängepunkten (u) einzuhängen, ohne dass eine weitere Bearbeitung erforderlich ist /etc/fstab.

Hier sind zwei sehr kurze (5 Zeilen + Kommentare) Bash-Skripte, die den Job erledigen:

zur 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.

und zum Absteigen

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

Das Verzeichnis /tmp/UFS/wird erstellt, um die Links zu isolieren und Konflikte zu vermeiden. Die Symlinks können sich jedoch an einer beliebigen Stelle im Benutzerbereich befinden, solange sie sich an derselben Stelle (auf demselben Pfad) befinden. Der /etc/fstabEintrag ändert sich auch nie.

VITAL WARNING: Die Montage ist aus Sicherheitsgründen eingeschränkt. Eine flexiblere Gestaltung kann Tür und Tor für schädliche Software öffnen. Ich bin kein Sicherheitsexperte und würde empfehlen, dass Sie Türen nicht mehr als unbedingt erforderlich öffnen ... indem Sie Optionen verwenden, um einzuschränken, was mit den Dateisystemen geschehen kann, die auf diese Weise angehängt werden können. Wenn ein sachkundiger Mitarbeiter weitere Kommentare zu Sicherheitsproblemen abgeben kann, ist dies möglicherweise hilfreich.

Es stehen verschiedene Optionen zur Verfügung, um die Verwendung von bereitgestellten Dateisystemen einzuschränken, z. B. um noexecdie Ausführung von Binärdateien zu verhindern oder um nosuidso zur Sicherheit beizutragen. Tatsächlich werden diese Optionen als Standardoptionen hinzugefügt, wenn die Optionen useroder usersverwendet werden, was in den folgenden Schritten unbedingt der Fall ist. Überlegen Sie zweimal, bevor Sie diese Standardeinstellungen überschreiben. http://en.wikipedia.org/wiki/Fstab

Weitere Optionen können zum weiteren Schutz hinzugefügt werden. Mit der Option owner im /etc/fstab Eintrag können Benutzer beispielsweise nur mit Dateien oder Geräten umgehen, deren Eigentümer sie sind. Siehe man mount für eine Liste der Optionen: http://linux.die.net/man/8/mount .

Die Verwendung dieses /etc/fstabEintrags kann auch durch den Besitz der Benutzergruppe des Verzeichnisses (oder der Verzeichnisse) eingeschränkt werden, in denen sich die Symlinks befinden.

Erläuterung

Diese Erklärung wurde geschrieben, bevor mir klar wurde, dass ich die beiden obigen Skripte vereinfachen kann. Ich habe nicht sofort an sie gedacht, weil ich ein etwas komplexeres Problem zur Hand habe, das sie ohne zusätzliche Maschinen nicht lösen können. Daher mag meine Erklärung etwas komplizierter sein, als sie sollte, aber ich habe nicht den Mut, alles von Grund auf neu zu schreiben.

Die Grundidee besteht darin, Einträge zu erstellen /etc/fstab, die die Option useroder enthalten, usersdamit ein Benutzer mountdie in diesem Eintrag angegebene Einbindung ausführen kann, indem er als Argument die einzubindende Datei oder den zu verwendenden Einhängepunkt angibt (jedoch nicht beide in meiner Erfahrung). .

Sie benötigen auch einen korrekten Zugang zu umount(was ein etwas anderes Problem ist - siehe unten). Die Option userist normalerweise besser als, usersda sie die Berechtigung auf umountden Benutzer beschränkt, der das Dateisystem bereitgestellt hat, während dies usersfür alle zulässig ist . Leider userfunktioniert die Option nicht immer und kann einige andere Arbeitsschritte erfordern. Dies wird in der Option "Benutzer" Arbeit für Mount, nicht für Umount erläutert .

Zuerst fügen Sie /etc/fstabeinen Eintrag hinzu wie:

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

und /tmp/UFS/driveals symbolische Verknüpfung (oder symbolische Verknüpfung) zu jedem Gerät oder jeder Datei verwenden, die Sie bereitstellen möchten, z. B. eine Datei, die das Image eines ISO-Dateisystems enthält /home/johndoe/john-image-file.iso.

Sie definieren auch /tmp/UFS/mountpointals Symlink den Mount-Punkt, den Sie verwenden möchten, sagen wir /mnt/iso.

Sie können dann john-image-file.isomit dem Befehl einhängen :

$ mount /tmp/UFS/drive

Dies ist auf meinem Mageia Linux ausreichend, da die Verwendung von Loop-Geräten jetzt implizit ist und nicht mehr -o loopexplizit erforderlich ist . Ich weiß nicht, wie allgemein das heute ist. Siehe Wann sollte ich bei der Montage ein Loop-Gerät verwenden?

Diese Montage erscheint in Tabellen und Befehlen:

$ 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

Der Bereitstellungsvorgang kann für jede Datei oder jedes Laufwerk ausgeführt werden und erfordert lediglich eine symbolische Verknüpfung von /tmp/UFS/drivedieser Datei oder dem Gerät für das Laufwerk. Natürlich könnte ein anderer Name und Ort für den symbolischen Link gewählt werden, solange er sich nie ändert.

Das Aufheben der Bereitstellung der Datei hängt in gleicher Weise von der ordnungsgemäßen Verwendung symbolischer Verknüpfungen ab. Bei einem normalen Gerät, das einem Hardwarelaufwerk entspricht, verwenden Sie einfach dieselben Links.

Dateien, die das Image eines Dateisystems enthalten, werden jedoch über eine spezielle Art von Gerät bereitgestellt, die als Loop-Gerät bezeichnet wird und beim Bereitstellen der Datei automatisch zugewiesen wird.

Um die Bereitstellung der Datei aufzuheben, müssen Sie sich auf das Loop-Gerät und nicht auf die Datei beziehen. Daher benötigen Sie in /etc/fstabeinem Eintrag, der sowohl dem hier verwendeten Loop-Gerät als auch dem /etc/mtabhier verwendeten /dev/loop0Mount-Punkt entspricht /mnt/iso.

Sie können einen solchen Eintrag nicht im Voraus erstellen, da das Loop-Gerät variieren kann, da es dynamisch zugewiesen wird. Beachten Sie, dass es auch möglich ist, ein Gerät mit fester Schleife zu verwenden, dies ist jedoch auf andere Weise unpraktisch. Siehe http://igurublog.wordpress.com/2011/01/22/how-to-allow-mounting-of-iso-files-by-a-regular-user/ ( dieser Blog hat die Antwort hier tatsächlich inspiriert ).

Sie können den Namen des Loop-Geräts jedoch hier finden /dev/loop0, indem Sie das System wie oben beschrieben auf verschiedene Arten fragen. Dann kann unser Standardeintrag /etc/fstabso eingestellt werden, dass er über den Symlink auf das richtige Loop-Gerät /tmp/UFS/driveund wie zuvor mit auf den Mount-Punkt verweist /tmp/UFS/mountpoint. Wenn dies erledigt ist, kann die Bereitstellung der Datei mit einem der folgenden Befehle aufgehoben werden (vorausgesetzt, es besteht keine Mehrdeutigkeit /etc/mtab, was ein anderes Problem darstellt):

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

Da die beiden Symlinks nur benötigt werden, wenn die Befehle ausgegeben werden, können sie dynamisch geändert werden. Unser einzelner /etc/fstabEintrag ermöglicht es daher, eine beliebige Anzahl von Dateien ohne Root-Rechte einzuhängen und diese in beliebiger Reihenfolge umzuhängen.

Weitere Referenzen:

14 Umdrehungen
quelle
Wenn fstab-Einträge auf symlinks verweisen, können sie dann nicht ausgenutzt werden, um etwas ohne root bereitzustellen, indem nur symlinks erstellt werden? Indirekt, ist es nicht nur eine Erhöhung des mountBefehls für jeden normalen Benutzer? Und damit verbundene Sicherheitsprobleme? Korrigiere mich, wenn ich falsch liege.
Bharat G
Und neuere Versionen von GNU / Linux-Distributionen (z. B. Debian Jessie) bieten keine GUI-Anmeldung, wenn ein ungültiger Eintrag in fstab erkannt wird. Es wird auf die Konsolenanmeldesitzung zurückgegriffen, wenn der deviceoder der mountpointAbschnitt von fstab nicht auf einen gültigen Eintrag verweist. Der Benutzer muss sich über eine Konsolensitzung anmelden und eingeben startx, um einen Display Manager explizit zu starten.
Bharat G
0

Das Paket libguestfs-tools-c hat also den Befehl guestmount

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

df zeigt image.iso gemountet an

df

zu umount haben wir:

guestunmount dvd
Sérgio
quelle