본문 바로가기

우분투, 리눅스

sftp 상위폴더 접근제한(chroot)

일단 2가지 방법이 있는데요

첫번째 방법은 디렉토리 권한을 변경하여 쉽게 설정할 수 있지만 특정계정만 상위 디렉토리로 못올라가는게

아니라 모든 일반 계정이 못올라가지요.

설정하는 방법은 다음과 같습니다.

####### 첫번째 방법 ############

chmod 711 /home
chmod 711 /etc
chmod 711 /
chmod 711 /usr
chmod 711 /usr/local
chmod 711 /proc
chmod 711 /mnt
chmod 711 /opt
chmod 711 /misc
chmod 711 /dev
chmod 711 /bin
chmod 711 /boot
chmod 711 /www
chmod 711 /var

두번째 방법은 chroot 설치가 필요합니다. 설치전에 기존 sshd는 모두 삭제해야 합니다. (/etc/ssh도 모두삭제)

centos5를 기준으로 작성된 예시이며 이렇게 할경우

특정계정만 상위로 못가게 설정이 가능합니다. 하지만 몇가지 설정등 첫번째 방법보단 복잡하지요.

아래 메뉴얼은 http://system.neulwon.com/xe/?mid=linux_os&page=3&document_srl=308 를

참조하였습니다.

 # wget http://chrootssh.sourceforge.net/download/openssh-4.5p1-chroot.tar.bz2
# tar jxvf openssh*


# vi openssh-4.5p1-chroot/contrib/redhat/openssh.spec

아래의 내용을 찾아 수정해 줍니다. 

%define no_x11_askpass 0 -> %define no_x11_askpass 1
%define no_gnome_askpass 0 -> %define no_gnome_askpass 1

위와같이 변경합니다.

# rm -rf openssh-4.5p1-chroot/contrib/aix/
# rm -rf openssh-4.5p1-chroot/contrib/hpux/
# rm -rf openssh-4.5p1-chroot/contrib/caldera/
# rm -rf openssh-4.5p1-chroot/contrib/suse/
# rm -rf openssh-4.5p1-chroot/contrib/cygwin/
# rm -rf openssh-4.5p1-chroot/contrib/solaris/
 
다른 운영체제를 위한 디렉토리는 삭제해 주시구요.
본 테스트 서버의 OS는 CentOS 5.1 32bit 입니다.

# mv openssh-4.5p1-chroot openssh-4.5p1
# tar czvf openssh-4.5p1.tar.gz openssh-4.5p1/
# rm -rf openssh-4.5p1
# yum -y install openssl-devel
# rpmbuild -tb --clean openssh-4.5p1.tar.gz

 설치 시 Zlib 버전때문에 오류가 뜰 경우
 zlib 최신 버전을 설치하시고 rpmbuild 하면 된다고 합니다.

ex)
If you are in doubt, upgrade zlib to version 1.2.3 or greater.
See
http://www.gzip.org/zlib/ for details.
오류: /var/tmp/rpm-tmp.62117의 잘못된 종료 상황 (%build)

# rpm -Uvh /usr/src/redhat/RPMS/i386/openssh-4.5p1-1.i386.rpm
# rpm -Uvh /usr/src/redhat/RPMS/i386/openssh-server-.i386.rpm
# rpm -Uvh /usr/src/redhat/RPMS/i386/openssh-clients-386.rpm
# rm -f openssh-4.5p1.tar.gz
# rm -f openssh-4.5p1-chroot-tar.bz2

# vi /etc/yum.conf
exclude=openssh  를 추가해주세요,
 
# vi /etc/rc.d/init.d/sshd
 
initlog -c "$SSHD $OPTION" && success || failure
->  $SSHD $OPTION && success || failure

위 내용처럼 수정해 줍니다.
그리고

# vi /usr/sbin/chroot-useradd  해서 아래 내용대로 파일을 만들어야 합니다.

