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

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

루트 권한 없이 파일 시스템 이미지를 마운트할 수 있나요? 보통 나는 이렇게 한다:

mount -o loop DISK_IMAGE FOLDER

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

fusermount사용할 수 있는 ISO 이미지가 있다는 것을 알고 있지만 이는 매우 제한적이며 ISO 이미지의 경우에도 내 이미지 중 일부는 설치되지 않지만 mount항상 작동합니다.

답변1

관리자가 설치 권한을 부여하지 않은 것은 설치할 수 없습니다. 루트만이 mount시스템 호출을 호출할 수 있습니다. 그 이유는 시스템 위치에 무언가를 마운트하거나, 파일을 다른 사용자에게 속한 것처럼 보이도록 하거나, 파일 소유권에 의존하는 프로그램을 악용하거나, setuid 파일을 생성하거나, 버그를 악용하는 등 마운트를 통해 권한을 상승시키는 방법이 많기 때문입니다. 파일 시스템 드라이버에서 진행 중입니다.

명령은 mountsetuid 루트입니다. 그러나 루트가 아닌 경우에는 fstab.

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

가장 좋은 방법은 하나를 찾는 것입니다FUSE 파일 시스템디스크 이미지를 읽을 수 있습니다. ISO 9660 이미지의 경우 다음도 시도해 보십시오.후세소그리고UMfuse의 ISO 9660 지원(데비안에서 사용 가능fuseiso9660).

답변2

이것데비안 위키이를 수행하는 여러 가지 방법이 표시됩니다. 이것은 한 가지 방법입니다. 이를 위해서는 udisks2패키지를 설치해야 합니다.

먼저 "루프 장치"를 만듭니다. 그러면 이미지 파일을 마운트할 수 있습니다.

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

이미지를 에 매핑합니다 /dev/loop0. 그러나 이전 명령이 /dev/loop1이를 반환한 경우 다음 명령을 모두 대체합니다 /dev/loop0./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
$ udisksctl loop-delete -b /dev/loop0

답변3

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

답변4

실제로 루트 권한이 없는 일반 사용자로서 /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보안이 향상됩니다. 실제로 이러한 옵션은 useroptions 또는 을 사용할 때 기본 옵션으로 추가 되는데 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있도록 하는 것입니다. 내 경험상).usersmount

또한 올바른 항목이 필요합니다 umount(이것은 약간 다른 문제입니다. 아래 참조). 이 옵션은 파일 시스템을 마운트하는 사용자의 권한을 user제한하고 모든 사람이 이를 사용할 수 있도록 허용하므로 선호되는 경우가 많습니다 . users안타깝게도 이 옵션이 항상 작동하는 것은 아니며 작동하려면 몇 가지 추가 단계가 필요할 수 있습니다. 이에 대해서는 다음에서 논의됩니다.umountusersuser옵션 "user"는 마운트 해제가 아닌 마운트에 적용됩니다..

/etc/fstab먼저 다음과 같은 항목을 추가합니다 .

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

/tmp/UFS/driveISO 파일 시스템 이미지가 포함된 파일과 같이 마운트하려는 장치나 파일에 대한 기호 링크(또는 기호 링크) 로 사용됩니다 /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항목을 사용하면 루트 권한 없이도 원하는 수의 파일을 설치하고 순서에 관계없이 제거할 수 있습니다.

기타 참고자료:

관련 정보