Linux에서 Chroot를 사용하고 손상된 시스템을 수정하는 방법 1

Linux에서 Chroot를 사용하고 손상된 시스템을 수정하는 방법

Chroot는 루트 파일 시스템을 변경하거나 수정할 수 있는 Linux/Unix 유틸리티입니다. 의 도움으로 chroot 명령을 사용하면 기본 파일 시스템 내부에 격리된 파일 시스템을 쉽게 만들 수 있습니다. Chroot는 직장과 가정 환경을 분리하거나 테스트 환경에서 소프트웨어를 분리하여 테스트하려는 경우 특히 유용합니다.

Chroot와 가상 머신의 차이점

언뜻 보기에 chroot는 가상 머신이나 도커와 같은 컨테이너화된 시스템과 유사하다고 생각할 수 있습니다. 비슷하지만 chroot는 가상 머신보다 훨씬 가벼운 솔루션입니다. 가상 머신은 호스트 머신과 다른 별도의 커널을 설치하고 작동하기 위해 하이퍼바이저가 필요합니다. 가상 머신과 달리 chroot는 동일한 커널과 프로세스를 공유하지만 파일 시스템에 감옥을 만듭니다. 감옥 내부는 루트 권한 없이는 외부를 볼 수 없습니다. 따라서 격리된 파일 시스템을 chroot 감옥이라고도 합니다.

Chroot의 다양한 사용 사례

  1. CI/CD 파이프라인의 격리된 빌드 환경: Chroot는 CI/CD 파이프라인에서 애플리케이션을 위한 격리된 빌드 환경을 만드는 데 사용됩니다. 이는 고유한 종속성을 사용하여 애플리케이션을 빌드하는 데 도움이 되며 잠재적인 충돌을 제거하기 위해 다른 모든 빌드 환경과 완전히 격리됩니다.
  2. 별도의 개발 및 테스트 환경: 종종 개발자 컴퓨터에서 작동하는 소프트웨어가 최종 사용자 장치에서 작동하지 않습니다. 개발자의 시스템에 많은 도구와 종속성이 설치되어 있기 때문입니다. 일반 사람들은 컴퓨터에 이러한 모든 종속성이 설치되어 있지 않습니다. 소프트웨어를 테스트하기 위해 모든 장치에서 실행된다면 개발자나 테스터는 chroot를 사용하여 소프트웨어를 테스트하는 일반 바닐라 환경을 쉽게 만들 수 있습니다.
  3. 개발자의 위험 감소: 개발자로서 우리는 적절한 샌드박싱 없이 시스템 파일과 상호 작용하는 일부 프로그램을 종종 만듭니다. 따라서 실수를 하면 소프트웨어가 장치에서 중요한 데이터를 쉽게 지울 수 있습니다. 이러한 유형의 위험을 줄이기 위해 개발자는 종종 chroot를 사용하여 데이터 손실 위험을 줄이기 위해 새로운 작업 환경을 만듭니다.
  4. 동일한 소프트웨어의 다른 버전: 때때로 개발 목적을 위해 아주 오래되거나 아주 최신 버전의 소프트웨어나 종속성을 설치해야 합니다. 그러나 이러한 충돌하는 종속성을 사용하면 시스템이 엉망이 될 수 있습니다. 이 상황은 chroot 감옥을 사용하여 쉽게 극복할 수 있습니다.
  5. 고장난 시스템 수정: 시스템이 고장난 경우 chroot의 도움으로 쉽게 복구할 수 있습니다. 장치에서 라이브 Linux 환경을 부팅하고 파일 시스템을 마운트하기만 하면 됩니다. 이 마운트 지점을 사용하여 다른 명령을 실행하여 문제를 해결할 수 있습니다. 이에 대해서는 이 자습서의 뒷부분에서 자세히 설명합니다.
  6. FTP 서버를 안전하게 실행하기: FTP는 파일 전송 프로토콜을 의미합니다. FTP 서버를 실행하면 원하는 파일만 공유하도록 제어할 수 있습니다. 따라서 원격 피어는 호스트 파일 시스템을 보고 액세스할 수 없습니다.

Chroot 환경 만들기

