Làm thế nào để gắn một tập tin hình ảnh mà không cần sự cho phép root?


41

Tôi có thể gắn một hình ảnh hệ thống tập tin mà không cần sự cho phép root? Thông thường tôi sẽ làm:

mount -o loop DISK_IMAGE FOLDER

Không sử dụng sudo hoặc cài đặt suid trên mount, có cách nào phù hợp để làm điều này không?

Tôi biết tôi có thể sử dụng fusermountvới một số hình ảnh ISO, nhưng điều đó khá hạn chế, ngay cả đối với hình ảnh ISO, một số hình ảnh của tôi không thể được gắn, nhưng mountluôn hoạt động.


1
Nếu mountnhị phân của bạn không yêu cầu quyền SUID thì bạn sẽ có thể sử dụng fakeroot mà không gặp vấn đề gì.
sakisk

5
@faif fakerootsẽ không giúp đỡ ở đây: nó giả vờ quyền sở hữu tệp là khác nhau, nhưng nó không thể cung cấp cho bạn quyền mà bạn không có, chẳng hạn như gọi mount(2)khi bạn không root.
Gilles 'SO- ngừng trở nên xấu xa'

@faif Mount hoàn toàn yêu cầu quyền root. Hậu quả tiềm tàng nếu không sẽ là thảm họa.
Shadur

Câu trả lời:


25

Bạn không thể gắn kết bất cứ thứ gì mà quản trị viên không cho phép bạn gắn kết. Chỉ root mới có thể gọi cuộc gọi mounthệ thống. Lý do cho điều này là có nhiều cách để nâng cao các đặc quyền thông qua việc gắn kết, chẳng hạn như gắn một cái gì đó qua một vị trí hệ thống, làm cho các tệp dường như thuộc về một người dùng khác và khai thác một chương trình dựa trên quyền sở hữu tệp, tạo tệp setuid hoặc khai thác lỗi trong trình điều khiển hệ thống tập tin.

Các mountlệnh là setuid root. Nhưng nó chỉ cho phép bạn gắn kết những thứ được đề cập trong fstab.

Các fusermountlệnh là setuid root. Nó chỉ cho phép bạn gắn kết mọi thứ thông qua trình điều khiển FUSE và hạn chế khả năng của bạn để cung cấp các tệp có quyền sở hữu hoặc quyền tùy ý theo cách đó (trong hầu hết các thiết lập, tất cả các tệp trên ngàm FUSE đều thuộc về bạn).

Đặt cược tốt nhất của bạn là tìm một hệ thống tập tin FUSE có khả năng đọc hình ảnh đĩa của bạn. Đối với tiêu chuẩn ISO 9660 hình ảnh, hãy thử cả hai fuseiso9660 hỗ trợ UMfuse của ISO (có sẵn dưới Debian như fuseiso9660gói ).


+1 để giải thích rằng sudo(mặc dù nó có tập bit SUID) chỉ cho phép một fstabmục gắn kết các mục. Từ đó, (a) bit SUID có ý nghĩa, vì một người dùng thông thường có thể gắn fstabcác mục (và được phép thực hiện tòa nhà mount) và (b) rằng đó là mounthạn chế của tiện ích chỉ cho phép fstabcác mục được gắn bởi không phải người dùng root.
David

Nếu bạn đang làm việc với hình ảnh đĩa mềm, bạn cũng có thể sử dụng mtools để chỉ ghi dữ liệu vào hình ảnh. Xem: stackoverflow.com/questions/11202706/ Mạnh
Giles Bathgate

@David, điều này đã thay đổi? Các mục duy nhất tôi có trong tôi fstablà cho rootfs và boot. Để gắn ổ đĩa USB, tôi nhìn vào lsblkmounttheo đó. Tôi đã không có vấn đề làm điều này.
sherrellbc

16

Các Debian Wiki cho thấy một số cách để làm điều này. Đây là một cách. (Điều này đòi hỏi udisks2gói.)

Đầu tiên

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

/dev/loop0 sẽ được sử dụng cho sau đây.

Nhưng nếu udisksctl loop-setuplệnh đã trở lại /dev/loop1, thì /dev/loop1nó sẽ được sử dụng cho các mục sau.

