วิธีการเมานท์ไฟล์ภาพโดยไม่ได้รับอนุญาตรูท?


41

ฉันสามารถเมานต์อิมเมจระบบไฟล์โดยไม่ได้รับอนุญาตรูทได้หรือไม่? โดยปกติฉันจะทำ:

mount -o loop DISK_IMAGE FOLDER

โดยไม่ใช้ sudo หรือตั้ง suid บนmountมีวิธีการที่เหมาะสมในการทำเช่นนี้?

ฉันรู้ว่าฉันสามารถใช้fusermountกับภาพ ISO บางภาพได้ แต่มันค่อนข้าง จำกัด แม้สำหรับภาพ ISO ภาพบางภาพของฉันไม่สามารถติดตั้งได้ แต่ใช้mountงานได้เสมอ


1
หากmountไบนารีของคุณไม่ต้องการการอนุญาตแบบ SUID คุณควรจะสามารถใช้fakeroot ได้โดยไม่มีปัญหา
sakisk

5
@faif fakerootไม่ได้ช่วยอะไรที่นี่: มันอ้างว่าการเป็นเจ้าของไฟล์นั้นแตกต่างกัน แต่ไม่สามารถให้สิทธิ์ที่คุณไม่มีเช่นการโทรmount(2)เมื่อคุณไม่ได้รูท
Gilles 'หยุดชั่วร้าย'

@faif Mount ต้องมีสิทธิ์การใช้งานรูทอย่างแน่นอน ผลที่อาจเกิดขึ้นไม่เช่นนั้นอาจเป็นหายนะได้
Shadur

คำตอบ:


25

คุณไม่สามารถเมานต์อะไรก็ได้ที่ผู้ดูแลระบบไม่ได้อนุญาตให้คุณเมานต์ เฉพาะ root เท่านั้นที่สามารถเรียกการเรียกของmountระบบ เหตุผลก็คือมีหลายวิธีในการเพิ่มสิทธิ์ผ่านการติดตั้งเช่นการติดตั้งบางอย่างบนตำแหน่งระบบทำให้ไฟล์ปรากฏเป็นของผู้ใช้รายอื่นและใช้ประโยชน์จากโปรแกรมที่อาศัยความเป็นเจ้าของไฟล์การสร้างไฟล์ setuid หรือการใช้ประโยชน์จากข้อบกพร่อง ในไดรเวอร์ระบบไฟล์

mountคำสั่งเป็นราก setuid แต่จะอนุญาตให้คุณเมานต์สิ่งที่กล่าวถึงfstabเท่านั้น

fusermountคำสั่งเป็นราก setuid มันช่วยให้คุณสามารถเมานต์สิ่งต่าง ๆ ผ่านไดรเวอร์ FUSE และจำกัดความสามารถของคุณในการให้สิทธิ์การใช้งานไฟล์หรือสิทธิ์แบบนั้น (ภายใต้การตั้งค่าส่วนใหญ่ไฟล์ทั้งหมดบนเมานต์ FUSE จะเป็นของคุณ)

ทางออกที่ดีที่สุดของคุณคือการหาระบบไฟล์ FUSEที่สามารถอ่านอิมเมจดิสก์ของคุณได้ มาตรฐาน ISO 9660 ภาพลองทั้งfuseisoและUMfuse ของ ISO 9660 การสนับสนุน (สามารถใช้ได้ภายใต้ Debian เป็นfuseiso9660แพคเกจ )


+1 สำหรับการอธิบายว่าsudo(แม้ว่าจะมีชุดบิต SUID) อนุญาตให้หนึ่งfstabรายการที่จะเมานต์ จากนี้จะเป็นไปตามนั้น (a) บิต SUID เหมาะสมตามที่ผู้ใช้ทั่วไปสามารถเมานท์fstabรายการ (และได้รับอนุญาตให้ดำเนินการmountsyscall) และ (b) ว่าเป็นmountข้อ จำกัด ของยูทิลิตี้เพื่ออนุญาตให้fstabติดตั้งรายการโดย ผู้ใช้รูท
David

หากคุณทำงานกับอิมเมจฟลอปปีดิสก์คุณสามารถใช้ mtools เพื่อเขียนข้อมูลลงในภาพ ดู: stackoverflow.com/questions/11202706/…
Giles Bathgate

