수퍼 유저가 아닌 사용자가 파일 시스템을 마운트하는 방법


47

특정 사용자 (예 : 그룹의 구성원)가 Linux에서 수퍼 유저 권한없이 파일 시스템 을 마운트 할 수 있습니까?

또 다른 질문은 "파일 시스템을 마운트하여 사용자가 시스템을 손상시킬 수있는 방법은 무엇입니까?"


아마gvfs-mount-d /dev/sdX
KrisWebDev

답변:


44

몇 가지 접근 방식이 있으며, 그중 일부는 대부분 안전하고 다른 방법은 전혀 없습니다.

안전하지 않은 방법

mount예를 들어 sudo를 통해 모든 사용을 실행하십시오 . 그들에게 뿌리를 줄 수도 있습니다. 그건 같은거야. 사용자는 suid 루트 복사본의 bash실행 으로 파일 시스템을 마운트 할 수 있습니다. 실행은 루트를 즉시 제공합니다 ( mount실행 된 사실을 넘어서는 로깅없이 ).

또한, 사용자의 상단에 자신의 파일 시스템을 마운트 할 수 /etc의 그 / 그녀의 자신의 복사본을 포함 /etc/shadow하거나 /etc/sudoers, 다음 중 하나에 루트를 얻을 su또는 sudo. 또는이 mount --bind두 파일 중 하나에 바인드 마운트 ( ) 될 수도 있습니다. 또는에 새 파일이 /etc/sudoers.d있습니다.

유사한 공격이 /etc/pam.d다른 곳에서 철수 될 수 있습니다 .

파일 시스템은 장치에 -o loop있을 필요는 없으며 사용자가 소유 한 (따라서 수정할 수있는) 파일을 마운트합니다.

가장 안전한 방법 : udisk 또는 이와 유사한

다양한 데스크탑 환경은 실제로 사용자가 이동식 미디어를 마운트 할 수 있도록 이에 대한 솔루션을 이미 구축했습니다. 서브 디렉토리 /media에만 마운트하고 커널 옵션을 통해 set-user / group-id 지원을 끄면 작동합니다. 여기에 옵션이 있습니다 udisks, udisks2, pmount, usbmount,

필요한 경우 비슷한 작업을 수행하기 위해 자체 스크립트를 작성하고 sudo를 통해이를 호출 할 수 있지만 루트 악용을 남기지 않도록이 스크립트를 작성하는 데 신중해야합니다. 사용자가 sudo를 기억하지 않게하려면 스크립트에서 다음과 같이 할 수 있습니다.

#!/bin/bash
if [ $UID -ne 0 ]; then       # or `id -u`
    exec sudo -- "$0" "$@"
fi

# rest of script goes here 

언젠가 안전 할 것 : 사용자 네임 스페이스

Linux 네임 스페이스는 매우 가벼운 가상화 형태 (컨테이너,보다 구체적)입니다. 특히, 사용자 네임 스페이스를 사용하면 시스템의 모든 사용자는 자신이 루트 인 환경을 만들 수 있습니다. 이를 통해 가상 파일 시스템 몇 개를 제외하고 명시 적으로 차단 된 것을 제외하고 파일 시스템을 마운트 할 수 있습니다. 결국 FUSE 파일 시스템이 허용 될 수 있지만 가장 최근에 찾은 패치 는 블록 장치를 다루지 않으며 sshfs와 같은 것만 포함합니다.

또한 많은 배포판 커널은 (보안상의 이유로) 권한이없는 사용자가 사용자 네임 스페이스를 사용할 수 없도록 기본 설정되어 있습니다. 예를 들어 데비안 있는 kernel.unprivileged_userns_clone기본값으로 0 다른 배포판 그래도 종종 약간 다른 이름, 유사한 설정이 있는지 확인하십시오.