이것은 시스템에 chroot 환경을 만드는 방법에 대한 빠른 안내서입니다. 당신은 할 수 있습니다 아치 위키에서 자세한 정보 얻기.

  1. chroot 환경을 만들려면 홈 폴더 안에 새 디렉터리를 만듭니다. 이 폴더 안에는 격리된 파일 시스템이 미래에 있을 것입니다. 이 튜토리얼에서는 폴더 이름을 “mte”로 지정했습니다.
mkdir ~/mte
  1. 우리는 매우 최소한의 Linux 환경을 만들고 있습니다. 우리는 설치 bash chroot 환경 내에서 쉘로 설치하고 ls, rm그리고 touch 각각 파일을 나열, 제거 및 생성합니다. “mte” 디렉토리 안에 필요한 디렉토리를 생성해 보겠습니다.
cd ~/mte
mkdir bin
mkdir lib
mkdir lib64
  1. 일반 “/bin” 디렉토리에서 “~/mte” chroot 환경으로 필요한 바이너리를 복사합니다.
cp /bin/bash ~/mte/bin
cp /bin/touch ~/mte/bin
cp /bin/ls ~/mte/bin
cp /bin/rm ~/mte/bin
  1. 바이너리를 복사하는 것만으로는 충분하지 않습니다. 또한 종속성을 “mte” 폴더에 복사해야 합니다. 필요한 종속성을 알기 위해 다음을 사용합니다. ldd 명령. bash의 종속성을 알고 싶다면 다음을 실행하십시오.
ldd /bin/bash

위의 명령에서 다음 출력을 얻습니다.

  1. 이러한 종속성을 나열하고 하나씩 복사하는 것은 매우 느리고 지루할 것입니다. 따라서 이 프로세스를 자동화하기 위해 bash 스크립트를 사용하고 있습니다. “copydependancy.sh”라는 파일을 만들고 그 안에 이러한 셸 명령을 작성합니다.
#Setting the chroot directory
mte="~/mte"
 
# enter your binary name
echo -e "Please enter your binary name \n"
 
#Reading from terminal input
read binaryname
 
# Listing all the dependencies
list="$(ldd /bin/$binaryname | egrep -o '/lib.*\.[0-9]')"
 
# Looping through the dependency list
for i in $list; do cp -v --parents "$i" "${mte}"; done

이 스크립트가 수행하는 작업을 살펴보겠습니다. 처음에 이 셸 스크립트는 바이너리 이름을 요청한 다음 이 바이너리 이름을 가져와서 해당 바이너리의 모든 종속성을 찾아 목록 변수에 저장합니다. 다음으로 목록의 모든 항목에서 실행되는 for 루프를 실행하고 일반 “/bin” 파일에서 “mte” chroot 디렉토리로 종속성을 복사합니다.

이 스크립트를 다른 곳에 저장하고 새 chroot 환경을 만들 때 참조하십시오.

다음으로 스크립트의 권한을 변경하고 터미널 내부에서 실행합니다.

chmod +x copydependancy.sh
  1. 모든 종속성이 시스템에 설치되었으므로 chroot 환경을 활성화해 보겠습니다. 표준 chroot 명령은 다음과 같습니다.
chroot [-OPTION] [PATH FOR NEW ROOT] [PATH FOR SERVER]

그러나 목적을 달성하기 위해 다음 명령을 실행하여 chroot 환경을 활성화합니다.

sudo chroot ~/mte /bin/bash

위의 명령은 “~/mte” 디렉토리에서 chroot 환경을 활성화하고 bash 쉘을 실행하도록 지정합니다. 터미널 프롬프트에서 변경 사항을 볼 수 있으며 이제 다음을 사용할 수 있습니다. touch, rm그리고 ls 파일을 생성, 제거 및 나열하는 명령.

chroot 환경을 종료하려면 다음을 실행하십시오. exit 명령.

chroot 환경을 완전히 제거하려면 파일 시스템에서 “mte” 디렉토리를 삭제하십시오.

rm -rf ~/mte

Chroot를 사용하여 손상된 부트로더 수정

chroot의 가장 매력적인 점은 고장난 시스템에 들어가서 그 안에서 명령을 실행할 수 있다는 것입니다. 따라서 chroot를 사용하면 중요 업데이트를 설치하여 시스템을 수정하거나 전체 부트로더를 다시 설치하여 문제를 해결할 수 있습니다.

