chroot Jail(감옥), 파일시스템을 격리하는 기술을 이용해 마치 독립된 하나의 운영체제처럼 사용.
/* chroot : 보안 등을 위해 새로운 가상의 루트 디렉토리를 생성하여 원격 서비스로 접속할 경우 설정 디렉토리의 상위로 이동이 불가능하게 하는 명령 */
namespace, cgroup, union mount를 비롯한 컨테이너를 구현하기 위한(격리된 프로세스를 생성하기 위한) 여러가지 기능이 있다. 그중에서도 가장 오래되고 기본이 되는 것은 프로세스가 실행되는 루트를 변경하는 일이다.
chroot는 이름에서 유추해볼 수 있듯 "Change Root (directory)"라는 의미를 가지고 있다. 여기서 루트는 사용자가 아니라 "/", 시스템 최상위 디렉터리를 의미하며, 일반적인 프로세스는 이 루트 디렉터리를 기준으로 그 아래에 있는 디렉터리나 파일에 접근하는게 가능하다.
chroot를 사용하면 프로세스가 인식하는 루트 디렉터리를 변경할 수 있다. 예시로 chroot에서 /tmp/chroot를 루트 디렉터리로 지정하여 어떤 프로세스를 실행한다면, 이 프로세스는 /tmp/chroot를 "/"(로트 디렉터리)로 인식한다. 이 프로세스는 호스트의 /tmp/chroot 보다 디렉터리 구조 상에서 상위에 있는 디렉터리에 접근 할 수 없다. 이 프로세스는 /tmp/chroot가 루트이고 오직 이 아래의 파일들만 접근이 가능하다.
새로운 루트 경로에서 프로그램을 실행하기 위해서는 새로운 루트 경로 아래에 실행하기 위한 환경이 존재하여야 한다.
bash 명령을 사용하기 위해선 chroot 새로운 루트경로 하위에서 /bin/bash 경로를 찾는다.
mgmt@Docker:~$ mkdir /tmp/root/bin/
mgmt@Docker:~$ cp /bin/bash /tmp/root/bin/
명령을 실행하기 위한 의존성 또한 해결하여야 한다. 어떤 프로그램은 프로그램 파일만으로 실행이 되기도 하지만, 많은 프로그램들은 시스템 상에 다른 파일에 의존하고 있다. 이를 동적라이브러리라고 부른다.
bash 또한 의존성을 가지고 있으며 새로운 루트 경로 아래에 의존하고 있는 라이브러리 파일들이 존재하지 않으면 실행되지 않는다.
ldd 명령을 통해 의존하고 있는 라이브러리 파일을 확인하고 해당 파일들을 새로운 루트 경로 아래에 복제한다.
mgmt@Docker:~$ ldd /bin/bash
linux-vdso.so.1 (0x00007ffcacfff000)
libtinfo.so.5 => /lib/x86_64-linux-gnu/libtinfo.so.5 (0x00007f5cf2fd9000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f5cf2dd5000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f5cf29e4000)
/lib64/ld-linux-x86-64.so.2 (0x00007f5cf351d000)
mgmt@Docker:~$ mkdir -p /tmp/root/lib/x86_64-linux-gnu /tmp/root/lib64
mgmt@Docker:~$ cp /lib/x86_64-linux-gnu/libtinfo.so.5 /tmp/root/lib/x86_64-linux-gnu/
mgmt@Docker:~$ cp /lib/x86_64-linux-gnu/libdl.so.2 /tmp/root/lib/x86_64-linux-gnu/
mgmt@Docker:~$ cp /lib/x86_64-linux-gnu/libc.so.6 /tmp/root/lib/x86_64-linux-gnu/
mgmt@Docker:~$ cp /lib64/ld-linux-x86-64.so.2 /tmp/root/lib64/
References
1. Steemit - "<컨테이너 가상화의 이해> chroot를 사용해 프로세스의 루트 바꾸기"
steemit.com/kr/@mishana/1-chroot
<컨테이너 가상화의 이해> chroot를 사용해 프로세스의 루트 바꾸기 — Steemit
안녕하세요. 프로그래머 @mishana입니다. 오늘 소개할 리눅스 명령어는 프로세스가 인식하는 루트 디렉터리를 바꿔주는 chroot입니다. chroot를 직접 사용할 일은 별로 없습니다. 하지만… by mishana
steemit.com
2. 44BITS - "컨테이너 기초 - chroot를 사용한 프로세스의 루트 디렉터리 격리"
www.44bits.io/ko/post/change-root-directory-by-using-chroot
컨테이너 기초 - chroot를 사용한 프로세스의 루트 디렉터리 격리
chroot는 프로세스의 루트 디렉터리를 변경하는 리눅스 시스템콜/명령어입니다. 루트를 변경함으로써 아주 기초적인 단계의 컨테이너를 구현해볼 수 있습니다. chroot는 아주 단순한 프로그램입니
www.44bits.io
3. teastful - "[리눅스 명령어] chroot - 가상루트디렉토리]
blog.naver.com/teastful/140117134017
[리눅스 명령어] chroot - 가상루트디렉토리
■ 설 명 보안 등을 위해 새로운 가상의 루트 디렉토리를 생성하여 원격 서비스로 접속할 경우 이 디렉토리...
blog.naver.com