@ David ตอนนี้มีการเปลี่ยนแปลงหรือไม่ รายการเดียวที่ฉันมีในของฉันfstabสำหรับ rootfs และการบูต ในการติดตั้งไดรฟ์ USB ฉันดูlsblkและmountตามลำดับ ฉันไม่ได้มีปัญหาในการทำเช่นนี้
sherrellbc

16

เดวิกิพีเดียแสดงให้เห็นหลายวิธีในการทำเช่นนี้ นี่คือวิธีหนึ่ง (ต้องใช้udisks2แพ็คเกจนี้)

เป็นครั้งแรก

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

/dev/loop0 จะถูกใช้สำหรับสิ่งต่อไปนี้

แต่ถ้าudisksctl loop-setupคำสั่งได้กลับมา/dev/loop1แล้ว /dev/loop1จะได้รับการใช้สำหรับการดังต่อไปนี้

คุณอาจจำเป็นต้องเรียกใช้หากอุปกรณ์ลูปแบ็ค (สร้างไว้ก่อนหน้านี้) ไม่ได้ถูกเมาท์โดยอัตโนมัติ:

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

คุณสามารถดูไฟล์บนดิสก์

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

คุณสามารถถอนติดตั้งเมื่อเสร็จแล้ว

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

และถ้าจำเป็น:

$ udisksctl loop-delete -b /dev/loop0

1
udevil เป็นตัวเลือกที่สะดวกกว่า
Anwar

มันทำงานบน Ubuntu 16.04 แต่อย่างไร ดูเหมือนว่าจะใช้อุปกรณ์วนรอบซึ่งฉันคาดว่าจะเป็นsudoเพียง เหอหนานหรือที่เกี่ยวข้อง
Ciro Santilli 新疆改造中心法轮功六四事件

1
@CiroSantilli 新疆改造中心六四事件法轮功ฉันไม่แน่ใจ รหัสแหล่งที่มาของเครื่องมือคือที่นี่ ดูเหมือนว่าจะใช้ DBus เพื่อพูดคุยกับภูต แต่ฉันไม่รู้จัก DBus หรือ Glib ที่ดี
Nick ODell

1
โปรดทราบว่า-rตัวเลือกที่จะudisksctl loop-setupหมายถึงอ่านอย่างเดียวซึ่ง OP ไม่ได้ขอดังนั้นให้วางลงเพื่อให้สามารถเมาต์แบบเขียนได้
Pelle Nilsson

15

คุณสามารถใช้โมดูล FUSE guestmount เพื่อเมานต์อิมเมจดิสก์หลายประเภท มันเป็นส่วนหนึ่งของระบบนิเวศ guestfs และไม่ต้องใช้สิทธิ์รูท

ดูที่หน้า manสำหรับรายละเอียดเพิ่มเติม

ตัวอย่าง

1.สำหรับแขกทั่วไปของ Windows ที่มีระบบไฟล์หลักในพาร์ติชันแรก:

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

2.สำหรับแขก Linux ทั่วไปที่มีระบบไฟล์ / boot ในพาร์ติชันแรกและระบบไฟล์รูทบนโลจิคัลวอลุ่ม:

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

1
น่ารำคาญการเรียกใช้ guestmount บน Ubuntu ตอนนี้ต้องใช้การเข้าถึงรูทเพื่ออ่านภาพเคอร์เนล: bugs.launchpad.net/ubuntu/+source/linux/+bug/759725
Clément

@ Clémentฉันต้องการที่จะเข้าใจว่าทำไม libguestfs ต้องการเคอร์เนลอิมเมจถึงงานของมัน ...
Ciro Santilli 新疆改造中心中心法轮功六四事件

1
@CiroSantilli 新疆改造中心六四事件法轮功เนื่องจาก libguestfs หลีกเลี่ยงความต้องการรูทด้วยการเริ่มระบบลีนุกซ์ขั้นต่ำภายในเครื่องเสมือน qemu (ทุกคนสามารถเริ่มเครื่องเสมือน qemu โดยไม่ต้องรูต) ในการบูตเครื่องนั้นมันต้องใช้เคอร์เนลและ initrd
josch

