를 설정하기 전에 마운트 네임 스페이스를 입력하면 chroot
예를 들어 for 등의 추가 마운트로 호스트 네임 스페이스를 복잡하게 만들 수 있습니다 /proc
. chroot
마운트 네임 스페이스 내부를 훌륭하고 간단한 핵으로 사용할 수 있습니다 .
나는 이해하는 데 이점이 있다고 생각 pivot_root
하지만 약간의 학습 곡선이 있습니다. man 8 pivot_root
(셸 명령에 대한 사용법 예제가 있지만) 설명서에 모든 내용이 설명되어 있지는 않습니다 . man 2 pivot_root
(시스템 호출의 경우) 동일한 작업을 수행하면 더 명확하고 예제 C 프로그램이 포함됩니다.
pivot_root를 사용하는 방법
마운트 네임 스페이스를 입력 한 직후에도 mount --make-rslave /
이와 동등하거나 필요 합니다. 그렇지 않으면 모든 마운트 변경 사항이를 포함하여 원래 네임 스페이스의 마운트로 전파됩니다 pivot_root
. 당신은 그것을 원하지 않습니다 :).
unshare --mount
명령 을 사용한 경우 mount --make-rprivate
기본적 으로 적용 되도록 문서화되어 있습니다 . AFAICS 이것은 잘못된 기본값이며 프로덕션 코드에서는 원하지 않습니다. 예를 들어이 시점 eject
에서 호스트 네임 스페이스의 마운트 된 DVD 또는 USB에서 작동 하지 않습니다 . DVD 또는 USB는 개인용 마운트 트리 내부에 마운트 된 상태로 유지되며 커널은 DVD를 꺼내지 못하게합니다.
이 작업을 마치면 사용할 /proc
디렉토리 등을 마운트 할 수 있습니다 . 같은 방식으로 chroot
.
사용할 때와는 달리 chroot
, pivot_root
새로운 루트 파일 시스템이 마운트 지점입니다해야합니다. 아직 마운트되지 않은 경우 바인드 마운트를 적용하여이를 만족시킬 수 있습니다 mount --rbind new_root new_root
.
/ 옵션 과 함께 pivot_root
-를 사용 umount
하고 이전 루트 파일 시스템을 사용하십시오 . ( 필요하지 않으므로 시간이 더 걸릴 수 있습니다. ).-l
MNT_DETACH
umount -R
기술적으로, 사용은 pivot_root
일반적으로 사용 을 포함해야합니다 chroot
. "또는-"가 아닙니다.
당으로 man 2 pivot_root
, 그것은 단지 마운트 네임 스페이스의 루트를 교환으로 정의합니다. 프로세스 루트가 가리키는 실제 디렉토리를 변경하도록 정의되지 않았습니다. 또는 현재 작업 디렉토리 ( /proc/self/cwd
). 것을 어떻게 않습니다 그렇게, 그러나 이것은 핸들의 커널 스레드에 대한 해킹입니다. 맨 페이지는 향후 변경 될 수 있다고 말합니다.
일반적으로이 순서를 원합니다.
chdir(new_root); // cd new_root
pivot_root(".", put_old); // pivot_root . put_old
chroot("."); // chroot .
chroot
이 순서에서 의 주장은 또 다른 미묘한 세부 사항 입니다. 요점은 pivot_root
마운트 네임 스페이스를 재배 열하는 것이지만 커널 코드는 프로세스 별 루트를 보면 루트 파일 시스템을 찾는 것처럼 보입니다 chroot
.
pivot_root를 사용하는 이유
원칙적 pivot_root
으로 보안 및 격리 에 사용 하는 것이 좋습니다 . 기능 기반 보안 이론에 대해 생각하고 싶습니다 . 필요한 특정 리소스 목록을 전달하면 프로세스가 다른 리소스에 액세스 할 수 없습니다. 이 경우 마운트 네임 스페이스로 전달 된 파일 시스템에 대해 이야기합니다. 이 아이디어는 일반적으로 Linux "네임 스페이스"기능에 적용되지만 잘 표현하지는 못합니다.
chroot
프로세스 루트 만 설정하지만 프로세스는 여전히 전체 마운트 네임 스페이스를 참조합니다. 프로세스가 수행 할 권한을 보유한 경우 chroot
파일 시스템 네임 스페이스를 백업 할 수 있습니다. 에 설명 된대로 man 2 chroot
, "슈퍼 유저에 의한 '는 chroot 감옥'에서 탈출 할 수 ...".
실행을 취소하는 또 다른 생각을 유발하는 방법 chroot
은 nsenter --mount=/proc/self/ns/mnt
입니다. 이것은 아마도이 원칙에 대한 더 강력한 주장 일 것이다. nsenter
/ setns()
는 마운트 네임 스페이스의 루트에서 프로세스 루트를 반드시 다시로드합니다 . 비록 두 개가 서로 다른 물리적 디렉토리를 참조 할 때 작동한다는 사실은 커널 버그로 간주 될 수 있습니다. (기술 노트 : 루트에서 서로의 위에 여러 파일 시스템이 마운트 될 수 있습니다. setns()
가장 최근에 마운트 된 파일 시스템을 사용하십시오).
이것은 마운트 네임 스페이스와 "PID 네임 스페이스"를 결합 할 때의 이점을 보여줍니다. PID 네임 스페이스 내에 있으면 제한되지 않은 프로세스의 마운트 네임 스페이스를 입력 할 수 없습니다. 또한 확인되지 않은 프로세스의 루트 ( /proc/$PID/root
) 를 입력하지 못하게합니다 . 물론 PID 네임 스페이스는 외부의 프로세스를 종료하지 못하게합니다 :-).
pivot_root
와chroot
: 나는 도커 소스를 살펴했다 그것을 실행에 실패하면 발견pivot_root
, 그것은 다시 하락한다chroot
, 즉, 이러한 메커니즘은 컨테이너 수송 목적의 기능에 이상 유사한 것으로 간주됩니다.