Bagaimana cara me-mount file gambar tanpa izin root?

41

Bisakah saya memasang gambar sistem file tanpa izin root? Biasanya saya akan melakukan:

mount -o loop DISK_IMAGE FOLDER

Tanpa menggunakan sudo atau menyetel suid mount, apakah ada cara yang cocok untuk melakukan ini?

Saya tahu saya dapat menggunakan fusermountdengan beberapa gambar ISO, tapi itu cukup terbatas, bahkan untuk gambar ISO, beberapa gambar saya tidak dapat dipasang, tetapi mountselalu berfungsi.

bunga aster
sumber
1
Jika mountbiner Anda tidak memerlukan izin SUID maka Anda harus dapat menggunakan fakeroot tanpa masalah.
sakisk
5
@faif fakeroottidak akan membantu di sini: itu berpura-pura kepemilikan file berbeda, tetapi tidak bisa memberi Anda izin yang tidak Anda miliki, seperti menelepon mount(2)ketika Anda tidak melakukan root.
Gilles 'SO- stop being evil'
@faif Mount benar - benar membutuhkan izin root. Konsekuensi potensial jika tidak akan sangat berbahaya.
Shadur
terkait: unix.stackexchange.com/questions/96625/…
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

Jawaban:

25

Anda tidak dapat me-mount apa pun yang entah bagaimana administrator belum memberi Anda izin untuk melakukan mount. Hanya root yang dapat memanggil mountsystem call. Alasan untuk ini adalah bahwa ada banyak cara untuk meningkatkan hak istimewa melalui pemasangan, seperti memasang sesuatu di lokasi sistem, membuat file tampak milik pengguna lain dan mengeksploitasi program yang bergantung pada kepemilikan file, membuat file setuid, atau mengeksploitasi bug dalam driver sistem file.

The mountperintah setuid root. Tapi itu hanya memungkinkan Anda me-mount hal-hal yang disebutkan di fstab.

The fusermountperintah setuid root. Itu hanya memungkinkan Anda untuk me-mount segala sesuatu melalui driver FUSE, dan membatasi kemampuan Anda untuk memberikan file dengan kepemilikan sewenang-wenang atau izin seperti itu (di bawah kebanyakan pengaturan, semua file pada mount FUSE milik Anda).

Taruhan terbaik Anda adalah menemukan sistem file FUSE yang mampu membaca gambar disk Anda. Untuk gambar ISO 9660, cobalah dukungan ISO 9660 fuseiso dan UMfuse (tersedia di bawah Debian sebagai fuseiso9660paket ).

Gilles 'SANGAT berhenti menjadi jahat'
sumber
+1 untuk menjelaskan bahwa sudo(walaupun bit SUID diset) hanya memungkinkan seseorang untuk memasang fstabentri. Dari sini dapat disimpulkan bahwa (a) bit SUID masuk akal, karena pengguna biasa dapat me-mount fstabentri (dan diizinkan untuk melakukan mountsyscall) dan (b) bahwa itu adalah mountpembatasan utilitas untuk hanya memungkinkan fstabentri untuk dipasang oleh non- pengguna root.
David
Jika Anda bekerja dengan gambar floppy disk, Anda juga dapat menggunakan mtools untuk hanya menulis data ke gambar. Lihat: stackoverflow.com/questions/11202706/…
Giles Bathgate
@ David, apakah ini sekarang berubah? Satu-satunya entri yang saya miliki di saya fstabadalah untuk rootfs dan boot. Untuk memasang drive USB saya melihat lsblkdan mountsesuai. Saya tidak punya masalah melakukan ini.
sherrellbc
16

The Debian Wiki menunjukkan beberapa cara untuk melakukan hal ini. Ini satu cara. (Ini membutuhkan udisks2paket.)

Pertama

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

/dev/loop0 akan digunakan untuk yang berikut ini.

Tetapi jika udisksctl loop-setupperintah telah kembali /dev/loop1, maka /dev/loop1akan digunakan untuk yang berikut.

Anda mungkin perlu menjalankan jika perangkat loopback (yang dibuat sebelumnya) tidak dipasang secara otomatis:

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

Anda dapat melihat file di disk

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

Anda dapat melepasnya setelah selesai

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

dan jika perlu:

$ udisksctl loop-delete -b /dev/loop0
Nick ODell
sumber
1
udevil adalah pilihan yang lebih mudah
Anwar
Ini bekerja di Ubuntu 16.04, tetapi bagaimana caranya? Tampaknya menggunakan perangkat loop yang saya harapkan sudohanya. setid atau shenanigans terkait ?
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
1
@CiroSantilli 新疆 改造 中心 六四 事件 法轮功 Saya tidak yakin. Kode sumber alat ada di sini . Tampaknya menggunakan DBus untuk berbicara dengan daemon, tapi saya tidak tahu DBus atau Glib dengan baik.
Nick ODell
1
Perhatikan bahwa -ropsi udisksctl loop-setupberarti read-only, yang tidak diminta OP, jadi jatuhkan untuk mendapatkan mount yang dapat ditulisi.
Pelle Nilsson
15

