Jak zamontować plik obrazu bez uprawnień roota?

41

Czy mogę zamontować obraz systemu plików bez uprawnień roota? Normalnie zrobiłbym:

mount -o loop DISK_IMAGE FOLDER

Czy bez użycia sudo lub włączania suid mountjest jakiś odpowiedni sposób, aby to zrobić?

Wiem, że mogę używać fusermountz niektórymi obrazami ISO, ale jest to dość ograniczone, nawet w przypadku obrazów ISO, niektórych moich obrazów nie można zamontować, ale mountzawsze działa.

stokrotka
źródło
1
Jeśli Twój mountplik binarny nie wymaga uprawnień SUID, powinieneś być w stanie używać fakeroot bez problemów.
sakisk
5
@faif fakerootnie pomoże tutaj: udaje, że własność pliku jest inna, ale nie może dać ci uprawnień, których nie masz, takich jak dzwonienie, mount(2)gdy nie jesteś rootem.
Gilles „SO- przestań być zły”
@faif Mount absolutnie wymaga uprawnień roota. W przeciwnym razie potencjalne konsekwencje byłyby katastrofalne.
Shadur
powiązane: unix.stackexchange.com/questions/96625/…
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

Odpowiedzi:

25

Nie możesz zamontować niczego, czego administrator nie dał ci jakoś pozwolenia. Tylko root może wywoływać wywołanie mountsystemowe. Powodem tego jest to, że istnieje wiele sposobów na eskalację uprawnień poprzez montowanie, na przykład montowanie czegoś w lokalizacji systemowej, powodowanie, że pliki wydają się należeć do innego użytkownika i wykorzystywanie programu zależnego od własności pliku, tworzenie plików setuid lub wykorzystywanie błędów w sterownikach systemu plików.

mountKomenda jest setuid korzeń. Ale pozwala tylko montować rzeczy wymienione w fstab.

fusermountKomenda jest setuid korzeń. Pozwala tylko montować elementy za pomocą sterownika FUSE i ogranicza twoje możliwości dostarczania plików z dowolną własnością lub uprawnieniami w ten sposób (w większości konfiguracji wszystkie pliki na FUSE należą do ciebie).

Najlepiej jest znaleźć system plików FUSE, który jest w stanie odczytać obraz dysku. W przypadku obrazów ISO 9660 wypróbuj obsługę ISO 9660 zarówno fuseiso, jak i UMfuse (dostępne jako fuseiso9660pakiet w Debianie ).

Gilles „SO- przestań być zły”
źródło
+1 za wyjaśnienie, że sudo(chociaż ma ustawiony bit SUID) pozwala tylko na zamontowanie fstabwpisów. Z tego wynika, że ​​(a) bit SUID ma sens, ponieważ zwykły użytkownik może montować fstabwpisy (i może wykonywać mountsyscall) oraz (b), że mountograniczeniem narzędzia jest zezwalanie fstabna montowanie wpisów tylko przez osoby inne niż root użytkowników.
David,
Jeśli pracujesz z obrazami dyskietek, możesz także użyć mtools, aby po prostu zapisać dane na obrazie. Zobacz: stackoverflow.com/questions/11202706/…
Giles Bathgate
@David, czy to się teraz zmieniło? Jedyne wpisy, które mam, fstabdotyczą rootfów i bootowania. Aby zamontować dyski USB, patrzę lsblki mountodpowiednio. Nie miałem z tym problemu.
sherrellbc
16

Debian Wiki pokazuje kilka sposobów robienia tego. Oto jeden ze sposobów. (To wymaga udisks2pakietu.)

Pierwszy

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

/dev/loop0 zostaną wykorzystane do następujących celów.

Ale jeśli udisksctl loop-setuppolecenie wróci /dev/loop1, /dev/loop1zostanie użyte do następujących celów.

Może być konieczne uruchomienie, jeśli urządzenie sprzężenia zwrotnego (wcześniej utworzone) nie zostanie automatycznie zamontowane:

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

Możesz przeglądać pliki na dysku

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

Możesz to odmontować, kiedy skończysz

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

a jeśli to konieczne:

$ udisksctl loop-delete -b /dev/loop0
Nick ODell
źródło
1
udevil był wygodniejszą opcją
Anwar,
Działa na Ubuntu 16.04, ale jak? Wydaje się, że używa urządzeń pętlowych, których spodziewałbym się sudotylko. sidanigans lub powiązane shenanigany ?
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
1
@CiroSantilli 新疆 改造 中心 六四 事件 法轮功 Nie jestem pewien. Kod źródłowy narzędzia jest tutaj . Wygląda na to, że używa DBusa do rozmowy z demonem, ale nie znam tak dobrze DBusa ani Gliba.
Nick ODell
1
Zauważ, że -ropcja udisksctl loop-setupoznaczająca tylko do odczytu, o którą OP nie prosił, więc upuść ją, aby uzyskać zapisywalny montaż.
Pelle Nilsson
15

