logo

Linux Virtualization -Chroot Jail

UNIX 운영 체제에 대한 Chroot는 현재 실행 프로세스 및 어린이의 명백한 루트 디렉토리를 변경하는 작업입니다. 이 수정 된 환경에서 실행되는 프로그램은 지정된 디렉토리 트리 외부의 파일에 액세스 할 수 없습니다. 이것은 본질적으로 디렉토리 트리에 대한 액세스를 제한하므로 'Chroot Jail'이라는 이름을 얻습니다.

아이디어는 프로세스를 실행하는 데 필요한 모든 시스템 파일에서 복사하거나 링크하는 디렉토리 트리를 작성한다는 것입니다. 그런 다음 chroot 시스템 호출을 사용하여 루트 디렉토리를 변경 하여이 새 트리의 바닥에 있고 해당 Chrooted 환경에서 실행되는 프로세스를 시작합니다. 실제로 수정 된 루트 외부의 경로를 참조 할 수 없으므로 해당 위치에 악의적으로 읽거나 쓸 수 없습니다.



필요한 이유는 무엇이며 가상 머신과 어떻게 다른가요?

이것은 작동 시스템 수준 가상화이며 가상 머신 대신 호스트 OS의 여러 분리 된 인스턴스를 생성하는 데 종종 사용됩니다. 이는 커널 수준 가상화이며 Application-Layer 가상화 인 가상 머신과 비교하여 실질적으로 오버 헤드가 없습니다. 결과적으로 동일한 하드웨어에서 여러 격리 된 인스턴스를 생성하는 매우 좋은 방법을 제공합니다. VM (Virtual Machine)은 기계의 소프트웨어 구현이며 종종 작업 운영 체제의 가상 이미지를 렌더링하기 위해 하드웨어 가상화라고 알려진 것을 악용합니다.

Chroot Jail 사용 방법

Chroot Jail을 만드는 기본 명령은 다음과 같습니다.

 chroot /path/to/new/root command  
OR
chroot /path/to/new/root /path/to/server
OR
chroot [options] /path/to/new/root /path/to/server

참고 : 루트/권한이있는 사용자 만 chroot 시스템 호출을 사용할 수 있습니다. 명령에 액세스 할 수있는 불가능한 사용자는 Chroot Jail을 우회 할 수 있습니다.



'bash'및 'ls'명령에 대한 미니 데일을 만드는 단계


1. 명령의 근본으로 작동하는 디렉토리를 만듭니다.

 $ mkdir jailed  
$ cd jailed

2. 명령을 실행하기위한 모든 필수 디렉토리를 만듭니다. 운영 체제에 따라 필요한 디렉토리가 변경 될 수 있습니다. 논리적으로 우리는 필요한 라이브러리의 사본을 보관하기 위해 이러한 모든 디렉토리를 만듭니다. 모든 디렉토리가 필요한 것을 보려면 4 단계를 참조하십시오.

 $ mkdir -p bin lib64/x86_64-linux-gnu lib/x86_64-linux-gnu

3. 'what'명령을 연결합니다. LS와 Bash Command의 위치를 ​​찾기 위해 'what'명령을 실행하십시오. 이러한 명령이 별명이 없는지 확인하십시오. 이제부터 우리는 디렉토리를 다음과 같이 언급 할 것입니다. '감옥' 편의를위한 디렉토리.



 $ unalias ls # Required only if you have aliased ls command  
$ unalias bash # Required only if you have aliased bash command
$ cp $(which ls) ./bin/
$ cp $(which bash) ./bin/

4. 적절한 라이브러리/객체를 복사하십시오 : 우리의 실행 파일을 위해 감옥 디렉토리 작업을위한 디렉토리 우리는 감옥 디렉토리에 적절한 라이브러리/오브젝트를 복사해야합니다. 기본적으로 실행 파일은 '/'로 시작하는 위치를 살펴 봅니다. 종속성을 찾으려면 'ldd'명령을 사용합니다.

$ ldd $(which bash)  
linux-vdso.so.1 => (0x00007ffc75dd4000)
libtinfo.so.5 => /lib/x86_64-linux-gnu/libtinfo.so.5 (0x00007f6577768000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f6577564000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f657719a000)
/lib64/ld-linux-x86-64.so.2 (0x000055979f3fd000)

다음 명령을 실행하여 적절한 디렉토리를 만듭니다.