사용자 네임 스페이스에 대해 내가 아는 가장 좋은 문서는 LWN 기사 네임 스페이스 (5 부 : 사용자 네임 스페이스) 입니다.

지금은 udisks2를 사용하겠습니다.


답변 주셔서 감사합니다! BTW, 그룹의 사용자가 mount루트와 같은 파일 시스템을 마운트 할 수 있게하는 것이 안전하다고 생각 하십니까? 연결 한 네임 스페이스 문서를 읽고 적어도 실습으로이 마운트 그룹을 구현하려고합니다.

@gkya 첫 번째 섹션에서 (a) nosuid [및 nodev]를 강요하지 않고 파일 시스템을 마운트 할 수 있음을 분명히하기를 바랍니다. 또는 (b) 임의의 장소에서 기본적으로 뿌리를 내린다. 다른 사람에게 임의의 mount명령 을 실행할 수있는 권한을 부여하면 루트를 제공하는 것과 같습니다.
derobert

@gkya의 "각각의 파티션이 많은 이동식 드라이브"는 또 다른 답변에 대한 의견을 제시합니다. "udisk 또는 이와 유사한"접근 방식을 원한다고 생각합니다.
derobert

1
@derobert 사용자 네임 스페이스에 대해 이야기 한 이후 Bell Labs (동일한 사람들이 만든 UNIX의 후속) 인 Plan 9를 확인하고 싶을 수 있습니다. 파일 트리를 프로세스 별 네임 스페이스로 모델링하고 루트와 같은 것은 없습니다. 매혹적인 물건.
strugee

1
@ malan 좋아, 나는 그것을 업데이트했다. 어쨌든, 나는 이것을 위해 사용자 네임 스페이스를 사용하는 것이 앞으로 더 나아질 것으로 생각합니다.
derobert

16

할 수는 있지만 /etc/fstab마운트하려는 파일 시스템 에 해당하는 항목을 수정 user하여이 항목에 플래그 를 추가해야합니다 . 권한이없는 사용자는이를 마운트 할 수 있습니다.

자세한 내용 man mount은 참조하십시오.


1
이것은 인터넷 검색에서 찾을 수있는 유일한 대답입니다. FreeBSD에서 사용자가 변수 (즉, vfs.usermount) 를 설정하여 파일 시스템을 마운트 할 수 있음을 알았습니다 . 나는 sth를 원한다. 그것과 비슷합니다. 나는 각각에 많은 파티션을 가진 많은 이동식 드라이브를 사용하며 각각에 대해 12 ~ 2 개의 항목을 fstab에 추가하는 것이 번거로울 것입니다.

추악한 해결책은 udev새로운 장치가 나타나고 사라질 때 항목을 관리 하게 하는 것입니다.
Jester

나는 이것이 민트 나 우분투에서 작동하는 것을 찾지 못했습니다. 예, 기본 사용자 계정은 루트없이 마운트 할 수 있지만 'standard'/ 'desktop'사용자는 마운트 할 수 없습니다.
johny 왜

6

여기에 구성하는 위키입니다 폴킷의 규칙 udisks / udisks2을 비 루트로 파티션 (예 : 사용자) 그룹을 탑재하기 위해이.

아래 코드를 /etc/polkit-1/rules.d/50-udisks.rules에 저장하십시오.

polkit.addRule(function(action, subject) {
  var YES = polkit.Result.YES;
  var permission = {
    // only required for udisks1:
    "org.freedesktop.udisks.filesystem-mount": YES,
    "org.freedesktop.udisks.filesystem-mount-system-internal": YES,
    "org.freedesktop.udisks.luks-unlock": YES,
    "org.freedesktop.udisks.drive-eject": YES,
    "org.freedesktop.udisks.drive-detach": YES,
    // only required for udisks2:
    "org.freedesktop.udisks2.filesystem-mount": YES,
    "org.freedesktop.udisks2.filesystem-mount-system": YES,
    "org.freedesktop.udisks2.encrypted-unlock": YES,
    "org.freedesktop.udisks2.eject-media": YES,
    "org.freedesktop.udisks2.power-off-drive": YES,
    // required for udisks2 if using udiskie from another seat (e.g. systemd):
    "org.freedesktop.udisks2.filesystem-mount-other-seat": YES,
    "org.freedesktop.udisks2.encrypted-unlock-other-seat": YES,
    "org.freedesktop.udisks2.eject-media-other-seat": YES,
    "org.freedesktop.udisks2.power-off-drive-other-seat": YES
  };
  if (subject.isInGroup("users")) {
    return permission[action.id];
  }
});