Za pomocą modułu gościa FUSE można zamontować kilka rodzajów obrazów dysków. Jest to część ekosystemu gości i nie wymaga uprawnień roota.

Zajrzyj na stronę podręcznika, aby uzyskać więcej informacji.

Przykłady

1. Dla typowego gościa Windows, który ma główny system plików na pierwszej partycji:

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

2. Dla typowego gościa Linux, który ma system plików / boot na pierwszej partycji, a główny system plików na woluminie logicznym:

guestmount -a linux.img -m /dev/VG/LV -m /dev/sda1:/boot --ro /mnt
Mateusz
źródło
1
Irytujące jest, że uruchamianie guestmount na Ubuntu wymaga teraz dostępu do katalogu głównego, aby odczytać obrazy jądra: bugs.launchpad.net/ubuntu/+source/linux/+bug/759725
Clément
@ Clément Chciałbym zrozumieć, dlaczego libguestfs potrzebuje obrazu jądra do swojej pracy ...
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
1
@CiroSantilli 新疆 改造 中心 六四 事件 法轮功, ponieważ libguestfs unika konieczności rootowania poprzez uruchomienie minimalnego systemu Linux w maszynie wirtualnej qemu (każdy może uruchomić maszynę wirtualną qemu bez uprawnień użytkownika root). Aby uruchomić tę maszynę, potrzebuje trochę jądra i initrd.
josch
3

Możliwym sposobem byłoby dodanie /etc/fstabpozycji ISO z parametrem „użytkownik”, np

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

Ale zwykle i tak potrzebujesz dostępu do roota, aby edytować ten plik, więc nie jest to zbyt pomocne.

Renan
źródło
2

W rzeczywistości bardzo łatwo jest zamontować mniej więcej tyle, ile chcesz jako zwykły użytkownik bez uprawnień roota, pod warunkiem, że utworzono odpowiedni wpis /etc/fstab.

Oczywiście modyfikacje /etc/fstabwymagające uprawnień roota. Ale jednego wpisu można używać z dużą elastycznością do (u) montowania wielu różnych plików w różnych punktach montowania, bez dalszej edycji /etc/fstab.

Oto dwa bardzo krótkie (5 wierszy + komentarze) skrypty Bash, które wykonają zadanie:

do montażu

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

i do zsiadania

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

Katalog /tmp/UFS/jest tworzony w celu odizolowania łączy i uniknięcia kolizji. Ale dowiązania symboliczne mogą znajdować się w dowolnym miejscu w przestrzeni użytkownika, o ile pozostają w tym samym miejscu (tej samej ścieżce). /etc/fstabWpis nigdy się nie zmienia albo.

VITAL OSTRZEŻENIE: Montaż jest ograniczony ze względów bezpieczeństwa. Uelastycznienie może otworzyć drzwi przed złośliwym oprogramowaniem. Nie jestem ekspertem od bezpieczeństwa i zaleciłbym, aby otwierać drzwi nie więcej niż absolutnie wymagane ... używając opcji, aby ograniczyć możliwości, jakie można wykonać w systemach plików, które można w ten sposób zamontować. Jeśli kompetentny współpracownik mógłby komentować dalej kwestie bezpieczeństwa, może to być przydatne.

Dostępne są różne opcje ograniczające użycie zamontowanych systemów plików, takie jak noexeczapobiegające wykonywaniu plików binarnych lub nosuidprzyczyniające się do bezpieczeństwa. W rzeczywistości te opcje są dodawane jako opcje domyślne, gdy są one używane userlub userssą używane, co koniecznie ma miejsce w przypadku tego, co robimy poniżej. Pomyśl dwa razy, zanim zastąpisz te wartości domyślne. http://en.wikipedia.org/wiki/Fstab

W celu dalszej ochrony można dodać inne opcje. Na przykład opcja owner we /etc/fstab wpisie pozwoli użytkownikom zajmować się tylko plikami lub urządzeniami, których są właścicielami. Zobacz man mount listę opcji: http://linux.die.net/man/8/mount .

Użycie tego /etc/fstabwpisu może być również ograniczone przez własność grupy .group użytkownika katalogu (lub katalogów) zawierających dowiązania symboliczne.

Wyjaśnienie

To wyjaśnienie zostało napisane, zanim zdałem sobie sprawę, że mogę uprościć dwa powyższe skrypty. Nie pomyślałem o nich od razu, częściowo dlatego, że mam pod ręką nieco bardziej złożony problem, którego nie rozwiążą bez dodatkowej maszyny. Dlatego moje wyjaśnienie może być nieco bardziej skomplikowane niż powinno, ale nie mam odwagi, aby przepisać wszystko od nowa.

Podstawową ideą jest utworzenie wpisów, /etc/fstabktóre zawierają opcję userlub usersaby użytkownik mógł poprosić mounto wykonanie montażu określonego w tym wpisie, podając jako argument plik do zamontowania lub punkt podłączenia do użycia (ale nie jedno i drugie z mojego doświadczenia) .

