루트 권한없이 이미지 파일을 마운트하는 방법은 무엇입니까?


40

루트 권한없이 파일 시스템 이미지를 마운트 할 수 있습니까? 일반적으로 나는 할 것입니다 :

mount -o loop DISK_IMAGE FOLDER

sudo를 사용하거나 suid를 설정하지 않고 mount적절한 방법이 있습니까?

fusermount일부 ISO 이미지와 함께 사용할 수 있다는 것을 알고 있지만 ISO 이미지의 경우에도 일부 이미지를 마운트 할 수 없지만 mount항상 작동합니다.


1
귀하의 경우 mount바이너리 SUID 권한이 필요하지 않습니다 당신은 사용할 수 있어야 fakeroot 사용을 문제없이.
사키 스크

4
@faif fakeroot는 여기서 도움이되지 않습니다 : 파일 소유권이 다른 것처럼 보이지만 mount(2)루트가 아닌 경우 호출하는 것과 같이 가지고 있지 않은 권한을 부여 할 수는 없습니다.
Gilles 'SO- 악마 그만해'

@faif 마운트는 절대적으로 루트 권한이 필요합니다. 그렇지 않으면 잠재적 인 결과는 상당히 비참 할 것입니다.
Shadur

답변:


25

관리자가 마운트 권한을 부여하지 않은 것은 마운트 할 수 없습니다. root만이 mount시스템 호출을 호출 할 수 있습니다 . 그 이유는 시스템 위치에 무언가를 마운트하거나, 파일을 다른 사용자의 것으로 보이게하고, 파일 소유권에 의존하는 프로그램을 이용하거나, setuid 파일을 작성하거나, 버그를 사용하는 등 마운트를 통해 권한을 에스컬레이션하는 방법이 많이 있기 때문입니다. 파일 시스템 드라이버에서.

mount명령이 setuid 루트입니다. 그러나 그것은 오직 당신이 언급 한 것들을 마운트하게합니다 fstab.

fusermount명령이 setuid 루트입니다. FUSE 드라이버를 통해서만 물건을 마운트 할 수 있으며, 그 방법으로 파일에 임의의 소유권이나 권한을 제공하는 기능을 제한 할 수 있습니다 (대부분의 설정에서 FUSE 마운트의 모든 파일은 사용자 소유).

가장 좋은 방법은 디스크 이미지를 읽을 수있는 FUSE 파일 시스템 을 찾는 것 입니다. ISO 9660 이미지의 경우 fuseisoUMfuse의 ISO 9660 지원을 모두 사용해보십시오 (Debian에서 fuseiso9660패키지로 제공 ).


그 설명 +1은 sudo(는 SUID 비트가 설정되어 있음) 하나만 장착 할 수 있도록 fstab항목. 이것에 의해 (a) SUID 비트는 일반 사용자가 fstab엔트리 를 마운트 할 수 mount있고 (syscall 을 수행 할 수 있음 ), (b) 엔트리가 아닌 마운트 mount만 허용 하는 것이 유틸리티의 제한 이라는 의미가 fstab있습니다. 루트 사용자.
David

플로피 디스크 이미지로 작업하는 경우 mtools를 사용하여 이미지에 데이터를 쓸 수도 있습니다. 참조 : stackoverflow.com/questions/11202706/…
Giles Bathgate

@David, 이제 바뀌 었습니까? 내가 가지고있는 유일한 항목 fstab은 rootfs 및 boot에 대한 것입니다. 내가 볼 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

우분투 16.04에서 작동했지만 어떻게? 내가 기대할 수있는 루프 장치를 사용하는 것 같습니다 sudo. setsid 또는 관련 shenanigans ?
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

1
@CiroSantilli 新疆 改造 中心 六四 事件 法轮功 확실하지 않습니다. 이 도구의 소스 코드는 다음과 같습니다 . DBus를 사용하여 데몬과 대화하는 것 같지만 DBus 또는 Glib을 잘 모르겠습니다.
Nick ODell

1
참고 있는지 -r에 대한 옵션 udisksctl loop-setup수단이 읽기 전용, 영업 이익은 쓰기 가능한 마운트 얻을 그래서 드롭 요구하지 않았다.
펠 닐슨

15

FUSE 모듈 guestmount를 사용하여 여러 유형의 디스크 이미지를 마운트 할 수 있습니다. guestfs 에코 시스템의 일부이며 루트 권한이 필요하지 않습니다.

자세한 내용 은 매뉴얼 페이지 를 참조하십시오.

1. 첫 번째 파티션에 기본 파일 시스템이있는 일반적인 Windows 게스트의 경우 :

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

2. 첫 번째 파티션에 / boot 파일 시스템이 있고 논리 볼륨에 루트 파일 시스템이있는 일반적인 Linux 게스트의 경우 :

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

1
귀찮게도 우분투에서 guestmount를 실행하려면 커널 이미지를 읽으려면 루트 액세스 권한이 필요합니다. bugs.launchpad.net/ubuntu/+source/linux/+bug/759725
Clément

@ Clément libguestfs가 왜 커널 이미지를 필요로하는지 이해하고 싶습니다 ...
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