파티션을 마운트하기 위해 다음 명령을 사용하여 "users"그룹에 있다고 가정하십시오 (sudo 필요 없음).

# udisks2
udisksctl mount --block-device /dev/sda1

# udisks
udisks --mount /dev/sda1

2
가는 길 같지만 저에게는 효과가 없었습니다.
Stéphane Gourichon

5

1 작동하는 곳을보십시오

Xubuntu에서는 USB 대용량 저장 장치, 하드 디스크 파티션, CD / DVD 등을 마운트하고 꺼내기 위해 기본적으로 작동합니다.

policyKit을 사용하여 Ubuntu가 선택한 솔루션이 충분히 안전하다고 가정 해 봅시다.

2 관련 부품 선택

데비안 8.3의 XFCE에서는 사용자가 암호없이 파일 시스템을 마운트하고 꺼내도록 허용해야했습니다. 나를 위해 일한 것은 우분투에서 허가 파일을 선택하는 것입니다.

아래의 줄을 루트로 이름 /var/lib/polkit-1/localauthority/10-vendor.d/com.ubuntu.desktop.pkla이 지정된 파일에 추가하면 트릭을 수행해야합니다.

[Mounting, checking, etc. of internal drives]
Identity=unix-group:admin;unix-group:sudo
Action=org.freedesktop.udisks.filesystem-*;org.freedesktop.udisks.drive-ata-smart*;org.freedesktop.udisks2.filesystem-mount-system;org.freedesktop.udisks2.encrypted-unlock-system;org.freedesktop.udisks2.filesystem-fstab;
ResultActive=yes

3 이익!