Potrzebujesz również odpowiedniego wpisu umount(co jest nieco innym problemem - patrz poniżej). Ta opcja userjest zwykle lepsza niż, usersponieważ ogranicza uprawnienia do umountużytkownika, który zamontował system plików, a userspozwoli na to wszystkim. Niestety opcja usernie zawsze działa i może wymagać kilku innych kroków, które należy podjąć. Jest to omówione w Opcji „user” praca dla montowania, a nie dla umount .

Najpierw dodajesz do /etc/fstabwpisu, takiego jak:

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

i użyj /tmp/UFS/drivejako dowiązania symbolicznego (lub dowiązania symbolicznego) do dowolnego urządzenia lub pliku, który chcesz zamontować, powiedzmy plik zawierający obraz systemu plików ISO /home/johndoe/john-image-file.iso.

Na przykład definiujesz /tmp/UFS/mountpointjako dowiązanie symboliczne do punktu montowania, którego chcesz użyć /mnt/iso.

Następnie możesz zamontować john-image-file.isoza pomocą polecenia:

$ mount /tmp/UFS/drive

Jest to wystarczające w moim systemie Mageia Linux, ponieważ korzystanie z urządzeń pętlowych zostało teraz dorozumiane i nie wymaga już -o loopjawnego używania . Nie wiem, jak to jest dzisiaj ogólne. Zobacz Kiedy należy montować, kiedy powinienem używać urządzenia z pętlą?

To mocowanie pojawia się w tabelach i poleceniach:

$ 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

Operacja montowania może działać dla dowolnego pliku lub dysku i wymaga jedynie utworzenia dowiązania symbolicznego /tmp/UFS/drivedo tego pliku lub urządzenia dla dysku. Oczywiście dla dowiązania symbolicznego można wybrać inną nazwę i lokalizację, o ile nigdy się nie zmieni.

Demontaż pliku zależy w ten sam sposób od właściwego użycia dowiązań symbolicznych. W przypadku normalnego urządzenia odpowiadającego niektórym napędom harware wystarczy użyć tych samych łączy.

Jednak pliki zawierające obraz systemu plików są montowane za pomocą specjalnego rodzaju urządzenia zwanego urządzeniem pętli, przydzielanego automatycznie podczas montowania pliku.

Aby zdemontować plik, musisz odwołać się do urządzenia pętli, a nie do pliku. Dlatego potrzebujesz /etc/fstabwpisu, który pasuje zarówno do urządzenia pętli używanego /etc/mtabtutaj /dev/loop0, jak i do punktu montowania tutaj /mnt/iso.

Nie można wcześniej utworzyć takiego wpisu, ponieważ urządzenie pętli może się różnić, ponieważ są one przydzielane dynamicznie. Należy pamiętać, że można również użyć urządzenia o stałej pętli, ale jest to niewygodne na inne sposoby. Zobacz http://igurublog.wordpress.com/2011/01/22/how-to-allow-mounting-of-iso-files-by-a-regular-user/ ( ten blog faktycznie zainspirował odpowiedź tutaj ).

Możesz jednak tutaj znaleźć nazwę urządzenia pętli, /dev/loop0pytając system, tak jak to zrobiliśmy powyżej na kilka różnych sposobów. Następnie /etc/fstabmożna wprowadzić nasz standardowy wpis, aby wskazywał na prawą pętlę za pomocą dowiązania symbolicznego /tmp/UFS/drivei na punkt montowania, jak to wcześniej zrobiono /tmp/UFS/mountpoint. W tym celu plik można odinstalować za pomocą dowolnego z następujących poleceń (pod warunkiem, że nie ma dwuznaczności /etc/mtab, co stanowi inny problem):

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

Ponieważ dwa dowiązania symboliczne są potrzebne tylko po wydaniu poleceń, można je zmieniać dynamicznie. Dlatego nasz pojedynczy /etc/fstabwpis pozwala na zamontowanie dowolnej liczby plików i podłączenie ich w dowolnej kolejności, bez uprawnień roota.

Inne referencje:

Babou
źródło
Kiedy wpisy fstab wskazują na dowiązania symboliczne, czy nie można ich wykorzystać do montowania czegokolwiek bez roota, po prostu tworząc dowiązania symboliczne? Pośrednio, czy nie jest to po prostu podniesienie mountpolecenia dla każdego normalnego użytkownika ?, a więc związane z tym problemy bezpieczeństwa? Popraw mnie, jeśli się mylę.
Bharat G
Ostatnie wersje dystrybucji GNU / Linux (powiedzmy debian jessie) nie będą zapewniały loginu GUI, gdy wykryje nieprawidłowy wpis w fstab. Powraca do konsoli sesji użytkownika, jeśli devicelub mountpointodcinek fstab nie wskazuje na prawidłowy wpisu. Użytkownik musi się zalogować za pomocą sesji konsoli i wejść, startxaby jawnie uruchomić menedżera wyświetlania.
Bharat G
0

Pakiet libguestfs-tools-c ma komendę guestmount

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

df pokaże zamontowany image.iso

df

do umountowania mamy:

guestunmount dvd
Sérgio
źródło