3

วิธีที่เป็นไปได้คือการเพิ่ม/etc/fstabรายการสำหรับ ISO ด้วยพารามิเตอร์ 'user' เช่น

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

แต่โดยปกติคุณจะต้องมีการเข้าถึงรูทเพื่อแก้ไขไฟล์นี้ดังนั้นจึงไม่ค่อยมีประโยชน์


2

จริงๆแล้วมันเป็นเรื่องง่ายมากที่จะเมานต์มากกว่าหรือน้อยกว่าสิ่งที่คุณต้องการในฐานะผู้ใช้ปกติโดยไม่มีสิทธิ์รูทหากมีการสร้างรายการที่ถูก/etc/fstabต้อง

แน่นอนว่าการแก้ไขเพื่อ/etc/fstabต้องการสิทธิ์พิเศษ แต่รายการเดียวสามารถนำมาใช้มีความยืดหยุ่นมากที่จะ (U) /etc/fstabติดตั้งไฟล์ที่แตกต่างกันจำนวนมากในที่แตกต่างกันจุดเมาโดยไม่ต้องแก้ไขเพิ่มเติมใด

ต่อไปนี้เป็นสองสั้นมาก (5 บรรทัด + ความคิดเห็น) สคริปต์ทุบตีที่จะทำงาน:

สำหรับการติดตั้ง

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

และลงจากหลังม้า

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

ไดเรกทอรี/tmp/UFS/ถูกสร้างขึ้นเพื่อแยกลิงก์และหลีกเลี่ยงการปะทะกัน แต่ symlink สามารถอยู่ที่ใดก็ได้ในพื้นที่ผู้ใช้ตราบใดที่พวกเขาอยู่ในสถานที่เดียวกัน (เส้นทางเดียวกัน) /etc/fstabรายการไม่เคยเปลี่ยนแปลงอย่างใดอย่างหนึ่ง

คำเตือนสำคัญ: การ ติดตั้งถูก จำกัด ด้วยเหตุผลด้านความปลอดภัยที่ดี การทำให้มีความยืดหยุ่นมากขึ้นอาจเปิดประตูสำหรับซอฟต์แวร์ที่เป็นอันตราย ฉันไม่ใช่ผู้เชี่ยวชาญด้านความปลอดภัยและฉันขอแนะนำให้คุณเปิดประตูไม่เกินความจำเป็นอย่างแน่นอน ... โดยใช้ตัวเลือกเพื่อ จำกัด สิ่งที่สามารถทำได้กับระบบไฟล์ที่สามารถติดตั้งได้ หากผู้มีความรู้สามารถแสดงความคิดเห็นเพิ่มเติมเกี่ยวกับปัญหาด้านความปลอดภัยอาจเป็นประโยชน์

ตัวเลือกต่าง ๆ พร้อมใช้งานเพื่อ จำกัด การใช้ระบบไฟล์ที่ถูกเมาท์เช่นnoexecซึ่งป้องกันการเรียกใช้ไบนารีหรือnosuidดังนั้นจึงนำไปสู่ความปลอดภัย ที่จริงแล้วตัวเลือกเหล่านี้จะถูกเพิ่มเป็นตัวเลือกเริ่มต้นเมื่อมีการใช้ตัวเลือกuserหรือusersซึ่งเป็นสิ่งจำเป็นในกรณีที่เราทำด้านล่าง คิดสองครั้งก่อนที่คุณจะแทนที่ค่าเริ่มต้นเหล่านี้ http://en.wikipedia.org/wiki/Fstab

สามารถเพิ่มตัวเลือกอื่น ๆ เพื่อการป้องกันเพิ่มเติม ตัวอย่างเช่นตัวเลือก owner ใน /etc/fstab รายการจะช่วยให้ผู้ใช้จัดการกับไฟล์หรืออุปกรณ์ที่พวกเขาเป็นเจ้าของเท่านั้น ดู man mount รายชื่อตัวเลือก: http://linux.die.net/man/8/mount

การใช้งานของ/etc/fstabรายการนี้สามารถถูก จำกัด ผ่านความเป็นเจ้าของ user.group ของไดเรกทอรี (หรือไดเรกทอรี) ที่มี symlink

คำอธิบาย