[붙여넣기 시작 ]
#!/bin/bash
#
# Usage: ./chroot-useradd username [shell]
#
# Here specify the apps you want into the enviroment
CMD="bash ls touch mkdir tar gzip cp mv rm pwd chmod cat vi id rsync ssh scp ping ssh-keygen perl"
APPS=`which $CMD`
# Sanity check
if [ "$1" = "" ] ; then
echo " Usage: ./chroot-useradd username [shell]"
exit 1
fi
# Obtain username and HomeDir
CHROOT_USERNAME=$1
if [ "$2" = "" ] ; then
useradd $CHROOT_USERNAME
else
useradd -s $2 $CHROOT_USERNAME
fi
[ $? -ne 0 ] && exit 1
usermod -d /home/$CHROOT_USERNAME/./ $CHROOT_USERNAME
passwd $CHROOT_USERNAME
chown $CHROOT_USERNAME /home/$CHROOT_USERNAME
chgrp $CHROOT_USERNAME /home/$CHROOT_USERNAME
rm -f /home/$CHROOT_USERNAME/.* > /dev/null 2>&1
HOMEDIR=`grep /etc/passwd -e "^$CHROOT_USERNAME" | cut -d':' -f 6`
cd $HOMEDIR
# Create Directories no one will do it for you
mkdir -pv $HOMEDIRetc
mkdir -pv $HOMEDIRbin
mkdir -pv $HOMEDIRusr/bin
mkdir -pv $HOMEDIRusr/libexec/openssh
mkdir -pv $HOMEDIRusr/local/bin
mkdir -pv $HOMEDIRdev
mkdir -pv $HOMEDIRlib
# Make /dev/null or sftp won't work
mknod $HOMEDIRdev/null c 1 3 -m 666
# Create short version to /usr/bin/groups
# On some system it requires /bin/sh, which is generally unnessesary in a chroot cage
echo "#!/bin/bash" > $HOMEDIRusr/bin/groups
echo "id -Gn" >> $HOMEDIRusr/bin/groups
chmod 755 $HOMEDIRusr/bin/groups
# Add some users to ./etc/paswd
grep /etc/passwd -e "^root" -e "^$CHROOT_USERNAME" > $HOMEDIRetc/passwd
grep /etc/group -e "^root" -e "^$CHROOT_USERNAME" > $HOMEDIRetc/group
# Copy the apps and the related libs
for prog in $APPS;
do
cp $prog $HOMEDIR.$prog
# obtain a list of related libraryes
ldd $prog > /dev/null
if [ "$?" = 0 ] ; then
LIBS=`ldd $prog | awk '{ print $3 }'`
for l in $LIBS;
do
mkdir -pv $HOMEDIR.`dirname $l`
cp $l $HOMEDIR.$l
# mkdir -p $HOMEDIR`dirname $l` > /dev/null 2>&1
# cp $l $HOMEDIR$l > /dev/null 2>&1
done
fi
done
# From some strange reason these libraries are not in the ldd output, but without them
# some stuff will not work, like usr/bin/groups
cp /lib/libnss_compat.so.2 $HOMEDIRlib/
cp /lib/libnsl.so.1 $HOMEDIRlib/
cp /lib/libnss_files.so.2 $HOMEDIRlib/
cp /lib/ld-linux.so.2 $HOMEDIRlib/
cp /lib/libc.so.6 $HOMEDIRlib/
cp /lib/libm.so.6 $HOMEDIRlib/
cp /lib/libpthread.so.0 $HOMEDIRlib/
cp /lib/librt.so.1 $HOMEDIRlib/
cp /lib/libthread_db.so.1 $HOMEDIRlib/
cp /etc/termcap $HOMEDIRetc/
cp /usr/libexec/openssh/sftp-server $HOMEDIRusr/libexec/openssh
exit 0

[붙여넣기 끝 ]

저장 후 아래와 같이 모드를 변경해 줍니다.

# chmod 700 /usr/sbin/chroot-useradd

여기까지 해서 메뉴얼대로 따라하긴 했는데
대~충은;; 완료가 된 듯 합니다.
자! 이제 계정을 생성해서 테스트 해 볼 차례죠. 두근두근..

# chroot-useradd 유저아이디
이제 유저가 생성이 되고, SSH 접속해서 pwd 해 보면 전에는 '/home/아이디' 로 나왔지만
지금은 ' / ' 로 나오는 것을 확인할 수 있을 겁니다.

아직까지는 CentOS 5 32bit 환경에서만 설치해봤기 때문에
다른 배포본이나 64bit 환경에서 테스트는 해보지 못했습니다.
참고로 CentOS 4.5 64bit 에서 시도하다 OS를 재설치하는 일을 겪기도 했습니다;

 

'우분투, 리눅스' 카테고리의 다른 글

c에서 웹페이지 내용 긁어오기  (0) 2010.12.24
vsftp 상위폴더 접근제한  (0) 2010.12.20
리눅스 X-Window 설치하기  (0) 2010.11.25
sendmail 설정  (0) 2010.10.21
우분투9.10 - Tomcat6 와 Apache2연동  (0) 2010.01.28