chroot #
chroot는 루트 디렉토리(/)를 변경하고 명령어를 실행하는 명령어이다. 루트를 변경해서 격리된 공간에서 셸이 실행 된다.
이렇게 루트를 변경해서 격리된 공간에 있는데 격리된 공간 바깥쪽을 접근 하는 것을 탈옥이라고 하는데 chroot만 가지고는 탈옥이 가능하다, 완전히 격리하려면 pivot_root를 사용해야 하는데 자세한 설명은 생략.
chroot 사용법 #
sudo chroot 새로운_루트 실행할_명령
일단 아무 것도 없는 디렉토리를 루트로 지정하면 루트 경로에 아무 것도 없으니 아무 것도 실행할 수가 없다. 일단 셸이 있어야 뭘 하든말든 할거니깐 먼저 셸을 쓸 수 있게 하자.
셸을 쓰기 위해 bash를 넣어야 하는데 bash만 복사해서 되는게 아니라 bash가 사용하는 라이브러리들도 복사해야 한다. 같이 있어야 할 라이브러리는 ldd로 확인해볼 수 있다.
ldd $(which bash)
linux-vdso.so.1 (0x00007ffd325c2000)
libtinfo.so.6 => /lib/x86_64-linux-gnu/libtinfo.so.6 (0x00007f04e028d000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f04e0064000)
/lib64/ld-linux-x86-64.so.2 (0x00007f04e0428000)
그런데 이렇게 라이브러리들까지 다 복사해서 bash를 실행시켜도 bash만 가지고는 bash에 내장된 명령어만 쓸 수 있다. 뭐 bash도 결국 인터프리터 언어의 셸이라 그런 용도로 bash를 쓰는 사람이 얼마나 있을까. 정 궁금하다면 unset PATH 한번 쳐보고 리눅스를 써보자.
실행파일과 의존하는 파일들을 하나하나 옮기는 것도 귀찮고 chroot에서 bash 다루는 다른 글 많으니깐 busybox를 사용하도록 한다.
Busybox #
busybox는 유닉스 계열의 운영체제에 사용되는 여러 명령어들을 하나의 실행파일로 합쳐놓은 프로그램이다. 용량을 절약할 수 있기 때문에 임베디드 리눅스나 컨테이너 환경에서 용량을 줄이는게 중요한 경우에 쓰인다.
busybox에 내장된 명령어들을 실행하려면 busybox의 인수로 명령어의 이름을 넣거나 그 명령어의 이름으로 busybox로 향하는 링크를 만들면 된다. (심볼릭 링크여도 되고 하드링크여도 상관없다)
실제로 busybox를 사용하는 리눅스 배포판에서 /bin, /usr/bin에 있는 파일의 상당수가 busybox에 심볼릭 링크가 걸린 것을 볼 수 있다.
busybox ls #ls 명령어 실행
ln busybox wget #이름이 wget인 링크 생성
chroot 사용해보기 #
새로운 루트가 될 디렉토리 jail과 그 아래에 /usr/bin 디렉토리를 생성한다
mkdir -p jail/usr/bin
busybox는 busybox 다룬로드 링크에서 받거나 소스를 빌드해서 구한다
busybox를 복사하고 실행 권한을 부여한다.
cp busybox jail/usr/bin/
chmod u+x jail/usr/bin/busybox
chroot로 busybox의 ash 셸을 실행한다.
sudo chroot jail /usr/bin/busybox ash
busybox의 ash에 실행되었다.
busybox –install 명령어
busybox의 절대경로 --install 설치할_경로
/usr/bin/busybox --install /usr/bin
여기서 busybox를 실행할 때 절대경로로 써야 실행된다. 실행 후 생성된 파일들의 inode가 전부 동일한 것으로 봐선 busybox로 하드링크를 생성하는 것으로 보인다.
Reply by Email