chroot 를 이용한 ssh/sftp 에서 상위폴더 이동 금지하기 > server

본문 바로가기

server

chroot 를 이용한 ssh/sftp 에서 상위폴더 이동 금지하기

작성일 15-07-22 11:57

페이지 정보

작성자서방님 조회 267회 댓글 0건

본문

1. chroot 란?
]# whatis chroot
chroot (1) - run command or interactive shell with special root directory 
chroot (2) - change root directory 
일반적으로 루트 디렉토리를 변경하거나 현재 프로세스의 루트 디렉토리를 임이의 디렉토리로 변경하는데 사용된다.

2. chroot 활용법
openssh 에서 chroot 를 제공하기 위해서는 chrootssh 이 필요하다.

기본적으로 openssh 에서 제공은 하지는 않지만 http://chrootssh.sourceforge.net/ 에서 프로젝트를 진행하고 있다. 필요한 소스 다운받기 : http://chrootssh.sourceforge.net/download/ 에서 사용자가 원하는 최신의 패치파일이나 패치가 첨가 되어있는 openssh-chroot 를 받는다. 하지만 테스해본 결과 openssh-chroot 소스를 컴파일하면 문제가 발생하지 않았으나 diff 를 이용한 패치는 이루어지지 않아 컴파일 후 결과를 제대로 확인 할수 없었다. 하지만 최신버전 openssh-4.2p1-chroot.tar 를 다운로드 받으면 큰 무리없이 설치가 가능하다. 

]# tar zxvf openssh-4.2p1-chroot.tar.gz 
]# ./configure --prefix=/usr --sysconfdir=/etc/ssh --with-tcp-wrappers --with-ipv4-default --with-ssl-dir=/usr/include/openssl 
]# make
]# make install


init 스크립트에 서비스를 등록시킨다. 

]# cp openssh-4.2p1-chroot/contrib/redhat/sshd.init /etc/init.d/ssh
]# cd /etc/init.d 
]# chkconfig --add ssh

설정에 앞서 기본으로 리눅스서버를 구성할 경우 일반 계정으로 접근시 ssh 상위 접근이 가능하다는 것을 다음에서 볼수 있다.

[linux@ns /]$ id
uid=528(linux) gid=529(linux) groups=529(linux)
[linux@ns /]$ cd /
[linux@ns /]$ pwd
/
[linux@ns /]$ ls
bin  boot  dev  etc  home  initrd  lib  lost+found  mirror  mnt  proc  root  sbin  tmp  usr  var  www
[linux@ns /]$ df
Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/hda3              1035692    219540    763540  23% /
/dev/hda1               256667     20072    223343   9% /boot
/dev/hda5             10080488     32944   9535476   1% /home
none                    253572         0    253572   0% /dev/shm
/dev/hda9              1035660     32956    950096   4% /tmp
/dev/hda2              3020172   1135608   1731144  40% /usr
/dev/hda7              4032092    344212   3483056   9% /usr/local
/dev/hda10             1035660    347688    635364  36% /var
[linux@ns /]$

이런경우는 상위 퍼미션을 701 로 막는다고 하여도 정확한 경로나 파일이름을 알고 있을 경우 누구나 파일을 볼수 있다는 말이 된다. 따라서 chroot 를 사용할 경우 가상의 디렉토리를 루트로 가정하기 때문에 일반사용자는 관리자가 추가한 명령어에 대해서만 파일을 사용할수 있고 디렉토리 또한 가정한 디렉토리만 볼수 있게 된다.. 

일반적인 계정을 생성하면 /home 밑에 계정이 생성된다. 
]# cd /home
]# cat  chroot.sh      // 스크립트 생성을 한다.
#!/bin/sh

CHROOT_DIR=/home/
REQUIRED_CHROOT_FILES="  /bin/cp
                         /bin/ls
                         /bin/mkdir
                         /bin/mv
                         /bin/rm
                         /bin/cat
                         /bin/vi
                         /bin/rmdir
                         /bin/sh
                         /bin/bash
                         /usr/libexec/sftp-server
                         /lib/libnss_files.so.2"

# Create CHROOT_DIR
[ ! -d $CHROOT_DIR ] && mkdir $CHROOT_DIR
cd $CHROOT_DIR

# Copy REQUIRED_CHROOT_FILES and shared library dependencies
# to chroot environment

for FILE in $REQUIRED_CHROOT_FILES
do
   DIR=`dirname $FILE | cut -c2-`
   [ ! -d $DIR ] && mkdir -p $DIR
   cp $FILE `echo $FILE | cut -c2-`
   for SHARED_LIBRARY in `ldd $FILE | awk '{print $3}'`
   do
      DIR=`dirname $SHARED_LIBRARY | cut -c2-`
      [ ! -d $DIR ] && mkdir -p $DIR
      [ ! -s "`echo $SHARED_LIBRARY | cut -c2-`" ] && cp $SHARED_LIBRARY
      `echo $SHARED_LIBRARY | cut -c2-`
   done
done

# Create device files
mkdir $CHROOT_DIR/dev
mknod $CHROOT_DIR/dev/null c 1 3
mknod $CHROOT_DIR/dev/zero c 1 5

# Create chroot /etc/passwd placeholder
mkdir $CHROOT_DIR/etc
touch $CHROOT_DIR/etc/passwd


]# chmod 755 chroot.sh   // 실행 퍼미션
]# chroot /home               // chroot 확인

bash-2.05b#                    // 기본적인 설정으로 인한 bash 쉘이다.
bash-2.05b# cd /
bash-2.05b# ls                
bin  chroot.sh  dev  etc  lib  linux  usr

--> ls 을 했을때 chroot 설정을 하긴 전과는 다른 디렉토리를 볼수 있을 것이다. 이 파일들은 사용자가 만든 디렉토리이다.

마지막으로 사용자 계정 홈디렉토리를 변경해야 한다. 
]# vi /etc/passwd
추가한 사용자에 대해서만 변경을 한다.
linux:x:528:529::/home/./linux:/bin/bash                  

변경후
linux 계정으로  ssh 접속시 
-bash-2.05b$                         // bash 쉘이 출력된다. 이는 호스트 명령어에 대해서 스크립트 파일에
                                                 넣지 않았기 때문이다.
-bash-2.05b$  cd /                 // 이 쉘에서는 관리자가 만들었던 디렉토리를 루트로 가정을 한다.

/* 참고 사항 */ 
위의 스크립트는 사용자가 사용하기에 부족한 점이 많기 때문에 추가적인 작업이 필요하다. 
그리고 mysql 을 사용시 mysql.sock 파일이 /tmp 디렉토리에 생기기 때문에 이는 링크로는 사용이 불가능하다. 
따라서 이를 해결하기 위해서는 기존 /tmp 디렉토리를 /home/tmp 로 마운트를 시켜주어야 한다. 
]# mount /tmp /home/tmp -o bind 
]# df
/tmp                   1035660     32964    950088   4% /home/tmp
a

댓글목록

등록된 댓글이 없습니다.

전체 356건 12 페이지
게시물 검색
Copyright © 서방님.kr All rights reserved.
PC 버전으로 보기