คำอธิบายนี้เขียนขึ้นก่อนที่ฉันจะรู้ว่าฉันสามารถทำให้สิ่งต่าง ๆ ง่ายขึ้นสำหรับสคริปต์ทั้งสองด้านบน ฉันไม่ได้คิดถึงพวกเขาทันทีเพราะฉันมีปัญหาที่ซับซ้อนกว่าเล็กน้อยซึ่งพวกเขาไม่สามารถแก้ปัญหาได้หากไม่มีเครื่องจักรพิเศษ ดังนั้นคำอธิบายของฉันอาจจะค่อนข้างซับซ้อนกว่าที่ควร แต่ฉันไม่มีความกล้าที่จะเขียนใหม่ทั้งหมดตั้งแต่ต้น

แนวคิดพื้นฐานคือการสร้างรายการใน/etc/fstabที่มีตัวเลือกuserหรือusersเพื่อให้ผู้ใช้สามารถขอmountให้ทำการติดตั้งที่ระบุในรายการนั้นโดยให้อาร์กิวเมนต์ไฟล์ที่จะติดตั้งหรือจุดเมานท์ที่จะใช้ (แต่ไม่ทั้งสองในexpérienceของฉัน) .

คุณต้องป้อนข้อมูลให้ถูกต้องด้วยumount(ซึ่งเป็นปัญหาที่แตกต่างออกไปเล็กน้อย - ดูด้านล่าง) ตัวเลือกuserมักจะดีกว่าusersเนื่องจากมันจะ จำกัด การอนุญาตให้umountกับผู้ใช้ที่เมานต์ระบบไฟล์ในขณะที่usersจะอนุญาตให้ทุกคน น่าเสียดายที่ตัวเลือกuserนั้นใช้ไม่ได้เสมอไปและอาจนำไปสู่ขั้นตอนอื่น ๆ ที่ต้องใช้ในการทำงาน สิ่งนี้ถูกกล่าวถึงในตัวเลือก "ผู้ใช้" ใช้สำหรับเมาท์ไม่ใช่สำหรับการต่อเชื่อม

ก่อนอื่นคุณเพิ่มลงใน/etc/fstabรายการเช่น:

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

และการใช้/tmp/UFS/driveเป็นสัญลักษณ์การเชื่อมโยง (หรือ symlink) /home/johndoe/john-image-file.isoกับสิ่งที่อุปกรณ์หรือไฟล์ที่คุณต้องการที่จะติดพูดไฟล์ที่มีภาพของระบบไฟล์

นอกจากนี้คุณยังกำหนด/tmp/UFS/mountpointเป็น symlink /mnt/isoไปยังจุดที่คุณต้องการที่จะใช้ติดการพูด

จากนั้นคุณสามารถเมานท์john-image-file.isoด้วยคำสั่ง:

$ mount /tmp/UFS/drive

นี่เพียงพอสำหรับ Mageia Linux ของฉันเนื่องจากการใช้อุปกรณ์วนรอบได้ถูกสร้างขึ้นโดยปริยายและไม่จำเป็นต้องใช้-o loopอย่างชัดเจนอีกต่อไป ฉันไม่ทราบว่าทั่วไปว่าวันนี้ ดู เมื่อติดตั้งฉันควรใช้อุปกรณ์ลูปเมื่อใด

การติดตั้งนี้จะปรากฏในตารางและคำสั่ง:

$ 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

การดำเนินการติดตั้งสามารถทำงานกับไฟล์หรือไดรฟ์ใด ๆ และต้องการเพียงการสร้างลิงก์สัญลักษณ์จาก/tmp/UFS/driveไฟล์นั้นหรือไปยังอุปกรณ์สำหรับไดรฟ์ แน่นอนว่าสามารถเลือกชื่อและที่ตั้งอื่นสำหรับลิงก์สัญลักษณ์ตราบใดที่ไม่มีการเปลี่ยนแปลง

การแยกไฟล์อาศัยในลักษณะเดียวกันกับการใช้ลิงก์สัญลักษณ์อย่างเหมาะสม ในกรณีของอุปกรณ์ปกติที่สอดคล้องกับไดรฟ์ฮาร์แวร์คุณเพียงแค่ใช้ลิงก์เดียวกัน