Anda dapat menggunakan guestmount modul FUSE untuk memasang beberapa jenis gambar disk. Itu bagian dari ekosistem guestfs dan tidak akan memerlukan izin root.

Lihatlah halaman manual untuk perincian lebih lanjut.

Contohnya

1. Untuk tamu Windows biasa yang memiliki sistem file utama di partisi pertama:

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

2. Untuk tamu Linux biasa yang memiliki sistem file / boot pada partisi pertama, dan sistem file root pada volume logis:

guestmount -a linux.img -m /dev/VG/LV -m /dev/sda1:/boot --ro /mnt
Matius
sumber
1
Yang menjengkelkan, menjalankan guestmount di Ubuntu sekarang memerlukan beberapa akses root untuk membaca gambar kernel: bugs.launchpad.net/ubuntu/+source/linux/+bug/759725
Clément
@ Clément Saya ingin memahami mengapa libguestfs memerlukan imej kernel untuk tugasnya ...
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
1
@CiroSantilli 新疆 改造 中心 六四 事件 法轮功 karena libguestfs menghindari root dengan memulai sistem Linux minimal di dalam mesin virtual qemu (siapa pun dapat memulai mesin virtual qemu tanpa menjadi root). Untuk mem-boot mesin itu, dibutuhkan beberapa kernel dan initrd.
josch
3

Cara yang mungkin dilakukan adalah dengan menambahkan /etc/fstabentri untuk ISO dengan parameter 'pengguna', seperti

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

Tetapi Anda biasanya memerlukan akses root untuk mengedit file ini, jadi itu tidak terlalu membantu.

Renan
sumber
2

Sebenarnya sangat mudah untuk memasang kurang lebih apa pun yang Anda inginkan sebagai pengguna normal tanpa hak akses root, asalkan entri yang tepat telah dibuat /etc/fstab.

Tentu saja, modifikasi /etc/fstabmembutuhkan hak akses root. Tetapi satu entri dapat digunakan dengan banyak fleksibilitas untuk (u) me-mount banyak file berbeda pada titik mount yang berbeda, tanpa mengedit lebih lanjut /etc/fstab.

Berikut adalah dua skrip Bash yang sangat pendek (5 baris + komentar) yang akan melakukan pekerjaan:

untuk pemasangan

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

dan untuk turun

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

Direktori /tmp/UFS/dibuat untuk mengisolasi tautan dan menghindari bentrokan. Tetapi symlink dapat berada di mana saja di ruang pengguna, selama mereka tetap di tempat yang sama (jalur yang sama). The /etc/fstabentri tidak pernah berubah baik.

PERINGATAN VITAL: Pemasangan dibatasi untuk alasan keamanan yang baik. Membuatnya lebih fleksibel dapat membuka pintu bagi perangkat lunak berbahaya. Saya bukan ahli keamanan dan saya akan merekomendasikan agar Anda membuka pintu tidak lebih dari yang diperlukan ... menggunakan opsi untuk membatasi apa yang dapat dilakukan dengan sistem file yang dapat dipasang. Jika kontributor yang berpengetahuan luas dapat berkomentar lebih lanjut tentang masalah keamanan, mungkin bermanfaat.

Berbagai opsi tersedia untuk membatasi penggunaan sistem file yang dipasang, seperti noexecyang mencegah eksekusi binari, atau nosuid, dan dengan demikian berkontribusi terhadap keamanan. Sebenarnya, opsi-opsi ini ditambahkan sebagai opsi default ketika opsi useratau usersdigunakan, yang tentu terjadi dalam apa yang kita lakukan di bawah ini. Berpikir dua kali sebelum Anda menimpa default ini. http://en.wikipedia.org/wiki/Fstab

Opsi lain dapat ditambahkan untuk perlindungan lebih lanjut. Misalnya, opsi owner dalam /etc/fstab entri akan memungkinkan pengguna hanya berurusan dengan file atau perangkat yang mereka miliki. Lihat man mount daftar opsi: http://linux.die.net/man/8/mount .

Penggunaan /etc/fstabentri ini juga dapat dibatasi melalui kepemilikan user.group dari direktori (atau direktori) yang berisi symlinks.

Penjelasan

Penjelasan ini ditulis sebelum saya menyadari bahwa saya dapat menyederhanakan banyak hal dengan dua skrip di atas. Saya tidak langsung memikirkan mereka sebagian karena saya punya masalah yang sedikit lebih rumit yang tidak dapat mereka selesaikan tanpa mesin tambahan. Jadi penjelasan saya mungkin sedikit lebih rumit dari yang seharusnya, tetapi saya tidak memiliki keberanian untuk menulis ulang semuanya dari awal.

Ide dasarnya adalah membuat entri /etc/fstabyang menyertakan opsi useratau usersagar pengguna dapat meminta mountuntuk melakukan pemasangan yang ditentukan dalam entri itu dengan memberikan argumen file yang akan dipasang atau titik mount untuk digunakan (tetapi tidak keduanya dalam pengalaman saya) .