Bạn có thể cần chạy nếu thiết bị loopback (được tạo trước đó) không được tự động gắn kết:

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

Bạn có thể xem các tập tin trên đĩa

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

Bạn có thể ngắt kết nối nó khi bạn hoàn thành

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

và nếu cần thiết:

$ udisksctl loop-delete -b /dev/loop0

1
udevil là lựa chọn thuận tiện hơn
Anwar

Nó hoạt động trên Ubuntu 16.04, nhưng bằng cách nào? Nó dường như chỉ sử dụng các thiết bị vòng lặp mà tôi mong đợi là sudoduy nhất. setid hoặc shenanigans liên quan ?
Ciro Santilli 心 心

1
@CiroSantilli 心 心 Tôi không chắc chắn. Mã nguồn của công cụ là đây . Có vẻ như sử dụng DBus để nói chuyện với một daemon, nhưng tôi không biết rõ về DBus hay Glib.
Nick ODell

1
Lưu ý rằng -rtùy chọn udisksctl loop-setupcó nghĩa là chỉ đọc, mà OP không yêu cầu, vì vậy hãy bỏ tùy chọn đó để có được một giá trị có thể ghi.
Pelle Nilsson

15

Bạn có thể sử dụng mô-đun khách FUSE để gắn kết một số loại hình ảnh đĩa. Đây là một phần của hệ sinh thái Guestfs và sẽ không yêu cầu quyền root.

Hãy xem trang người đàn ông để biết thêm chi tiết.

Ví dụ

1. Đối với một khách Windows điển hình có hệ thống tệp chính trên phân vùng đầu tiên:

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

2. Đối với một khách Linux điển hình có hệ thống tập tin / khởi động trên phân vùng đầu tiên và hệ thống tập tin gốc trên một khối hợp lý:

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

1
Thật khó chịu, khi chạy ứng dụng khách trên Ubuntu hiện cần một số quyền truy cập root để đọc ảnh hạt nhân: bug.launchpad.net/ubfox/+source/linux/+orms/759725
Clément

@ Clément Tôi muốn hiểu tại sao libguestfs cần hình ảnh hạt nhân để thực hiện công việc của nó ...
Ciro Santilli

1
@CiroSantilli 改造 心 心 法轮功 lib vì libguestfs tránh cần root bằng cách khởi động một hệ thống Linux tối thiểu bên trong máy ảo qemu (bất kỳ ai cũng có thể khởi động máy ảo qemu mà không cần root). Để khởi động máy đó, nó cần một số kernel và initrd.
josch

3

Cách có thể là thêm một /etc/fstabmục nhập cho ISO với tham số 'người dùng', như

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

Nhưng dù sao bạn thường cần quyền truy cập root để chỉnh sửa tệp này, vì vậy nó không hữu ích lắm.


2

Thực sự rất dễ dàng để gắn kết nhiều hơn hoặc ít hơn bất cứ thứ gì bạn muốn như một người dùng bình thường mà không có quyền root, miễn là mục đúng đã được tạo /etc/fstab.

Tất nhiên, sửa đổi để /etc/fstabyêu cầu quyền root. Nhưng một mục duy nhất có thể được sử dụng với tính linh hoạt để (u) gắn nhiều tệp khác nhau trên các điểm gắn khác nhau mà không cần chỉnh sửa thêm /etc/fstab.

Dưới đây là hai đoạn script Bash rất ngắn (5 dòng + bình luận) sẽ thực hiện công việc:

để gắn

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

và để tháo dỡ

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

Thư mục /tmp/UFS/được tạo để cô lập các liên kết và tránh xung đột. Nhưng các liên kết tượng trưng có thể ở bất cứ đâu trong không gian người dùng, miễn là chúng ở cùng một nơi (cùng một đường dẫn). Các /etc/fstabmục không bao giờ thay đổi.