Chroot 위키미디어
이미지 출처: 위키미디어 재단

그러나 이를 위해서는 라이브 Linux 환경이 있어야 합니다. Linux ISO를 다운로드하고 USB에서 부팅하여 부팅 가능한 USB를 만듭니다. 작업할 수 있는 라이브 환경을 제공합니다. chroot와 함께 작동하도록 시스템 파티션을 마운트하십시오.

sudo mount -t ext4 /dev/sda /mnt

작업하려는 의도한 시스템 파티션 이름으로 “/dev/sda”를 변경하고 grub 부트로더가 부트로더 문제를 해결하는 데 필요한 정보를 찾도록 합니다.

sudo mount --bind /dev /mnt/dev &&
sudo mount --bind /dev/pts /mnt/dev/pts &&
sudo mount --bind /proc /mnt/proc &&
sudo mount --bind /sys /mnt/sys

“/mnt” 디렉토리로 chroot를 하고 고장난 시스템으로 들어갑시다.

sudo chroot /mnt

시스템에 grub 부트로더를 설치, 확인 및 업데이트합니다. 적절한 드라이브 이름을 사용하고 이러한 명령을 맹목적으로 복사하여 붙여넣지 마십시오.

grub-install /dev/sda
grub-install --recheck /dev/sda
update-grub

앞에서 언급한 exit 명령을 사용하여 셸을 종료합니다. 이전에 바인딩된 디렉터리를 바인딩 해제하고 파일 시스템을 마운트 해제합니다. 해당 명령을 차례로 실행하십시오.

sudo umount /mnt/sys &&
sudo umount /mnt/proc &&
sudo umount /mnt/dev/pts &&
sudo umount /mnt/dev &&
sudo umount /mnt

PC를 재부팅하고 라이브 USB를 뽑습니다. 컴퓨터가 부팅되면 grub 부트로더가 새 것처럼 빛나고 모든 것이 완벽하게 작동합니다.

자주 묻는 질문

Chroot는 안전한가요?

Chroot는 보안을 의미하지 않습니다. 그것은 결코 하나가 될 의도가 아니었다. 보안을 위해 SELinux를 사용할 수 있습니다. 누군가를 chroot 디렉토리에 넣으면 루트 파일 시스템에 액세스할 수 없지만 시스템이 손상되지 않는다는 의미는 아닙니다. Chroot는 보안이 낮다는 의미도 아닙니다. 기본 시스템과 동일한 수준의 보안을 의미합니다. 그 이상도 그 이하도 아닙니다.

Chroot 시스템의 한계는 무엇입니까?

Chroot 시스템은 루트 사용자의 의도적인 변조를 방지하기 위한 것이 아닙니다. 일부 시스템에서 chroot된 프로그램은 자체 chroot 환경을 만들고 chroot 감옥에서 탈출할 수 있는 충분한 권한을 얻을 수 있습니다. Chroot는 완전한 격리를 의미하지 않습니다. 일반적으로 사용자 공간에서 원하는 모든 작업을 수행할 수 있습니다. 다른 프로그램을 설치할 필요가 없다면 하드웨어 장치에 액세스하고 모든 것을 마운트하고 읽을 수 있습니다. 그러면 가지고 있지 않은 루트 권한이 필요합니다.

Chroot가 감옥이라고 불리는 이유는 무엇입니까?

Chroot는 격리된 환경에 있는 것처럼 보이기 때문에 감옥이라고 합니다. 이 감옥 안에서 원하는 것은 무엇이든 할 수 있지만 루트 사용자의 허가 없이는 나갈 수 없습니다. 또한 루트 사용자가 프로비저닝한 유틸리티의 공급이 제한되어 있으며 아무 것도 설치할 수 없습니다. 이러한 모든 제한 사항에 대해 chroot 감옥이라고 합니다.

우리의 활동을 지원해주세요 ❤️

이 글이 마음에 드셨다면, 앞으로도 좋은 콘텐츠를 계속 발행할 수 있도록 팁을 남겨주세요.

페이팔로 안전하게 결제
Moyens I/O Staff는 당신에게 도움이 될 기술, 개인 개발, 라이프스타일 및 전략에 대한 팁을 제공하여 당신에게 동기를 부여했습니다.