$ cp /lib/x86_64-linux-gnu/libtinfo.so.5 lib/x86_64-linux-gnu/  
$ cp /lib/x86_64-linux-gnu/libdl.so.2 lib/x86_64-linux-gnu/
$ cp /lib/x86_64-linux-gnu/libc.so.6 lib/x86_64-linux-gnu/
$ cp /lib64/ld-linux-x86-64.so.2 lib64/

LS에 대해서도 마찬가지입니다 

$ ldd $(which ls)  
linux-vdso.so.1 => (0x00007fff4f05d000)
libselinux.so.1 => /lib/x86_64-linux-gnu/libselinux.so.1 (0x00007f9a2fd07000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f9a2f93e000)
libpcre.so.3 => /lib/x86_64-linux-gnu/libpcre.so.3 (0x00007f9a2f6cd000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f9a2f4c9000)
/lib64/ld-linux-x86-64.so.2 (0x000055e836c69000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f9a2f2ac000)
$ cp /lib/x86_64-linux-gnu/libselinux.so.1 lib/x86_64-linux-gnu/  
$ cp /lib/x86_64-linux-gnu/libc.so.6 lib/x86_64-linux-gnu/
$ cp /lib/x86_64-linux-gnu/libpcre.so.3 lib/x86_64-linux-gnu/
$ cp /lib/x86_64-linux-gnu/libdl.so.2 lib/x86_64-linux-gnu/
$ cp /lib64/ld-linux-x86-64.so.2 lib64/
$ cp /lib/x86_64-linux-gnu/libpthread.so.0 lib/x86_64-linux-gnu/


최종 디렉토리 구조는 이와 유사해야합니다

Chroot Jail' title=

5. Sudo Chroot : 이 명령을 실행하여 뿌리를 감옥 디렉토리로 변경하여 쉘로가는 경로와 함께합니다. 기본적으로 '/bin/sh'쉘을로드하려고합니다.

 $ cd ..  
$ sudo chroot jailed /bin/bash

chroot 명령을 실행하는 동안이 오류에 직면 할 수 있습니다. 

chroot: failed to run command `/bin/bash': No such file or directory

이는 파일이 존재하지 않는 두 가지 이유 (명백하지 않음) 또는 로딩 라이브러리가 실패하거나 사용할 수없는 경우 때문일 수 있습니다. 라이브러리가 올바른 위치에 있는지 두 번 확인하십시오.

6. 새 쉘이 팝업해야합니다. 우리의 감옥 배쉬. 우리는 현재 2 개의 명령이 설치된 Bash와 Ls 만 있습니다. 다행스럽게도 CD와 PWD는 Bash Shell에 내장 명령이므로 사용할 수 있습니다.

디렉토리 주위를 돌아 다니며 'CD /../'또는 비슷한 것에 액세스하십시오. 감옥을 깰 수있을 것입니다. :)

감옥에서 나가기 위해 

 $ exit

가장 중요하고 흥미로운 부분은 

 $ ps aux

프로세스가 하나만 있다는 프로세스를 찾으십시오. 

root 24958 … 03:21 0:00 /usr/bin/sudo -E chroot jailed/ /bin/bash

감옥에있는 껍질의 흥미롭게 처리는이 껍질의 간단한 어린이 과정으로 실행됩니다. 감옥 환경 내부의 모든 프로세스는 호스트 OS의 간단한 사용자 수준 프로세스이며 커널에서 제공하는 네임 스페이스에 의해 격리되므로 오버 헤드가 최소화되며 추가 이점으로 격리됩니다.

마찬가지로 가상 감옥 환경에 더 많은 명령을 추가 할 수 있습니다. 더 복잡한 프로그램을 추가하려면 '/Proc'및 '/Dev'와 같은 더 많은 디렉토리를 만들어야 할 수도 있습니다. 이들은 프로세스의 복잡성을 증가시킵니다. 바라건대 우리는 우리의 목적을 위해 그것을 요구하지 않기를 바랍니다.

이것은 Chroot와 디렉토리의 감옥에 대해 알아야 할 전부입니다. 우리의 궁극적 인 목표는 컨테이너가 무엇인지, AWS (Amazon Web Services)와 같은 서비스가 어떻게되는지를 이해하는 것입니다. 또한 Sys-Admin은 단일 물리적 시스템에서 여러 도메인에 대해 여러 웹 서버를 실행하는 방법이 있습니다.