CẢNH BÁO VITAL: Gắn kết bị hạn chế vì lý do bảo mật tốt. Làm cho nó linh hoạt hơn có thể mở ra cánh cửa cho phần mềm độc hại. Tôi không phải là chuyên gia bảo mật và tôi khuyên bạn nên mở cửa không quá yêu cầu hoàn toàn ... sử dụng các tùy chọn để hạn chế những gì có thể được thực hiện với các hệ thống tệp có thể được gắn kết. Nếu một người đóng góp có kiến ​​thức có thể bình luận thêm về các vấn đề bảo mật, nó có thể hữu ích.

Nhiều tùy chọn có sẵn để hạn chế việc sử dụng các hệ thống tệp được gắn kết, chẳng hạn như noexecngăn chặn việc thực thi nhị phân hoặc nosuiddo đó góp phần bảo mật. Trên thực tế, các tùy chọn này được thêm vào dưới dạng tùy chọn mặc định khi các tùy chọn userhoặc usersđược sử dụng, đó là điều cần thiết trong trường hợp chúng tôi làm dưới đây. Hãy suy nghĩ hai lần trước khi bạn ghi đè những mặc định này. http://en.wikipedia.org/wiki/Fstab

Các tùy chọn khác có thể được thêm vào để bảo vệ thêm. Ví dụ: tùy chọn owner trong /etc/fstab mục nhập sẽ cho phép người dùng chỉ xử lý các tệp hoặc thiết bị họ sở hữu. Xem man mount để biết danh sách các tùy chọn: http://linux.die.net/man/8/mount .

Việc sử dụng /etc/fstabmục này cũng có thể bị hạn chế thông qua quyền sở hữu user.group của thư mục (hoặc thư mục) có chứa các liên kết tượng trưng.

Giải trình

Lời giải thích này được viết trước khi tôi nhận ra rằng tôi có thể đơn giản hóa mọi thứ với hai kịch bản ở trên. Tôi đã không nghĩ về chúng ngay lập tức một phần bởi vì tôi có sẵn một vấn đề phức tạp hơn một chút mà chúng không giải quyết được nếu không có thêm máy móc. Do đó, lời giải thích của tôi có thể phức tạp hơn một chút so với bình thường, nhưng tôi không đủ can đảm để viết lại tất cả từ đầu.

Ý tưởng cơ bản là tạo các mục trong /etc/fstabđó bao gồm tùy chọn userhoặc usersđể người dùng có thể yêu cầu mountthực hiện việc gắn kết được chỉ định trong mục nhập đó bằng cách đưa ra làm đối số cho tệp được gắn hoặc điểm gắn kết để sử dụng (nhưng không phải cả trong trường hợp của tôi) .

Bạn cũng cần một mục thích hợp để umount(đó là một vấn đề hơi khác - xem bên dưới). Tùy chọn usernày thường tốt hơn usersvì nó giới hạn quyền đối umountvới người dùng đã gắn hệ thống tệp, trong khi userssẽ cho phép tất cả. Thật không may, tùy chọn userkhông phải lúc nào cũng hoạt động và có thể đòi hỏi một số bước khác để thực hiện. Điều này được thảo luận trong Tùy chọn "người dùng" làm việc cho mount, không phải cho umount .

Đầu tiên bạn thêm vào /etc/fstabmột mục, chẳng hạn như:

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

và sử dụng /tmp/UFS/drivenhư một liên kết tượng trưng (hoặc liên kết tượng trưng) đến bất kỳ thiết bị hoặc tệp nào bạn muốn gắn kết, giả sử một tệp có chứa hình ảnh của hệ thống tệp ISO /home/johndoe/john-image-file.iso.

Bạn cũng xác định /tmp/UFS/mountpointlà một liên kết tượng trưng đến điểm gắn kết mà bạn muốn sử dụng /mnt/iso.

Sau đó, bạn có thể gắn kết john-image-file.isovới lệnh:

$ mount /tmp/UFS/drive

Điều này là đủ trên Mageia Linux của tôi, vì việc sử dụng các thiết bị vòng lặp hiện đã được thực hiện ẩn và không còn yêu cầu sử dụng -o looprõ ràng. Tôi không biết ngày hôm nay như thế nào. Xem Khi lắp, khi nào tôi nên sử dụng thiết bị lặp?

