Linux에서 chroot 명령을 사용하는 방법

chroot 명령은 감옥에 보내거나 개발 또는 테스트 환경을 격리하거나 시스템 보안을 향상시킬 수 있습니다. 가장 쉬운 사용법을 알려드립니다.

chroot가 무엇입니까?

명령의 유용성을 측정하려면 명령이 제공하는 기능과 사용 용이성을 고려해야 합니다. 사람들이 사용하기에는 너무 복잡하거나 사용하려고 하기에는 너무 오래 걸리면 기능이 0일 수도 있습니다. 아무도 그것을 사용하지 않으면 어떤 기능도 제공하지 않습니다.

Linux 사용자와 직접 또는 포럼에서 논의한 결과 chroot 명령은 사용하기 어렵거나 설정하기가 너무 까다롭고 지루한 것으로 보입니다. 이 훌륭한 유틸리티는 그렇게 많이 사용되지 않는 것 같습니다.

chroot를 사용하여 다음을 설정할 수 있습니다. 프로그램 또는 대화형 쉘 실행 일반 파일 시스템과 상호 작용할 수 없는 캡슐화된 파일 시스템의 Bash와 같은 것입니다. chroot 환경 내의 모든 것이 저장되고 포함됩니다. chroot 환경의 어떤 것도 루트 권한으로 에스컬레이션하지 않고 고유한 특수 루트 디렉토리를 볼 수 없습니다. 이는 이러한 유형의 환경에서 chroot 감옥이라는 별명을 얻었습니다. “감옥”이라는 용어는 다음과 혼동되어서는 안됩니다. FreeBSD chroot 환경을 생성하는 jail 명령 그게 더 안전하다 일반적인 chroot 환경보다.

그러나 실제로 chroot를 사용하는 매우 간단한 방법이 있습니다. 이 방법을 단계별로 살펴보겠습니다. 우리는 모든 배포판에서 작동하는 일반 Linux 명령을 사용하고 있습니다. 일부 Linux 배포판에는 다음과 같은 chroot 환경을 설정하는 전용 도구가 있습니다. 부트스트랩 Ubuntu용이지만 여기서는 배포판에 구애받지 않습니다.

언제 chroot를 사용해야 합니까?

chroot 환경은 가상 머신과 유사한 기능을 제공하지만 더 가벼운 솔루션입니다. 종속 시스템은 다음과 같이 하이퍼바이저를 설치 및 구성할 필요가 없습니다. 버추얼박스 또는 가상 머신 관리자. 또한 종속 시스템에 커널을 설치할 필요도 없습니다. 종속 시스템은 기존 커널을 ​​공유합니다.

어떤 의미에서 chroot 환경은 다음과 같은 컨테이너에 더 가깝습니다. LXC 가상 머신보다 가볍고 배포가 빠르며 하나의 생성 및 실행을 자동화할 수 있습니다. 컨테이너와 마찬가지로 컨테이너를 구성하는 한 가지 편리한 방법은 필요한 작업을 수행할 수 있을 만큼만 운영 체제를 설치하는 것입니다. “필요한 것”이라는 질문은 chroot 환경을 어떻게 사용할 것인지 살펴봄으로써 답을 얻을 수 있습니다.

몇 가지 일반적인 용도는 다음과 같습니다.

  macOS에서 여러 파일을 선택하는 방법

소프트웨어 개발 및 제품 검증. 개발자는 소프트웨어를 작성하고 제품 검증 팀(PV)은 이를 테스트합니다. 개발자의 컴퓨터에서 복제할 수 없는 문제가 PV에서 발견되는 경우가 있습니다. 개발자는 일반 사용자와 PV에는 없는 개발 컴퓨터에 모든 종류의 도구와 라이브러리를 설치했습니다. 개발자에게는 작동하지만 다른 사람에게는 작동하지 않는 새 소프트웨어가 소프트웨어의 테스트 릴리스에 포함되지 않은 개발자 PC의 리소스를 사용하는 것으로 밝혀지는 경우가 많습니다. chroot를 사용하면 개발자가 PV에 소프트웨어를 제공하기 전에 소프트웨어를 푹 담글 수 있는 일반 바닐라 종속 환경을 컴퓨터에 가질 수 있습니다. 종속 환경은 소프트웨어에 필요한 최소한의 종속성으로 구성할 수 있습니다.

개발 위험 감소. 개발자는 전용 개발 환경을 만들어 실제 PC를 엉망으로 만드는 일이 발생하지 않도록 할 수 있습니다.