1
libguestfs는 qemu 가상 머신 내에서 최소한의 Linux 시스템을 시작하여 루트가 필요하지 않기 때문에 @CiroSantilli 新疆 改造 中心 六四 事件 法 root (누구든지 루트없이 qemu 가상 머신을 시작할 수 있음). 해당 머신을 부팅하려면 커널과 initrd가 필요합니다.
josch

3

가능한 방법 /etc/fstab은 'user'매개 변수를 사용하여 ISO에 대한 항목 을 추가하는 것입니다.

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

그러나이 파일을 편집하려면 일반적으로 루트 액세스 권한이 필요하므로 크게 도움이되지 않습니다.


2

올바른 항목이에서 생성 된 경우 루트 권한이없는 일반 사용자로 원하는대로 마운트하는 것이 매우 쉽습니다 /etc/fstab.

물론 /etc/fstab루트 권한 이 필요하도록 수정했습니다 . 그러나 단일 항목을 사용하면 더 이상의 편집없이 다른 마운트 지점에 여러 파일을 마운트 할 수있는 유연성이 /etc/fstab있습니다.

다음은 작업을 수행 할 매우 짧은 (5 줄 + 주석) Bash 스크립트입니다.

장착 용

#!/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/는 링크를 분리하고 충돌을 피하기 위해 작성됩니다. 그러나 심볼릭 링크가 동일한 위치에있는 한 사용자 공간의 어느 곳에 나있을 수 있습니다 (같은 경로). /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 소유권을 통해 제한 될 수도 있습니다.

설명

이 설명은 위의 두 스크립트로 단순화 할 수 있다는 것을 깨닫기 전에 작성되었습니다. 나는 그들이 여분의 기계없이 해결할 수없는 약간 더 복잡한 문제를 가지고 있기 때문에 그것들을 즉시 생각하지 않았습니다. 따라서 내 설명은 생각보다 조금 더 복잡 할 수 있지만 처음부터 다시 작성해야 할 용기는 없습니다.

기본 아이디어는 /etc/fstab옵션이 포함 된 항목을 작성 user하거나 users사용자 mount가 마운트 할 파일이나 사용할 마운트 포인트를 인수로 지정하여 해당 항목에 지정된 마운트를 수행 하도록 요청할 수 있습니다 (그러나 두 가지 모두는 아닙니다) .

또한 적절한 항목이 필요합니다 umount(약간의 다른 문제입니다-아래 참조). 이 옵션 user은 일반적으로 파일 시스템을 마운트 한 사용자에 users대한 권한을 제한 하는 것이 아니라 모든 것을 허용 하므로 옵션 보다 낫습니다 . 불행히도이 옵션 이 항상 작동하는 것은 아니며 작동하기 위해 수행해야 할 다른 단계가 필요할 수 있습니다. 이것은 umount가 아니라 mount에 대한 "user"옵션 작업 에서 설명 합니다.umountusersuser

먼저 다음 /etc/fstab과 같은 항목에 추가하십시오 .

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

사용 /tmp/UFS/drive어떤 장치 또는 마운트하고자하는 파일에 대한 심볼릭 링크 (또는 심볼릭 링크) 등은 ISO 파일 시스템의 이미지를 포함하는 파일을 말한다 /home/johndoe/john-image-file.iso.

또한 사용 /tmp/UFS/mountpoint하려는 마운트 지점에 대한 심볼릭 링크를 정의 하십시오 (예 :) /mnt/iso.

그런 다음 다음 john-image-file.iso명령으로 마운트 할 수 있습니다 .

$ mount /tmp/UFS/drive

루프 장치 사용이 이제 암시 적으로 만들어 졌으므로 더 이상 -o loop명시 적으로 사용할 필요가 없기 때문에 Mageia Linux에서 충분합니다 . 나는 그것이 오늘날 얼마나 일반적인지 모른다. 장착시 루프 장치를 언제 사용해야합니까?를 참조하십시오 .

이 장착은 테이블과 명령에 나타납니다.

$ 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심볼릭 링크를 통해 오른쪽 루프 장치를 /tmp/UFS/drive가리키고 이전에 수행 한 마운트 지점을 표준 항목으로 지정할 수 있습니다 /tmp/UFS/mountpoint. 이렇게하면 다음 명령 중 하나를 사용하여 파일이 마운트 해제 될 수 있습니다 (와 다른 모호함 /etc/mtab이있는 경우).

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

두 개의 심볼릭 링크는 명령이 실행될 때만 필요하므로 동적으로 변경할 수 있습니다. 따라서 단일 /etc/fstab항목으로 루트 권한없이 파일을 원하는 수만큼 마운트하고 순서에 상관없이 마운트 해제 할 수 있습니다.

다른 참고 문헌 :


fstab 항목이 심볼릭 링크를 가리킬 때 심볼릭 링크 만 만들어 루트 없이는 마운트 할 수 없습니까? 간접적으로, 그것은 mount모든 일반 사용자를위한 명령을 높이는 것 입니까? 그리고 이와 관련된 보안 문제입니까? 틀린 점 있으면 지적 해주세요.
Bharat G

그리고 최신 버전의 GNU / Linux 배포판 (예 : debian jessie)은 fstab에서 유효하지 않은 항목을 감지하면 gui 로그인을 제공하지 않습니다. fstab device또는 mountpoint섹션이 유효한 항목을 가리 키지 않으면 콘솔 로그인 세션으로 돌아갑니다 . 사용자는 콘솔 세션을 통해 로그인 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.