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


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.