Gắn kết này xuất hiện trong bảng và lệnh:

$ 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

Hoạt động gắn có thể hoạt động cho bất kỳ tệp hoặc ổ đĩa nào và chỉ yêu cầu tạo một liên kết tượng trưng từ /tmp/UFS/drivetệp đó hoặc đến thiết bị cho ổ đĩa. Tất nhiên, một tên và địa điểm khác có thể được chọn cho liên kết tượng trưng, ​​miễn là nó không bao giờ thay đổi.

Việc loại bỏ các tập tin dựa trên cùng một cách sử dụng các liên kết tượng trưng thích hợp. Trong trường hợp một thiết bị bình thường tương ứng với một số ổ đĩa harware, bạn chỉ cần sử dụng các liên kết tương tự.

Tuy nhiên, các tệp chứa hình ảnh của hệ thống tệp được gắn thông qua một loại thiết bị đặc biệt gọi là thiết bị lặp, được phân bổ tự động khi bạn gắn tệp.

Để tháo gỡ tệp, bạn cần tham khảo thiết bị vòng lặp, không phải tệp. Do đó, bạn cần /etc/fstabcó một mục khớp với cả thiết bị lặp được sử dụng tại /etc/mtabđây /dev/loop0và điểm gắn kết ở đây /mnt/iso.

Bạn không thể tạo trước một mục như vậy vì thiết bị lặp có thể thay đổi, vì chúng được phân bổ động. Lưu ý rằng cũng có thể sử dụng một thiết bị vòng lặp cố định, nhưng nó bất tiện theo những cách khác. Xem http://igurublog.wordpress.com/2011/01/22/how-to-allow-mounting-of-iso-files-by-a-THER-user/ ( blog này thực sự đã truyền cảm hứng cho câu trả lời ở đây ).

Tuy nhiên, bạn có thể tìm thấy tên của thiết bị lặp, ở đây /dev/loop0, bằng cách hỏi hệ thống, giống như chúng tôi đã làm ở trên theo nhiều cách khác nhau. Sau đó, /etc/fstabmục tiêu chuẩn của chúng tôi có thể được thực hiện để trỏ đến thiết bị vòng lặp bên phải thông qua liên kết tượng trưng /tmp/UFS/drivevà đến điểm gắn kết như đã thực hiện trước đó /tmp/UFS/mountpoint. Điều này được thực hiện, tệp có thể được gỡ bỏ bằng bất kỳ lệnh nào sau đây (miễn là không có sự mơ hồ với /etc/mtab, đây là một vấn đề khác):

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

Vì hai liên kết chỉ cần thiết khi các lệnh được ban hành, chúng có thể được thay đổi linh hoạt. Vì vậy, /etc/fstabmục nhập duy nhất của chúng tôi cho phép gắn bất kỳ số lượng tệp nào và sắp xếp chúng theo bất kỳ thứ tự nào mà không có quyền root.

Tài liệu tham khảo khác:


Khi các mục nhập fstab trỏ đến liên kết tượng trưng, ​​chúng không thể được khai thác để gắn kết bất cứ thứ gì mà không cần root, chỉ bằng cách tạo liên kết tượng trưng? Một cách gián tiếp, không phải nó chỉ nâng cao mountlệnh cho mọi người dùng bình thường sao?, Và vì vậy các vấn đề bảo mật liên quan đến nó? Sửa lỗi cho tôi nếu tôi sai.
Bharat G

Và các phiên bản gần đây của distro GNU / Linux (giả sử debian jessie) sẽ không cung cấp thông tin đăng nhập gui khi phát hiện mục nhập không hợp lệ trong fstab. Nó rơi trở lại phiên đăng nhập giao diện điều khiển nếu devicehoặc mountpointphần của fstab không trỏ đến một mục hợp lệ. Người dùng phải đăng nhập thông qua phiên giao diện điều khiển và nhập startxđể bắt đầu một trình quản lý hiển thị.
Bharat G

0

Gói libguestfs-tools-c có lệnh guestmount vì vậy

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

df sẽ hiển thị image.iso gắn

df

để vượt qua chúng ta có:

guestunmount dvd
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.