프로세스 개인 파일 시스템 마운트 포인트 당


24

unshare명령 을 확인 하고 있었고 맨 페이지에 따르면

   unshare - run program with some namespaces unshared from parent

또한 다음과 같이 네임 스페이스 유형이 나열되어 있습니다.

 mount namespace
              mounting and unmounting filesystems will not affect rest of the system.

이 마운트 네임 스페이스 의 목적은 정확히 무엇입니까 ? 몇 가지 예를 통해이 개념을 이해하려고합니다.



@Gilles, 감사합니다. 제가 확인하겠습니다. 그 동안 답변에 추가해야 할 사항이 있으면 알려 주시기 바랍니다.
— Ramesh

답변:


29

Running unshare -m은 호출 프로세스에 마운트 네임 스페이스의 개인용 사본을 제공하고 파일 시스템 속성을 공유 해제하여 더 이상 루트 디렉토리, 현재 디렉토리 또는 umask 속성을 다른 프로세스와 공유하지 않도록합니다.

위의 단락은 무엇을 말합니까? 간단한 예를 사용하여 이해하려고 노력하십시오.

터미널 1:

첫 번째 터미널에서 아래 명령을 수행합니다.

#Creating a new process
unshare -m /bin/bash
#creating a new mount point
secret_dir=`mktemp -d --tmpdir=/tmp`
#creating a new mount point for the above created directory. 
mount -n -o size=1m -t tmpfs tmpfs $secret_dir
#checking the available mount points. 
grep /tmp /proc/mounts 

마지막 명령은 다음과 같이 출력을 제공합니다.

tmpfs /tmp/tmp.7KtrAsd9lx tmpfs rw,relatime,size=1024k 0 0

이제 다음 명령도 수행했습니다.

cd /tmp/tmp.7KtrAsd9lx
touch hello
touch helloagain
ls - lFa

ls명령 의 출력은

ls -lFa
total 4
drwxrwxrwt   2 root root   80 Sep  3 22:23 ./
drwxrwxrwt. 16 root root 4096 Sep  3 22:22 ../
-rw-r--r--   1 root root    0 Sep  3 22:23 hello
-rw-r--r--   1 root root    0 Sep  3 22:23 helloagain

그렇다면이 모든 일을하는 데있어 가장 중요한 것은 무엇입니까? 왜해야합니까?

이제 다른 터미널 ( 터미널 2 )을 열고 아래 명령을 수행하십시오.

cd /tmp/tmp.7KtrAsd9lx
ls - lFa

출력은 다음과 같습니다.

ls -lFa
total 8
drwx------   2 root root 4096 Sep  3 22:22 ./
drwxrwxrwt. 16 root root 4096 Sep  3 22:22 ../

파일 hello과는 helloagain볼 수 없으며 심지어 이러한 파일을 확인하기 위해 루트로 로그인. 따라서이 기능을 사용하면 다른 루트 소유 프로세스도 보거나 찾아 볼 수없는 개인 임시 파일 시스템을 만들 수 있습니다.

의 맨 페이지 unshare에서

마운트 네임 스페이스 파일 시스템 마운트 및 마운트 해제는 명시 적으로 공유로 표시된 파일 시스템을 제외하고 나머지 시스템 (CLONE_NEWNS 플래그)에 영향을 미치지 않습니다 (mount --make-shared 사용, 공유 플래그는 / proc / self / mountinfo 참조).

unname --mount 후에 mount --make-rprivate 또는 mount --make-rslave를 사용하여 새 네임 스페이스의 마운트 지점이 실제로 부모 네임 스페이스와 공유되지 않도록하는 것이 좋습니다.

네임 스페이스에 사용되는 메모리는 커널에서 가져온 VFS입니다. 그리고 처음부터 바로 설정하면 루트 권한이없는 루트 사용자 인 전체 가상 환경을 만들 수 있습니다.

참고 문헌 :

예제는 이 블로그 게시물 의 세부 정보를 사용하여 구성 됩니다. 또한이 답변의 인용문은 Mike의 훌륭한 설명에서 비롯 됩니다. 이것에 관한 또 다른 훌륭한 읽을 거리는 여기 의 답변에서 찾을 수 있습니다 .


1
this feature makes it possible for us to create a private temporary filesystem that even other root-owned processes cannot see or browse through.그리고 비교 chroot로, chroot파일을 다른 사람에게 볼 수 있습니다. 이것은 놀랍습니다. 그리고 그 문장은 아마도 답의 맨 위에 있어야합니다. +1
— Sergiy Kolodyazhnyy

1
뿌리를 탈출하는 것은 없습니다! 를 사용 nsenter하여 네임 스페이스를 입력하고 임시 파일을 볼 수 있습니다. 하나의 공유 해제 (tempdir을 소유 한 공유자) 만 가정하면 sudo nsenter -t $(pgrep -P $(ps aux | grep unshare | grep -v grep | awk '{print $2}')) -m -p내용을 볼 수있게됩니다.
— earcam

2

버블 랩을 시스템에 설치 한 경우 한 단계로 쉽게 수행 할 수 있습니다.

bwrap --dev-bind / / --tmpfs /tmp bash

위의 예에서 내부 bash는 / tmp에 대한 자체 뷰를 갖습니다.

@Ramesh의 답변에서 영감을 얻은 솔루션-감사합니다!

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