사용되지 않는 소프트웨어 실행. 때로는 이전 버전을 실행해야 하는 경우가 있습니다. 이전 소프트웨어에 Linux 버전과 충돌하거나 호환되지 않는 요구 사항이 있는 경우 문제 소프트웨어에 대한 환경을 chroot할 수 있습니다.

복구 및 파일 시스템 업그레이드: Linux 설치가 작동하지 않으면 chroot를 사용하여 손상된 파일 시스템을 Live CD의 마운트 지점에 마운트할 수 있습니다. 이렇게 하면 손상된 시스템에서 작업하고 루트 /에 정상적으로 마운트된 것처럼 수정을 시도할 수 있습니다. 이는 손상된 시스템 내의 예상 파일 경로가 Live CD의 마운트 지점이 아니라 루트 디렉토리에서 올바르게 참조됨을 의미합니다. Linux 파일 시스템을 ext2 또는 ext3에서 ext4로 마이그레이션하는 방법을 설명하는 기사에서 유사한 기술이 사용되었습니다.

링펜싱 애플리케이션. chroot 환경 내에서 FTP 서버 또는 기타 인터넷 연결 기기를 실행하면 외부 공격자가 입힐 수 있는 피해가 제한됩니다. 이는 시스템 보안을 강화하는 중요한 단계가 될 수 있습니다.

chroot 환경 만들기

chroot 환경의 루트 디렉토리 역할을 할 디렉토리가 필요합니다. 해당 디렉토리를 참조하는 약식 방법이 있으므로 변수를 만들고 디렉토리 이름을 그 안에 저장합니다. 여기에서 “testroot” 디렉토리에 대한 경로를 저장할 변수를 설정합니다. 이 디렉토리가 아직 존재하지 않아도 상관없습니다. 곧 만들 것입니다. 디렉토리가 존재하는 경우 비어 있어야 합니다.

chr=/home/dave/testroot

디렉토리가 존재하지 않으면 생성해야 합니다. 이 명령으로 할 수 있습니다. -p(parents) 옵션은 누락된 상위 디렉토리가 동시에 생성되도록 합니다.

mkdir -p $chr

chroot 환경에 필요한 운영 체제 부분을 저장할 디렉토리를 만들어야 합니다. Bash를 대화형 셸로 사용하는 최소한의 Linux 환경을 설정할 것입니다. touch, rm 및 ls 명령도 포함됩니다. 그러면 Bash의 모든 내장 명령과 touch, rm 및 ls를 사용할 수 있습니다. 파일을 생성, 나열 및 제거하고 Bash를 사용할 수 있습니다. 그리고 이 간단한 예에서는 그게 전부입니다.

  아니요, 5G는 코로나바이러스를 일으키지 않습니다

{} 내에서 생성해야 하는 디렉토리 나열 버팀대 확장.

mkdir -p $chr/{bin,lib,lib64}

이제 디렉토리를 새 루트 디렉토리로 변경합니다.

cd $chr

미니멀한 Linux 환경에 필요한 바이너리를 일반 “/bin” 디렉토리에서 chroot “/bin” 디렉토리로 복사해 보겠습니다. -v(verbose) 옵션은 cp가 각 복사 작업을 수행할 때 수행하는 작업을 알려줍니다.

cp -v /bin/{bash,touch,ls,rm} $chr

파일이 복사됩니다.

이러한 바이너리에는 종속성이 있습니다. 우리는 그것들이 무엇인지 발견하고 그 파일들을 우리 환경에도 복사해야 합니다. 그렇지 않으면 bash, touch, rm, ls가 작동하지 않을 것입니다. 선택한 각 명령에 대해 이 작업을 차례로 수행해야 합니다. 우리는 먼저 Bash를 할 것입니다. ldd 명령은 종속성 나열 우리를 위해.

ldd /bin/bash

종속성이 식별되고 터미널 창에 나열됩니다.

해당 파일을 새 환경에 복사해야 합니다. 해당 목록에서 세부 정보를 선택하고 한 번에 하나씩 복사하면 시간이 많이 걸리고 오류가 발생하기 쉽습니다.

고맙게도, 우리는 그것을 반자동화할 수 있습니다. 종속성을 다시 나열하고 이번에는 목록을 구성합니다. 그런 다음 파일을 복사하는 목록을 반복합니다.

여기서 ldd를 사용하여 종속성을 나열하고 파이프를 통해 egrep에 결과를 제공합니다. egrep을 사용하는 것은 -E(확장 정규식) 옵션과 함께 grep을 사용하는 것과 같습니다. -o(일치만) 옵션은 출력을 라인의 일치하는 부분으로 제한합니다. 숫자로 끝나는 일치하는 라이브러리 파일을 찾고 있습니다. [0-9].