Anda juga perlu entri yang tepat umount(yang merupakan masalah yang sedikit berbeda - lihat di bawah). Opsi userini biasanya lebih baik daripada userskarena membatasi izin untuk umountpengguna yang memasang sistem file, sementara itu usersakan memungkinkan itu untuk semua. Sayangnya opsi userini tidak selalu berfungsi, dan mungkin memerlukan beberapa langkah lain untuk dibuat berfungsi. Ini dibahas dalam Opsi "pengguna" berfungsi untuk mount, bukan untuk umount .

Pertama, Anda menambahkan /etc/fstabentri seperti:

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

dan gunakan /tmp/UFS/drivesebagai tautan simbolik (atau symlink) ke perangkat atau file apa pun yang ingin Anda pasang, katakan file yang berisi gambar sistem file ISO /home/johndoe/john-image-file.iso.

Anda juga mendefinisikan /tmp/UFS/mountpointsebagai symlink ke titik mount yang ingin Anda gunakan, katakanlah /mnt/iso.

Anda kemudian dapat melakukan mount john-image-file.isodengan perintah:

$ mount /tmp/UFS/drive

Ini sudah cukup di Mageia Linux saya, karena penggunaan perangkat loop sekarang telah dibuat tersirat, dan tidak lagi memerlukan penggunaan -o loopsecara eksplisit. Saya tidak tahu seberapa umum hari ini. Lihat Saat memasang, kapan saya harus menggunakan perangkat loop?

Pemasangan ini muncul dalam tabel dan perintah:

$ 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

Operasi pemasangan dapat berfungsi untuk file atau drive apa pun dan hanya perlu membuat tautan simbolis dari /tmp/UFS/driveke file itu atau ke perangkat untuk drive tersebut. Tentu saja, nama dan lokasi lain dapat dipilih untuk tautan simbolik, asalkan tidak pernah berubah.

Turun dari file bergantung pada cara yang sama pada penggunaan yang tepat dari tautan simbolik. Dalam hal perangkat normal yang terkait dengan beberapa drive harware, Anda cukup menggunakan tautan yang sama.

Namun, file yang berisi gambar sistem file dipasang melalui jenis khusus perangkat yang disebut perangkat loop, secara otomatis dialokasikan ketika Anda memasang file.

Untuk turun dari file, Anda harus merujuk ke perangkat loop, bukan file. Karenanya, Anda perlu /etc/fstabentri yang cocok dengan perangkat loop yang digunakan /etc/mtab, di sini /dev/loop0, dan titik pemasangan, di sini /mnt/iso.

Anda tidak dapat membuat entri seperti itu sebelumnya karena perangkat loop dapat bervariasi, karena dialokasikan secara dinamis. Perhatikan bahwa juga dimungkinkan untuk menggunakan perangkat loop tetap, tetapi tidak nyaman dengan cara lain. Lihat http://igurublog.wordpress.com/2011/01/22/how-to-allow-mounting-of-iso-files-by-a- Regular-user/ ( blog ini sebenarnya mengilhami balasan di sini ).

Namun, Anda dapat menemukan nama perangkat loop, di sini /dev/loop0, dengan menanyakan sistem, seperti yang kami lakukan di atas dalam beberapa cara berbeda. Kemudian /etc/fstabentri standar kami dapat dibuat untuk menunjuk ke perangkat loop kanan melalui symlink /tmp/UFS/drive, dan ke titik mount seperti yang dilakukan sebelumnya dengan /tmp/UFS/mountpoint. Ini dilakukan, file dapat diturunkan dengan salah satu dari perintah berikut (asalkan tidak ada ambiguitas dengan /etc/mtab, yang merupakan masalah yang berbeda):

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

Karena dua symlink hanya diperlukan ketika perintah dikeluarkan, mereka dapat diubah secara dinamis. Jadi /etc/fstabentri tunggal kami memungkinkan pemasangan sejumlah file, dan membuat umountnya dalam urutan apa pun, tanpa hak akses root.

Referensi lain:

babou
sumber
Ketika entri fstab menunjuk ke symlink, tidak bisakah mereka dieksploitasi untuk me-mount sesuatu tanpa root, hanya dengan membuat symlink? Secara tidak langsung, bukankah itu hanya meningkatkan mountperintah untuk setiap pengguna normal ?, dan masalah keamanan yang terkait dengannya? Koreksi saya jika saya salah.
Bharat G
Dan versi terbaru distro GNU / Linux (katakanlah debian jessie) tidak akan memberikan login gui ketika mendeteksi entri yang tidak valid di fstab. Ia kembali ke konsol sesi login jika deviceatau mountpointbagian dari fstab tidak menunjuk ke sebuah entri yang valid. Pengguna harus masuk melalui sesi konsol dan masuk startxuntuk secara eksplisit memulai manajer tampilan.
Bharat G
0

Paket libguestfs-tools-c memiliki perintah guestmount begitu

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

df akan menampilkan image.iso terpasang

df

untuk umount yang kita miliki:

guestunmount dvd
Sérgio
sumber