검색 엔진의 방문이 늘어나고 있군...

Posted
Filed under 프로그램과 명령어/서버와 서비스
참조 원문 : How to automatically chroot jail selected ssh user logins

1. 소개
  이 글에서는 사용자 그룹을 기반으로 ssh를 사용하여 로그인하는 특정 그룹의 사용자들에게 chroot jail을 적용시키는 방법을 소개합니다 .이 기술은 특정 사용자들에게 제한된 시스템 환경을 제공하면서도 메인 시스템에 접근하지 못하게 할 때 유용합니다.

2. 기본 chroot 환경 제작
  먼저 간단한 chroot 환경을 만들어야 합니다. 리눅스인 만큼 bash를 사용하는 것으로 간주하고 환경을 제작할 것입니다. chroot 대상 디렉토리는 /var/chroot로 간주합니다. 먼저 해당 디렉토리를 mkdir /var/choot 명령어로 생성합니다. 그 다음으로 bash 바이너리와 관련 공유 라이브러리를 모두 복사해야 합니다. ldd 명령어를 통해 bash의 공유 라이브러리 목록을 볼 수 있습니다.
$ ldd /bin/bash
    linux-vdso.so.1 =>  (0x00007fff017ff000)
    libtinfo.so.5 => /lib64/libtinfo.so.5 (0x0000003ef9800000)
    libdl.so.2 => /lib64/libdl.so.2 (0x0000003eeac00000)
    libc.so.6 => /lib64/libc.so.6 (0x0000003eea800000)
    /lib64/ld-linux-x86-64.so.2 (0x0000003eea000000)
  이제 필요한 디렉토리들을 모두 수동으로 만들고 bash와 관련 라이브러리를 새로운 chroot 디렉토리 밑에 적절한 위치로 복사합니다.
# cd /var/chroot/
# mkdir bin/ lib64/ lib64/
# cp /lib64/libtinfo.so.5 lib64/
# cp /lib64/libdl.so.2 lib64/
# cp /lib64/libc.so.6 lib64/
# cp /lib64/ld-linux-x86-64.so.2 lib64/
# cp /bin/bash bin/
  이제 모든 준비가 끝났으므로 chroot를 할 수 있는지 테스트합니다.
# chroot /var/chroot
bash-4.1# ls /
bash: ls: command not found
  하지만 복사한 건 bash 뿐이므로 쉘 내장 명령어가 아니라면 아직 어떤 명령어도 사용할 수 없습니다. 지금까지 했던 걸 매 명령어마다 모두 반복할 순 없으므로 아래의 bash 스크립트를 이용해 한 번에 처리합니다.
#!/bin/bash
# This script can be used to create simple chroot environment
# Written by LinuxCareer.com <http://linuxcareer.com/>
# (c) 2013 LinuxCareer under GNU GPL v3.0+

#!/bin/bash

CHROOT='/var/chroot'
mkdir $CHROOT

for i in $( ldd $* | grep -v dynamic | cut -d " " -f 3 | sed 's/://' | sort | uniq )
  do
    cp --parents $i $CHROOT
  done

# ARCH amd64
if [ -f /lib64/ld-linux-x86-64.so.2 ]; then
   cp --parents /lib64/ld-linux-x86-64.so.2 /$CHROOT
fi

# ARCH i386
if [ -f  /lib/ld-linux.so.2 ]; then
   cp --parents /lib/ld-linux.so.2 /$CHROOT
fi

echo "Chroot jail is ready. To access it execute: chroot $CHROOT"
  이 스크립트는 chroot로 사용할 디렉토리까지 생성하므로 이전에 사용했던 /var/chroot 디렉토리를 삭제하고 아래처럼 복사할 명령어들과 파일들의 풀 패스를 인자로 넣어 실행합니다. 명령어의 풀 패스는 which 명령어로 알아보는 것이 좋습니다.
./chroot.sh /bin/{ls,cat,echo,rm,bash,vi} /etc/hosts
ldd: warning: you do not have execution permission for `/etc/hosts'
Chroot jail is ready. To access it execute: chroot /var/chroot
  출력된 에러는 /etc/hosts 파일이 실행 파일이 아니라서 ldd가 작동하지 않았기 때문에 발생한 것이므로 문제 될 건 없습니다. 이제 chroot jail을 테스트합니다.
# chroot /var/chroot
bash-4.1# echo linuxcareer.com > file
bash-4.1# cat file
linuxcareer.com
bash-4.1# rm file
bash-4.1# ls
bin  etc  lib64

3. chroot 용 그룹 생성
  sshd가 chroot jail의 대상으로 삼을 그룹을 생성합니다. 여기서는 chrootjail이라는 그룹을 생성하여 사용할 것입니다.
# groupadd chrootjail

4. chroot jail을 위한 sshd 설정
  chrootjail 그룹에 속한 사용자가 ssh로 접속 시 /var/chroot로 chroot jail이 되도록 설정합니다. /etc/ssh/sshd_config 파일에 아래 내용을 추가하면 됩니다.
Match group chrootjail
            ChrootDirectory /var/chroot/
  그리고 ssh를 재시작합니다.
# sudo service ssh restart
  이제 chrootjail 그룹에 속한 사용자를 생성하여 테스트합니다. 한 가지 유의할 점은 원래 홈 디렉토리가 아닌 chroot jail 내의 홈 디렉토리도 별도로 생성해야 한다는 것입니다. 그렇지 않으면 사용자는 로그인 후 chroot jail 내의 / 디렉토리로 가게 됩니다.
# mkdir /var/chroot/home
# cp -rp ~tester/ /var/chroot/home/
# useradd tester -g chrootjail
# passwd tester
Changing password for user tester.
New password:
Retype new password:
# service sshd restart
Stopping sshd:                                             [  OK  ]
Starting sshd:                                             [  OK  ]
# ssh tester@localhost
tester@localhost's password:
Last login: Sun Jul  7 21:14:29 2013 from localhost
-bash-4.1$ pwd
/home/tester
  물론 /etc 디렉토리의 환경설정 파일들 부재나 쉘 환경 등의 문제 때문에 이후 자신에게 필요한 추가적인 작업들을 해야 할 것입니다.
2013/07/07 21:30 2013/07/07 21:30