list="$(ldd /bin/bash | egrep -o '/lib.*.[0-9]')"

echo를 사용하여 목록의 내용을 확인할 수 있습니다.

echo $list

이제 목록이 있으므로 다음 루프를 사용하여 파일을 한 번에 하나씩 복사할 수 있습니다. 목록을 단계별로 살펴보기 위해 변수 i를 사용하고 있습니다. 목록의 각 구성원에 대해 $chr에 있는 값인 chroot 루트 디렉토리에 파일을 복사합니다.

-v(verbose) 옵션을 사용하면 cp가 각 복사본을 수행할 때 이를 알립니다. –parents 옵션은 누락된 상위 디렉토리가 chroot 환경에 생성되도록 합니다.

for i in $list; do cp -v --parents "$i" "${chr}"; done

$list에 있는 i를 위해;  cp -v --parents 수행

그리고 이것은 출력입니다:

이 기술을 사용하여 다른 각 명령의 종속성을 캡처합니다. 그리고 루프 기술을 사용하여 실제 복사를 수행합니다. 좋은 소식은 종속성을 수집하는 명령을 약간만 수정하면 된다는 것입니다.

  Linux에 Zoiper를 설치하는 방법

위쪽 화살표 키를 몇 번 눌러 명령 기록에서 명령을 검색한 다음 편집할 수 있습니다. 반복 복사 명령은 전혀 변경할 필요가 없습니다.

여기에서 위쪽 화살표 키를 사용하여 명령을 찾았고 bash 대신 touch로 표시하도록 편집했습니다.

list="$(ldd /bin/touch | egrep -o '/lib.*.[0-9]')"

이제 이전과 똑같은 루프 명령을 반복할 수 있습니다.

for i in $list; do cp -v --parents "$i" "${chr}"; done

$list에 있는 i를 위해;  cp -v --parents 수행

그리고 파일이 복사됩니다.

이제 ls에 대한 목록 명령줄을 편집할 수 있습니다.

list="$(ldd /bin/ls | egrep -o '/lib.*.[0-9]')"

다시 동일한 루프 명령을 사용합니다. 목록에 어떤 파일이 있는지는 중요하지 않습니다. 그것은 우리를 위해 파일을 복사하는 목록을 맹목적으로 작동합니다.

for i in $list; do cp -v --parents "$i" "${chr}"; done

$list에 있는 i를 위해;  cp -v --parents 수행

그리고 ls에 대한 의존성은 우리를 위해 복사됩니다:

마지막으로 list 명령줄을 편집하여 rm에서 작동하도록 합니다.

list="$(ldd /bin/ls | egrep -o '/lib.*.[0-9]')"

마지막으로 반복 복사 명령을 사용합니다.

for i in $list; do cp -v --parents "$i" "${chr}"; done

마지막 종속성은 chroot 환경에 복사됩니다. 드디어 chroot 명령을 사용할 준비가 되었습니다. 이 명령은 chroot 환경의 루트를 설정하고 셸로 실행할 응용 프로그램을 지정합니다.

sudo chroot $chr /bin/bash

이제 chroot 환경이 활성화되었습니다. 터미널 창 프롬프트가 변경되었으며 대화형 셸이 우리 환경의 bash 셸에서 처리되고 있습니다.

환경에 가져온 명령을 시험해 볼 수 있습니다.

ls
ls /home/dave/Documents

ls 명령은 환경 내에서 사용할 때 예상대로 작동합니다. 환경 외부의 디렉토리에 액세스하려고 하면 명령이 실패합니다.

touch를 사용하여 파일을 생성하고, ls를 사용하여 파일을 나열하고, rm을 사용하여 파일을 제거할 수 있습니다.

touch sample_file.txt
ls
rm sample_file.txt
ls

물론 Bash 셸이 제공하는 내장 명령을 사용할 수도 있습니다. 명령줄에 help를 입력하면 Bash가 자동으로 해당 항목을 나열합니다.

help

exit를 사용하여 chroot 환경을 종료합니다.

exit

chroot 환경을 제거하려면 간단히 삭제할 수 있습니다.

rm -r testroot/

이것은 chroot 환경에서 파일과 디렉토리를 재귀적으로 삭제합니다.

편의를 위한 자동화

chroot 환경이 유용할 수 있다고 생각하지만 설정하기가 약간 까다롭다면 별칭, 함수 및 스크립트를 사용하여 반복적인 작업에서 항상 부담과 위험을 제거할 수 있음을 기억하십시오.