chroot
유닉스 운영 시스템의 chroot는 현재 실행 중인 프로세스와 그것의 자식 프로세서에 대해 명백한 루트 디렉토리를 변경하는 작업입니다. 그러한 수정된 환경에서 실행되는 프로그램은 지정된 디렉토리 트리 외부의 파일에 이름을 지정할 수 없습니다 (그리고 따라서 통상적으로 접근할 수 없습니다). 용어 "chroot"는 chroot(2) 시스템 호출 또는 chroot(8) 래퍼 프로그램을 참조할 수 있습니다. 수정된 환경은 chroot jail이라고 합니다.
Usage
데비안이 설치된 시스템이 부팅이 되지 않아, 현재 가진 라이브 시디 또는 설치 이미지로 부팅 후에 데비안으로 들어가는 과정입니다.
- 하모니카 이미지는 라이브 모드로 부팅됩니다.
- 우분투 이미지는 부팅 후에, Try Ubuntu를 선택하면, 라이브 모드로 진입합니다.
- 데비안 이미지는 debian-live로 시작하는 이미지를 받아야 하는 것으로 보입니다. 보통의 설치 이미지는 라이브 모드로 부팅이 되지 않는 것으로 보입니다. 알려주세요!
먼저, 터미널 프로그램을 실행합니다:
- sudo fdisk -l
Device Start End Sectors Size Type
/dev/sda1 2048 4095 2048 1M BIOS boot
/dev/sda2 4096 1054719 1050624 513M EFI System
/dev/sda3 1054720 41940991 40886272 19.5G Linux filesystem
위에서 리눅스 파티션은 하나뿐이므로, 그것이 root 파티션임을 알 수 있습니다. 아래와 같이 진행하십시오:
- sudo mount /dev/sda3 /mnt
- 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
- sudo mount --bind /run /mnt/run
- sudo chroot /mnt
만약 특정 파일을 데비안으로 옮겨야 한다면, 첫 번째 mount 후에 마지막 mount 전에 해당 파일을 /mnt 아래로 복사해야 합니다.
만약 리눅스 파티션이 여러개 있어서, root 파티션을 알 수 없을 때에는 하나를 마운트해서 root 파티션인지 확인을 해야 합니다. 만약 그것이 루트 파티션이 아니면, 해당 디바이스를 언마운트하고, 다른 파티션을 마운트해서 확인을 하십시오.
루트 파티션이 확인되면, 그 파티션을 /mnt에 마운트한 후에, /mnt/etc/fstab을 볼 수 있습니다. 그 파일이 UUID로 제공되어서, 마운트가 힘들 때에는 아래의 두 가지 정도를 시도해 볼 수 있습니다.
먼저, uuid를 디바이스 이름의 표시되는 것을 읽습니다:
- ls -og /dev/disk/by-uuid/
또는 UUID로 직접 마운트를 시도할 수 있습니다:
- sudo mount UUID="0377eb2d-31c1-42f1-913b-bbe29c1bdfa1" /mnt/home
- 뒤의 디렉토리는 /mnt/etc/fstab에서 읽은 것을 사용해야 합니다. 위의 예제는 해당 uuid가 /home 파티션을 나타내는 것입니다.
만약 네트워크을 사용하고 싶다면, 마지막 chroot 명령 후에 다음 파일을 수정합니다:
- nano /etc/resolv.conf
- nameserver 8.8.8.8
위의 주소는 구글 주 네임서버의 ip입니다.
둘 이상의 운영 시스템을 같은 디스크에 사용하고 있다면, 다른 운영 시스템, 예를 들어 윈도우의 파티션은 마운트 등의 행위를 하지 마시기 바랍니다!! 또한, 시스템과 무관한 홈 디렉토리 등을 별도의 파티션으로 두셨다면, 이것도 마운트하지 마시기 바랍니다!!
다른 경우로써, 부트로더에 문제가 생겨서, GNU_GRUB#GRUB 2 Command Shell를 수행하는 것보다는 이 과정 후에 부트로더를 고치는 것이 더 쉬울 수 있습니다.
History
chroot 시스템 호출은 1979년 버전 7 유닉스 개발 중에 도입되었습니다. 한 소식통은 Bill Joy가 설치 및 빌드 시스템을 테스트하기 위해 – 4.2BSD가 출시되기 17개월 전 – 1982년 3월 18일에 그것을 추가했다고 제안합니다.[1] 커널을 가졌던 모든 버전의 BSD는 chroot(2)를 가집니다.[2][3] chroot에 적용된 용어 "jail"의 초기 사용은 1991년에 해커를 모니터링하기 위한 허니팟을 만들었던 Bill Cheswick에서 비롯되었습니다.[4]
탈옥에 대한 첫 번째 기사는 Carole Fennelly에 의해 작성된 SunWorld Online의 보안 칼럼에서 논의되었습니다; 1999년 8월과 1999년 1월 판은 대부분의 chroot() 주제를 다룹니다.[5]
그것을 가상화에 유용하게 만들기 위해, FreeBSD는 개념을 확장했고 2000년 4.0 릴리스에서 jail 명령을 도입했습니다.[6]
2002년까지, Nicolas Boiteux에 의해 작성된 기사는 리눅스에서 jail을 만드는 방법을 설명했습니다.[7]
2003년까지, 리눅스 jail을 갖는 최초의 인터넷 마이크로서비스 제공업체는 사용량에 따라 jail에서 소비에 대해 청구된 SAAS/PAAS (쉘 컨테이너, 프록시, ircd, 봇, ...) 서비스를 제공합니다.[8]
2005년까지, Sun은 "스테로이드의 chroot"로 설명되는 Solaris Containers (역시 Solaris Zones이락고 알려져 있음)를 출시했습니다.[9]
2008년까지, LXC (나중에 Docker가 구축됨)는 "컨테이너" 용어를 채택하고[10] 리눅스 커널 3.8에 포함된 사용자 이름공간으로 인해 2013년에 인기를 얻었습니다.[11]
Uses
chroot 환경은 소프트웨어 시스템의 별도의 가상화된 복사본을 만들고 호스팅하기 위해 사용될 수 있습니다. 이것은 다음과 같은 경우에 유용할 수 있습니다:
- 테스팅과 개발
- 테스트 환경은 생산 시스템에 배포하기에 너무 위험한 소프트웨어에 대해 chroot에서 설정될 수 있습니다.
- 의존성 제어
- 소프트웨어는 오직 예상된 종속성으로 채워진 chroot에서 개발, 빌드 및 테스트될 수 있습니다. 이것은 개발자로부터 설치된 프로그램 라이브러리의 다른 집합을 갖는 프로젝트를 빌드할 때 발생할 수 있는 일부 종류의 연결 왜곡을 방지할 수 있습니다.
- 호환성
- 다른 ABI를 사용하는 레거시 소프트웨어 또는 소프트웨어는 때때로 chroot에서 실행되어야 하는데 왜냐하면 지원 라이브러리 또는 데이터 파일이 호스트 시스템의 그것들과 함께 이름 또는 링크와 충돌할 수 있기 때문입니다.
- 복원
- 시스템을 부팅할 수 없게 되면 대체 루트 파일 시스템 (예를 들어, 설치 미디어 또는 Live CD)에서 부트스트랩한 후 chroot를 사용하여 손상된 환경으로 다시 이동할 수 있습니다.
- 권한 분리
- 프로그램은 열린 파일 설명자 (파일, 파이프라인 및 네트워크 연결에 대해)를 chroot로 전달할 수 있으며, 이것은 작업 파일을 chroot 디렉토리에 남겨둘 필요가 없도록 만듦으로써 jail 설계를 단순화할 수 있습니다. 이것은 역시 보안 침해를 선제적으로 억제하기 위해 샌드박스에서 권한 있는 프로그램의 잠재적으로 취약한 부분을 실행하는 일반적인 배열을 단순화합니다. chroot는 반드시 루트 권한이 있는 프로세스를 포함하기에 충분하지 않음을 주목하십시오.
Limitations
chroot 메커니즘은 권한이 있는 (루트) 사용자의 의도적인 변조를 방지하기 위한 것이 아닙니다. 대부분의 시스템에서, chroot 컨텍스트는 적절하게 스택되지 않고 충분한 권한을 가진 chroot된 프로그램이 시스템을 깨뜨리기 위해 두 번째 chroot를 수행할 수 있습니다. 이 보안 취약점의 위험을 완화하기 위해, chroot된 프로그램은 chroot된 후 가능한 한 빨리 루트 권한을 포기하거나 FreeBSD jail과 같은 다른 메커니즘을 대신 사용해야 합니다. FreeBSD와 같은 일부 시스템은 두 번째 chroot 공격을 방지하기 위해 예방 조치를 취함을 주목하십시오.[12]
보토의 파일시스템에서 장치 노드를 지원하는 시스템에서, chroot된 루트 사용자는 여전히 장치 노드를 만들고 파일 시스템을 마운트할 수 있습니다; 따라서 chroot 메커니즘은 그 자체로 권한이 있는 사용자에 의해 시스템 장치에 낮은-수준 접근하는 것을 차단하기 위해 사용되지 않습니다. 그것은 I/O, 대역폭, 디스크 공간 또는 CPU 시간과 같은 리소스 사용을 제한하기 위해 의도된 것이 아닙니다. 대부분의 유닉스는 완전히 파일 시스템-지향적이지 않고 chroot된 프로그램에 대한 시스템 호출 인터페이스를 통해 사용할 수 있는 네트워킹 및 프로세스 제어와 같은 잠재적으로 파괴적인 기능을 남겨둡니다.
시작 시, 프로그램은 특정 사전-설정 위치에서 스크래치 공간, 구성 파일, 장치 노드 및 공유 라이브러리를 찾을 것으로 예상합니다. chroot된 프로그램에 대해 성공적으로 시작하려면, chroot 디렉토리가 이들 파일의 최소 집합이 채워져 있어야 합니다. 이것은 chroot를 일반적인 샌드박싱 메커니즘으로 사용하기 어렵게 만들 수 있습니다. Jailkit와 같은 도구는 이 프로세스를 용이하게 하고 자동화하기 위한 도움이 될 수 있습니다.
오직 루트 사용자가 chroot를 수행할 수 있습니다. 이것은 사용자를 특수하게 조작된 chroot jail (예를 들어, 가짜 /etc/passwd 및 /etc/shadow 파일 포함) 내부에 setuid 프로그램을 넣어 권한 상승으로 속이는 것을 방지하기 위한 것입니다.
일부 유닉스는 이들 제한 사항 중 적어도 일부를 해결하기 위해 chroot 메커니즘의 확장을 제공합니다 (운영 시스템-수준 가상화 기술의 구현을 참조하십시오).
Graphical applications on chroot
다음과 같은 방법을 사용하여 chroot 환경에서 그래픽 응용 프로그램을 실행할 수 있습니다:[13][14]
- xhost 사용 (또는 .Xauthority로부터 비밀 복사)
- Xnest 또는 더 최신 Xephyr와 같은 중첩된 X 서버 (또는 jail 내부에서 실제 X 서버 시작)
- X11 포워딩 (ssh -X) 기능을 사용하여 SSH를 통해 chroot에 접근하기
- xchroot – 사용자와 Xorg/X11 포워딩 (socat/mount)을 위한 chroot의 확장 버전
- X11 VNC 서버와 환경 외부에서 VNC 클라이언트 연겴하기.
Notable applications
Postfix 메일 전송 에이전트는 개별적으로 chroot된 도우미 프로그램의 파이프라인으로 작동합니다.
그것 전의 4.2BSD와 마찬가지로, 데비안과 우분투 내부 패키지-빌드 농장은 패키지 사이의 의도하지 않은 빌드 종속성을 포착하기 위해 chroot를 광범위하게 사용합니다. SUSE는 build 프로그램과 유사한 방법을 사용합니다. Fedora, Red Hat 및 다양한 RPM-기반 배포판은 mock과 같은 chroot 도구를 사용하여 모든 RPM을 빌드합니다.
POSIX 시스템에 대해 많은 FTP 서버는 신뢰할 수 없는 FTP 클라이언트를 샌드박스하기 위해 chroot 메커니즘을 사용합니다. 이것은 들어오는 연결을 처리하는 프로세스를 분기하고, 그런-다음 자식을 chroot함으로써 수행될 수 있습니다 (프로그램 시작에 필요한 라이브러리를 갖는 chroot를 채워야 하는 것을 피하기 위해).
만약 권한 분리가 활성화되면, OpenSSH 데몬은 각 클라이언트에 대해 사전-인증 네트워크 트래픽을 처리하기 위해 권한이 없는 도우미 프로세스를 빈 디렉터리로 chroot할 것입니다. 데몬은 chroot에서 SFTP 및 쉘 세션을 샌드박스할 수도 있습니다 (버전 4.9p1 이상).[15]
Chrome OS는 Crouton을 사용하여 리눅스 인스턴스를 실행하기 위해 chroot를 사용할 수 있으며,[16] 하드웨어 리소스에 접근할 수 있는 가벼운 OS를 제공합니다. 이 문서와 관련된 보안 관련 사항이 여기에 적용됩니다.
Linux host kernel virtual file systems and configuration files
리눅스에서 기능적 chroot 환경을 가지기 위해, 커널 가상 파일 시스템과 구성 파일이 역시 호스트에서 chroot로 마운트/복사되어야 합니다.
# Mount Kernel Virtual File Systems
TARGETDIR="/mnt/chroot"
mount -t proc proc $TARGETDIR/proc
mount -t sysfs sysfs $TARGETDIR/sys
mount -t devtmpfs devtmpfs $TARGETDIR/dev
mount -t tmpfs tmpfs $TARGETDIR/dev/shm
mount -t devpts devpts $TARGETDIR/dev/pts
# Copy /etc/hosts
/bin/cp -f /etc/hosts $TARGETDIR/etc/
# Copy /etc/resolv.conf
/bin/cp -f /etc/resolv.conf $TARGETDIR/etc/resolv.conf
# Link /etc/mtab
chroot $TARGETDIR rm /etc/mtab 2> /dev/null
chroot $TARGETDIR ln -s /proc/mounts /etc/mtab
See also
References
- ^ "jail, section 9". docs.freebsd.org.
- ^ Losh, Warner (February 2, 2000). "Warner's Random Hacking Blog: Whither chroot?".
- ^ "Data Infrastructures for the rest of us - III - software".
- ^ Cheswick, Bill (1991). "An Evening with Berferd: In Which a Cracker is Lured, Endured, and Studied" (PDF). USENIX Summer Conference Proceedings, Volume 1. USENIX. San Francisco, California: The Association. p. 163.
- ^ Carole, Fennelly. "Escap Chroot". SunWorld Online. Carole Fennelly. Archived from the original on 2000-01-09.
- ^ Riondato, Matteo. "FreeBSD Handbook "Jails" Chapter". freebsd.org. The FreeBSD Project. Retrieved 2018-10-30.
- ^ Nicolas, Boiteux. "chroot shell". lycos.fr. Nicolas Boiteux. Archived from the original on 2002-10-14. Retrieved 24 March 2018.
- ^ "Girafon". girafon.org. girafon. Archived from the original on 2004-06-12. Retrieved 24 March 2018.
- ^ Schmidt, Klaus (2006-09-02). High Availability and Disaster Recovery: Concepts, Design, Implementation. Springer Science & Business Media. p. 186. ISBN 9783540345824. Retrieved 2014-08-21.
- ^ "SourceForge LXC Download Files". sourceforge.net. Retrieved 2014-08-21.
- ^ Rosen, Rami (2014-03-26). "Linux Containers and the Future Cloud" (PDF). Retrieved 2014-08-21.
- ^ "chroot(2)". www.freebsd.org.
- ^ "Development/Howto/Chroot". Mandriva Wiki. 25 July 2011. Archived from the original on 2014-03-26.
- ^ "Archived copy". Archived from the original on 2011-08-31. Retrieved 2011-10-13.
{{cite web}}: CS1 maint: archived copy as title (link) - ^ "sshd_config(5) manual page". 2017-10-26. Retrieved 2018-02-04.
- ^ "Chromium OS Universal Chroot Environment (on github)". Retrieved 2016-12-17.
External links
- : change root directory – FreeBSD System Calls Manual
- : change root directory – FreeBSD System Manager's Manual
- : change root directory – Linux Programmer's Manual – System Calls
- Integrating GNU/Linux with Android using chroot