개요
리눅스 환경에서 루트 디렉터리를 일시적으로 변경하는 chroot 명령어의 개념과 핵심 원리를 살펴봅니다. 미니 샌드박스 환경 구축부터 Live CD를 활용한 시스템 응급 복구, SFTP 디렉터리 격리까지 실무에서 즉시 활용할 수 있는 실전 예제를 단계별로 다룹니다.
chroot 기본 원리와 BusyBox 기반 최소 샌드박스 구축
외부 의존성 라이브러리 없이 독립적으로 실행 가능한 최소 환경을 구성하기 위해 sudo apt-get update -qq && sudo apt-get install -y busybox-static 명령어로 정적 바이너리 패키지를 설치합니다.

chroot 환경의 새로운 루트 디렉터리와 실행 파일 저장을 위한 경로를 생성하기 위해 sudo mkdir -p /opt/mini-jail/bin 명령어를 실행합니다.

격리된 공간 내부에서 기본 셸과 유틸리티 명령어를 실행할 수 있도록 sudo cp /bin/busybox /opt/mini-jail/bin/ 명령어로 바이너리를 복사합니다.

chroot 명령어는 실행 프로세스가 바라보는 루트 디렉터리(/)의 위치를 지정한 경로로 변경하여 호스트 시스템과의 접근을 차단합니다.
명령어를 실행하면 /opt/mini-jail이 최상위 루트로 인식되어 호스트 파일시스템과 격리된 상태에서 내부 파일 목록이 정상 출력되는 것을 확인할 수 있습니다.
⚙️ [주요 옵션]
--userspec=USER:GROUP : 격리 환경 내부에서 실행할 사용자와 그룹을 지정합니다.--groups=G_LIST : 격리 환경에서 사용할 보조 그룹 목록을 쉼표로 구분하여 지정합니다.--skip-chdir : 새로운 루트 디렉터리로 작업 디렉터리를 이동하지 않고 현재 작업 위치를 유지합니다.

의존성 라이브러리(ldd)를 포함한 독립 Bash 셸 격리 환경 구성
Bash 셸과 필수 공유 라이브러리를 배치할 격리 디렉터리 구조를 생성하기 위해 sudo mkdir -p /opt/bash-jail/{bin,lib,lib64} 명령어를 실행합니다.

격리 환경 내부에서 표준 Bash 셸과 디렉터리 조회 명령어를 실행할 수 있도록 sudo cp /bin/bash /bin/ls /opt/bash-jail/bin/ 명령어로 바이너리를 복사합니다.

동적 링크 방식으로 빌드된 bash와 ls 실행에 필요한 공유 라이브러리들을 격리 환경으로 가져오기 위해 sudo cp -a /lib/x86_64-linux-gnu /opt/bash-jail/lib/ 명령어를 실행합니다.

64비트 바이너리 실행에 필수적인 동적 링커 및 핵심 라이브러리를 격리 경로에 배치하기 위해 sudo cp -a /lib64/* /opt/bash-jail/lib64/ 명령어를 실행합니다.

sudo chroot /opt/bash-jail /bin/bash -c "ls -la /" 명령어를 실행하여 구성한 격리 환경에서 Bash 셸을 구동하고 루트 경로의 파일 목록을 조회합니다.
실행 결과 호스트 시스템의 파일 대신 격리 환경에 복사해 둔 bin, lib, lib64 디렉터리만 최상위 루트(/)로 인식되어, 공유 라이브러리 의존성을 갖춘 독립 셸 환경이 정상 동작함을 확인할 수 있습니다.

시스템 장애 복구를 위한 가상 파일시스템 바인드 마운트와 chroot
복구 대상 시스템의 파일시스템을 연결할 마운트 포인트를 생성하기 위해 sudo mkdir -p /mnt/sysroot 명령어를 실행합니다.

복구 대상 디스크의 루트 파일시스템을 지정한 마운트 디렉터리에 연결하기 위해 sudo mount --bind / /mnt/sysroot 명령어를 실행합니다.

격리된 복구 환경 내부에서 디스크 파티션과 하드웨어 장치 노드에 정상적으로 접근할 수 있도록 호스트의 /dev 디렉터리를 바인드 마운트합니다.

커널 상태와 실행 중인 프로세스 정보를 참조하는 시스템 복구 도구들이 정상 작동할 수 있도록 호스트의 /proc 가상 파일시스템을 바인드 마운트합니다.

커널의 하드웨어 장치 제어 및 시스템 드라이버 정보를 격리 환경에 그대로 전달하기 위해 호스트의 /sys 가상 파일시스템을 바인드 마운트합니다.

sudo chroot /mnt/sysroot /bin/bash -c "uname -a && df -h /" 명령어를 실행하여 필수 가상 파일시스템이 바인드 마운트된 환경에서 커널 정보와 루트 파일시스템 용량을 확인합니다.
실행 결과 호스트의 커널 정보가 정상 인식되고 마운트된 대상 경로가 최상위 루트(/)로 작동하여 부팅 복구나 패키지 재설치 작업을 즉시 수행할 수 있는 상태임을 확인할 수 있습니다.

복구 및 점검 작업을 마친 후 마운트된 파일시스템이 손상되지 않도록 하위 가상 파일시스템부터 대상 루트 디렉터리까지 역순으로 안전하게 마운트 해제합니다.

보안 강화를 위한 SFTP 전용 chroot 디렉터리 권한 설정
대화형 셸 로그인을 차단하고 SFTP 전용 격리 환경에서 사용할 계정을 생성하기 위해 sudo id -u jailuser &>/dev/null || sudo useradd -m -d /home/jailuser -s /bin/false jailuser 명령어를 실행합니다.

격리된 사용자가 파일을 안전하게 전송할 수 있는 작업 공간을 마련하기 위해 sudo mkdir -p /home/jailuser/uploads 명령어로 업로드 디렉터리를 생성합니다.

OpenSSH의 chroot 탈출 방지 보안 요건을 충족하기 위해 최상위 격리 디렉터리의 소유권을 root로 변경하고 권한을 755로 설정합니다.

격리된 계정이 실제 파일 업로드 및 수정 작업을 수행할 수 있도록 하위 디렉터리의 소유권을 jailuser로 지정하기 위해 sudo chown jailuser:jailuser /home/jailuser/uploads 명령어를 실행합니다.

ls -ld /home/jailuser /home/jailuser/uploads 명령어를 실행하여 최상위 격리 경로와 하위 작업 디렉터리의 소유권 및 접근 권한을 확인합니다.
실행 결과 상위 디렉터리는 root:root 소유와 drwxr-xr-x 권한으로 보호되고, 내부 uploads 디렉터리는 jailuser:jailuser 소유로 분리되어 안전한 SFTP chroot 권한 규칙이 완성되었음을 확인할 수 있습니다.

지금까지 우분투에서 chroot 명령어를 활용한 파일시스템 격리 방법과 긴급 시스템 복구 과정을 간단하게 살펴보았습니다.
안전한 테스트 환경 구축이나 시스템 장애 복구가 필요한 실무 상황에서 유용하게 활용해 보시기 바랍니다.