본문 바로가기
IT Security/LINUX Basic

41. Linux chroot 사용법

by Rosmary 2022. 5. 6.
728x90
반응형

 

 

 

 

 

거의 반 년만에 Linux 관련 내용에 대해 포스팅한다. 6 개월 전에만 하더라도 "다음은 이 내용에 대해 포스팅해야지" 라고 생각했는데... 다른 포스팅에서도 계속 한 이야기지만 바쁘다보니ㅠ

 

하여간 요즘 docker랑 kubernetes라는 녀석때문에 Linux 관련 내용을 학습하고 있는 상태인데, 마침 예전부터 다루어보고자 했던 chroot 내용을 접하게 되어 겸사겸사 포스팅을 진행하게 되었다. 

 


1. chroot 명령어

 

chroot는 change root의 약자다. 직역하면 'root를 변경'하는 것인데, root 계정을 변경하는 것이 아니라 Linux 시스템의 root(/) 폴더, 즉 최상위 폴더의 위치를 바꾸는 명령어다. 

 

Linux에서 특정 파일을 찾는다고 가정해보자. 예를 들어 필자가 현재 필자의 디렉토리 위치를 알기 위해 pwd 명령어를 입력했다고 해보자. 그럼 Linux 커널은 필자가 입력한 pwd 명령어 파일을 최상위 root 부터 찾아 하나씩 내려온다.

 

빨간 선을 bash로 잘못 그었다. 수정하기 귀찮다.

 

그러나 특정 폴더가 root 역할을 하도록 chroot 명령어를 사용하면 커널은 pwd 명령어를 기존 최상위 root(/)가 아닌 변경된 root 디렉토리부터 찾아 내려오게 된다. 가령, 필자가 /chroot 라는 폴더를 만들고 이 폴더를 root 폴더로 재정의했다고 해보자.

 

 

정리하자면 chroot는 사용자나 프로세스가 특정 파일시스템 구역에서 벗어나지 못하도록 울타리를 치는 역할을 한다고 보면 된다. 굳이 왜 이런 기능이 있어야하는지 의문인 분들이 있을 듯 한데, 보안 측면에서 한 번 바라보자.

 

안드로이드(Android)는 리눅스를 기반으로 동작하는 스마트폰 OS다. 리눅스 기반이다보니, root 계정의 권한이 매우 강력하다 - 모르는 분들을 위해 조금 부연 설명을 더 붙이자면 이 root 계정은 자기 자신의 시스템까지도 싸그리 없앨 수 있는 권한을 가진다 -. 만약 스마트폰 사용자에게 이 root 계정에 대해 쉽게 접근할 수 있도록 방치해둔다면? 사용자의 실수로 인해 몇 십 만원 혹은 백 만원이 넘어가는 스마트폰이 한 순간에 벽돌이 되어버릴 수 있다.

 

따라서 스마트 폰에 들어가는 안드로이드의 경우, 사용자가 함부로 루트에 접근할 수 없도록 특정 구역을 지정해두고, 사용자가 스마트폰을 사용함에 있어서 반드시 필요한 파일들만 해당 구역에 설치하게 된다. 아마 스마트폰 루팅(Rooting)을 해보신 분들이라면 이해가 빠를 것이다(이해가 잘 안 되시는 분들은 이 블로그 포스팅을 한 번 참고해보자)

스마트 폰 뿐만 아니라 리눅스를 기반으로 돌아가는 보안 솔루션(방화벽 등)도 chroot에 갇힌 환경이 사용자에게 제공된다. 스위치, 라우터, 방화벽을 CLI에서 다루어보신 분들이라면 알겠지만 명령어로 동작하는 환경임에도 불구하고 일반적인 리눅스 명령어 아닌 제품 자체의 명령어가 나타난다. 

 

Cisco 사의 ASA 방화벽 CLI 캡쳐 화면. 일반 리눅스와 명령어가 다름을 확인할 수 있다.

 

 

 

2. chroot 구축 실습

 

실습을 위해 필자는 root 역할을 할 폴더를 하나 먼저 생성하려 한다. 위에서 예시로 들은 것과 동일하게 root(/) 아래에 chroot 라는 폴더를 만들고 이 폴더가 최상위 폴더로 작동하도록 만들어보려 한다.

 

 

생성한 /chroot 폴더로 이동한 뒤, 이 곳에서 chroot 명령어를 사용하려 한다. 명령어 사용 방법은 아래와 같다. 

 

chroot {변경할 root 폴더 경로} {명령어 shell 지정}

 

Help 명령어로 man 페이지를 확인해보면 알겠지만, 명령어 shell 지정 부분은 입력하지 않는 경우 기본 shell로 지정된다. 한 번 명령어를 쳐 보자. 예상과 다르게 명령어 입력 시 오류가 나는 것을 확인할 수 있다.

 

 

사실 생각해보면 너무 당연한 오류다. /chroot를 최상위 폴더로 만들었으나 마지막 옵션인 /bin/bash가 최상위 폴더 아래에 존재하지 않기 때문에 생기는 일이다. /bin/bash가 아닌 /chroot/bin/bash을 찾으려고 하기 때문이라는 의미다. 그럼, /chroot/bin/ 경로에 bash 파일을 복사해주면 모든 이슈가 해결될까?

 

 

명령어를 복사한 상태에서 다시 chroot 명령어를 입력해보자.

 

