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 를 다운로드 받으면 큰 무리없이 설치가 가능하다.
이런경우는 상위 퍼미션을 701 로 막는다고 하여도 정확한 경로나 파일이름을 알고 있을 경우 누구나 파일을 볼수 있다는 말이 된다. 따라서 chroot 를 사용할 경우 가상의 디렉토리를 루트로 가정하기 때문에 일반사용자는 관리자가 추가한 명령어에 대해서만 파일을 사용할수 있고 디렉토리 또한 가정한 디렉토리만 볼수 있게 된다..
일반적인 계정을 생성하면 /home 밑에 계정이 생성된다.
변경후
/* 참고 사항 */
위의 스크립트는 사용자가 사용하기에 부족한 점이 많기 때문에 추가적인 작업이 필요하다.
그리고 mysql 을 사용시 mysql.sock 파일이 /tmp 디렉토리에 생기기 때문에 이는 링크로는 사용이 불가능하다.
따라서 이를 해결하기 위해서는 기존 /tmp 디렉토리를 /home/tmp 로 마운트를 시켜주어야 한다.
/tmp 1035660 32964 950088 4% /home/tmp
]# 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/sshd
]# cd /etc/init.d
]# chkconfig --add sshd
설정에 앞서 기본으로 리눅스서버를 구성할 경우 일반 계정으로 접근시 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
댓글목록
등록된 댓글이 없습니다.