(실제로 내가 한 것은 Ubuntu 16.04의 동일한 이름을 가진 파일에서 조금 더 선택했으며 나를 위해 일했습니다. 필요한 경우 https://gist.github.com/kafene/5b4aa4ebbd9229fa2e73 의 내용처럼 보입니다. )


이것은 시스템과 같은 데비안에서만 작동합니다. 왜 / etc /에 규칙을 넣는 것이 효과가 없는지 모릅니다.
Anwar

데비안 스트레치에서는 작동하지 않습니다.
Philipp Ludwig

1
XFCE의 데비안 버스터에서 작동합니다! 감사!
Maxwel Leite

3

sudo일련의 사용자가 mount명령 을 실행하도록 구성 할 수 있습니다 .

업데이트 : 마운트하여 시스템을 손상시키는 방법은 무엇입니까? 예를 들어 파일 시스템에 setuid 루트 셸을 만든 다음 루트 권한을 얻기 위해 마운트하고 실행할 수 있습니다.


나는 이것을 생각했지만 사용자가 명령을 실행할 필요는 sudo없습니까? 또한이 방법으로 파일 시스템을 마운트하는 루트 사용자가 아닌가?

그렇습니다. sudo가 필요하고 root의 이름으로 실행됩니다. 첫 번째 문제를 해결하기 위해 래퍼 스크립트를 별칭 mount으로 sudo mount사용하거나 래퍼 스크립트를 사용할 수 있습니다.
Jester

내가 원하는 것은 루트 사용자의 대행사없이 파일 시스템을 마운트하는 것입니다. 이 대행사를 마스킹하면 아무것도 아닙니다.

userfstab에 추가하더라도 mountsetuid root 이므로 작동 합니다. 커널은 루트 또는 CAP_SYS_ADMIN기능을 확인 하므로 실제로 루트와 관련된 문제를 해결할 수 없습니다.
Jester

어떻게 구성 할 수 있습니까? 도움이되지 않습니다.
Nuzzolilo

0

파일 시스템은 파일의 자리 표시 자이므로 괄호 안에있는 질문에 답하기 위해 사용자는 파일 삭제와 같은 파일 시스템에서 유해한 작업을 수행 할 수 있습니다.

다른 두 가지 질문을 요약하면 다음과 같습니다.

  • fstab부팅영구 저장소 에 장착하기에 좋습니다 . USB 드라이브를 연결하거나 때로는 일부 네트워크 공유를 마운트하려는 경우 그리 좋지 않습니다.

  • sudo mount우분투 시스템에 있다면 괜찮습니다. 그래도 비밀번호를 입력해야합니다.

  • udev 우분투 * 시스템에 USB 스틱, 카메라 및 플래시 카드와 같은 것을 마운트 할 것입니다 (그러나 데비안, 슬랙웨어 등과 같은 사용자 친화적 인 배포판은 아닙니다)

역사적으로 일부 사용자 (또는 그룹)에게 권한을 부여하는 유닉스 방법은 sudoers파일을 통해 이루어 집니다.

그것을 사용하는 많은 가이드가 있으므로 특정 제안하지는 않습니다. Linux 문서 프로젝트 웹 사이트를 사용하여 그것에 대해 배웠다고 말할 것입니다.

sudoers또한 암호를 제공하지 않아도 장치와 공유를 투명하게 마운트 할 수 있다는 점이 더 중요합니다 (특히주의해야합니다).

일반적으로 제어 환경에서하는 일은 sudoers파일을 사용하여 특정 그룹의 사용자가 네트워크 공유를 투명하게 마운트 할 수 있도록하는 것입니다. 따라서 "사용자가 클라이언트 터미널에 로그온 할 때 네트워크 파일 서버에서 사용자의 홈 폴더 마운트"와 같은 작업을 허용 하는 명령 mount.nfsmount.cifssudoers 파일에 명령을 추가합니다 .


1
로그인 할 때 sudo를 사용하여 사용자가 홈 폴더를 마운트 할 수있게하려면 autofs를 살펴보십시오.
derobert

나는 이것들을 함께 사용한다. 파일 서버 에서 클라이언트 PC 의 위치 autofs로 마운트하는 데 자체적 으로 사용하는 방법을 알 수 없었습니다 . /home/$USER/home/$USER/fromFS/
nass

0

guestmount libguestfs 속임수

sudo apt-get install libguestfs-tools

# Workarounds for Ubuntu 18.04 bugs.
# https://serverfault.com/questions/246835/convert-directory-to-qemu-kvm-virtual-disk-image/916697#916697
sudo rm -rf /var/cache/.guestfs-*
echo dash | sudo tee /usr/lib/x86_64-linux-gnu/guestfs/supermin.d/zz-dash-packages
sudo chmod +r /boot/vmlinuz-*

# Create a test image.
mkdir sysroot
dd if=/dev/urandom of=sysroot/myfile bs=1024 count=1024
virt-make-fs --format=raw --type=ext2 sysroot sysroot.ext2

# Mount it, have fun, unmount!
mkdir -p mnt
# /dev/sda becuase we have a raw filesystem.
guestmount -a sysroot.ext2.qcow2 -m /dev/sda mnt
cmp sysroot/myfile mnt/myfile
guestunmount mnt

에 의존:

  • 파일 시스템의 userland 구현
  • 퓨즈

문서 : http://libguestfs.org/guestmount.1.html

우분투 18.04, libguestfs-tools 1 : 1.36.13-1ubuntu3에서 테스트되었습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.