생각했던 결과와 정 반대로 계속해서 에러가 나타난다. 무슨 이유일까?

 

명령어 파일은 한 번 컴파일이 된, 즉 사람이 작성한 명령어가 컴퓨터가 이해하기 쉬운 이진 법으로 변경된 파일이다. 대부분의 리눅스 명령어는 동작에 필요한 환경 파일을 라이브러리라는 이름으로 가지고 있다. 이 라이브러리도 종류가 나뉜다. 조금 쉽게 설명하자면, 만약 이 라이브러리가 명령어 파일 내에 존재하면 정적 라이브러리, 반대로 여러 명령어 파일과 공유를 위해 이 라이브러리가 명령어 밖에 존재한다면 동적 라이브러리라고 한다. 

 

지금과 같은 경우는 명령어 파일은 있으나 실행에 필요한 라이브러리, 특히 동적 라이브러리 파일이 /chroot 파일 아래에 없어 발생하는 에러다. 따라서 이 라이브러리들도 전부 /chroot 하위로 복사해주어야 한다. 

 

특정 명령어가 필요로하는 동적 라이브러리는 ldd 라는 명령어로 확인할 수 있다.

 

#  ldd {명령어}

 

bash 명령어가 필요로하는 동적 라이브러리는 ldd 명령어로 확인했을 때 아래와 같이 5가지가 나타난다.

 

이 라이브러리는 /lib64 폴더에 위치하고 있으므로, chroot 환경에서는 /chroot/lib64 아래에 위치해야 한다. 하나씩 복사해보자.

 

 

다시 chroot 명령어를 사용해보자. 이전과는 달리 에러가 나타나지 않고 프롬프트의 모양이 변경되는 것을 확인할 수 있다. chroot에 의해 /chroot를 최상위 폴더로 판단하기 때문에 bash와 pwd 명령어를 제외한 어떠한 명령어도 사용할 수 없다(필자는 왜 복사하지도 않은 pwd 명령어가 작동하는지 아직도 확인중이다)

 

 

실제 전체 리눅스 파일 시스템에서의 필자 위치는 /chroot지만, pwd 명령어를 치면 root(/)로 나타난다. 실제로 맞는지 확인하기 위해 ls 명령어를 써서 확인해봐야 한다. ls 명령어도 앞의 bash 명령어와 동일한 방법으로 명령어 파일과 라이브러리 파일을 복사하고 사용해보자. exit를 입력하면 chroot 환경을 빠져나올 수 있다.

 

 

pwd는 최상위폴더로 표시되나, ls -lh 결과 출력된 폴더들의 형태를 보니 /chroot에 위치하고 있음이 확인된다.

 

 

3. 특정 사용자가 로그인 시 최상위 폴더 지정하기

 

이제 필자의 리눅스에 등록된 user1이라는 사용자 계정이, ssh 접속을 하면 /home/user1 이 아닌 /chroot로 접속되도록 만들어보자. 

 

사용자의 터미널 접속, 즉 ssh와 관련된 설정은 /etc/ssh/sshd_config 파일에서 진행한다. 이 파일은 아주 오래 전에 필자가 아주 간단하게만 언급하고 넘어갔는데, 이 설정 내부에 ChrootDirectory라는, chroot와 관련된 변수가 존재한다.

 

 

기본값으로 chrootDirectory 값이 None으로 되어 있기 때문에 ssh 접속 시 /etc/passwd 파일의 home 폴더로 사용자가 접속하게 된다. 만약 특정 사용자들만 ssh 접속 시 필자가 만든 /chroot를 최상위 폴더로 인식하게 하고자 한다면 아래와 같이 진행해주면 된다. 필자는 user1, user3만 chroot에 종속시키려 한다.

 

sshd_config 파일의 마지막에 단 두 줄만 추가했는데, user1과 user3에 대해서만 chroot를 적용하기 위해 "Match User user1,user3"을 첫 줄에 입력했다. 그리고 이들 사용자에 한해서 chroot를 적용하기 위해 ChrootDirectory /chroot를 마지막 줄에 입력했다.

 

파일을 저장하고 sshd 서비스를 재실행한 뒤, user1, user2, user3 접속 시 어떠한 일이 일어나는지 확인해보자.

 

user2를 제외한 나머지는 chroot로 지정된 /chroot를 최상위 폴더로 삼음과 동시에 ssh 접속 폴더로 나타남을 확인할 수 있다. 당연히 user1, user3 계정은 아까 필자가 복사한 명령어인 bash와 ls 밖에 사용할 수 없는 상태다. 

 

SSH와 SFTP가 동일한 프로토콜 포트 번호(TCP/22)를 공유하지만, 특이하게도 SFTP는 chroot로 접속하도록 만들기 위해 별도의 설정이 더 필요한 듯 하다. 이건 추후에 포스팅 하는 것으로...

 

 

 

 

 


 

이번 포스팅에서는 chroot에 대해 알아보았다. docker와 kubernetes 때문에 이 포스팅을 찾아오신 분들이라면 보셨겠지만, chroot는 단순히 파일시스템의 격리 기능만 할 뿐, 가상화에 필요한 자원의 분할과 격리는 지원하지 않는다. 

 

다음 리눅스 포스팅은 뭘 써야될까.

 

 

Fin.

반응형

댓글