อย่างไรก็ตามไฟล์ที่มีอิมเมจของระบบไฟล์จะถูกเมาท์ผ่านอุปกรณ์ชนิดพิเศษที่เรียกว่าอุปกรณ์ลูปซึ่งจะถูกจัดสรรโดยอัตโนมัติเมื่อคุณเมาท์ไฟล์

ในการยกเลิกการต่อเชื่อมไฟล์คุณต้องอ้างถึงอุปกรณ์ลูปไม่ใช่ไฟล์ ดังนั้นที่คุณต้องการใน/etc/fstabรายการที่ตรงกับทั้งอุปกรณ์ห่วงที่ใช้ใน/etc/mtabที่นี่และจุดติดตั้งที่นี่/dev/loop0 /mnt/iso

คุณไม่สามารถสร้างรายการดังกล่าวล่วงหน้าเนื่องจากอุปกรณ์วนรอบอาจแตกต่างกันไปเนื่องจากมีการจัดสรรแบบไดนามิก โปรดทราบว่ามันเป็นไปได้ที่จะใช้อุปกรณ์วงคงที่ แต่ไม่สะดวกในวิธีอื่น ดู http://igurublog.wordpress.com/2011/01/22/how-to-allow-mounting-of-iso-files-by-a-regular-user// ( บล็อกนี้เป็นแรงบันดาลใจให้กับคำตอบจริงๆที่นี่ )

อย่างไรก็ตามคุณสามารถค้นหาชื่อของอุปกรณ์ลูปได้ที่นี่/dev/loop0โดยขอให้ระบบเหมือนกับที่เราทำข้างต้นในหลายวิธี แล้วมาตรฐานของเรา/etc/fstabรายการสามารถทำเพื่อชี้ไปที่อุปกรณ์ห่วงขวาผ่าน symlink และไปยังจุดที่ติดเหมือนที่ดำเนินการก่อนหน้านี้ด้วย/tmp/UFS/drive /tmp/UFS/mountpointสิ่งนี้ทำไฟล์อาจถูก dismounted ด้วยคำสั่งใด ๆ ต่อไปนี้ (หากไม่มีความกำกวม/etc/mtabซึ่งเป็นปัญหาที่แตกต่างกัน):

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

เนื่องจากจำเป็นต้องใช้ symlink สองชุดเมื่อมีการใช้คำสั่งเท่านั้นจึงสามารถเปลี่ยนได้แบบไดนามิก ดังนั้น/etc/fstabรายการเดียวของเราอนุญาตให้ติดตั้งไฟล์จำนวนเท่าใดก็ได้และขยายในลำดับใด ๆ โดยไม่ต้องใช้สิทธิ์รูท

การอ้างอิงอื่น ๆ :


เมื่อรายการ fstab ชี้ไปที่ symlinks จะไม่ถูกใช้เพื่อเมานต์อะไรโดยไม่มีรูทโดยเพียงแค่สร้าง symlink? ทางอ้อมมันเป็นเพียงการยกระดับmountคำสั่งสำหรับผู้ใช้ปกติทุกคนใช่หรือไม่และปัญหาด้านความปลอดภัยเกี่ยวข้องกับมันหรือไม่ ช่วยแก้ให้ด้วยนะถ้าฉันผิด.
Bharat G

และดิสทริบิวชันรุ่นล่าสุดของ GNU / Linux (พูดเดเบียนเจสซี) จะไม่ให้ข้อมูลเข้าสู่ระบบ gui เมื่อตรวจพบรายการที่ไม่ถูกต้องใน fstab มันกลับไปที่เซสชันการเข้าสู่ระบบคอนโซลหากส่วนdeviceหรือmountpointของ fstab ไม่ได้ชี้ไปที่รายการที่ถูกต้อง ผู้ใช้ต้องเข้าสู่ระบบผ่านเซสชันของคอนโซลและเข้าสู่startxเพื่อเริ่มตัวจัดการการแสดงผลอย่างชัดเจน
Bharat G

0

แพคเกจ libguestfs-tools-c มีคำสั่ง guestmount

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

df จะแสดง image.iso ที่เมาท์

df

เพื่อติดตั้งเรามี:

guestunmount dvd
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.