CentOS 5.6 + Chroot + Openssh5.8p1 설치 및 설정 > 개발자팁

개발자팁

개발과 관련된 유용한 정보를 공유하세요.
질문은 QA에서 해주시기 바랍니다.

CentOS 5.6 + Chroot + Openssh5.8p1 설치 및 설정 정보

MySQL CentOS 5.6 + Chroot + Openssh5.8p1 설치 및 설정

본문

Chroot 설정은 웹호스팅에서
쉘(SSH) 지원시 상위 폴더로 이동하는것을 막을 수 있는 설정 입니다.


1. APM 셋업시 깔려있던 openssh를 삭제 합니다.
root@localhost # rpm -qa|grep openssh // 명령으로 설치된 openssh 패키지 검색
root@localhost # yum -y remove openssh
root@localhost # rm -rf /etc/ssh  // 남은 폴더까지 깔끔하게 삭제
OpenBSD 홈페이지에서 OpenSSH 최신버전을 다운받을 경로를 찾습니다.
http://www.openbsd.org

2. 서버 적당한 곳으로 이동하여 OpenSSH 최신버전을  내려받습니다.
cd /usr/local/src
ftp://ftp.kaist.ac.kr/pub/OpenBSD/OpenSSH/portable/openssh-5.8p1.tar.gz // 다운로드
ftp://mirror.mcs.anl.gov/pub/openssh/portable/openssh-5.8p1.tar.gz // 다운로드
3. 압축을 해제합니다.
root@localhost src# tar xvzf openssh-5.8p1.tar.gz

4. 압축 해제한 폴더로 이동합니다.
root@localhost src# cd openssh-5.8p1

5. 설치환경을 조성하기 위한 환경설정을 합니다.
root@localhost openssh# ./configure --prefix=/usr --sysconfdir=/etc/ssh  --with-pam
6. 설치합니다.

root@localhost openssh# make && make install

7. 서비스를 사용하기 위한 파일을 가져와야 편하게 사용하실 수 있습니다.

cp contrib/redhat/sshd.pam /etc/pam.d/sshd // 설정완료된 파일 복사
cp contrib/redhat/sshd.init /etc/init.d/sshd // init.d 에도 필요하다.
chmod 700 /etc/init.d/sshd // 실행 권한 부여
chkconfig --add sshd // 서비스 추가
chkconfig --list sshd // sshd  0~6번 어쩌구 설명이 나온다.
service sshd restart // 서비스 재시작

여기까지는 서버 앞에서 또는 텔넷이나 vnc 를 이용해서 작업을 하셔야 합니다...^^

8. openssh 의 설정파일을 수정해야 한다.
vi /etc/ssh/sshd_config
# override default of no subsystems
#Subsystem      sftp    /usr/libexec/sftp-server  <---- 요거 주석처리
Subsystem      sftp    internal-sftp <---- 추가 한다.
# Example of overriding settings on a per-user basis
Match Group chrootgroup     < --- 추가 부분
        ChrootDirectory /chroot   <-- 추가 부분
#Match User anoncvs
# X11Forwarding no
# AllowTcpForwarding no
# ForceCommand cvs server
※ Match Group과 ChrootDirectory 옵션의 순서가 서로 뒤바뀌지 않도록 합니다.

위 설정에 의하면 시스템 최상위 경로에 /chroot 라는 디렉토리를 만들어 일반 계정의 쉘환경을 /chroot 에 국한시키는 겁니다. /chroot 디렉토리 하단에 bin, dev, usr, etc, sbin, var 등의 디렉토리를 동일하게 복사해 집어 넣고 home 디렉토리도 만들어 넣어 기존 home 사용자들은 /chroot/home에 위치시키면 됩니다.
그러나 /chroot/home으로 몽땅 이동시키려면 아파치 버추얼호스트 설정도 모두 변경해 주어야 하고 /etc/passwd 파일에 기록된 계정 홈디렉토리 정보도 모두 수정해야 하는 번거로움이 있기 때문에 아래와 같은 방법으로 간단하게 해결할 수 있습니다.
소스 컴파일설치와 yum 설치시에 /chroot 디렉토리 하단의 폴더가 한가지 정도가 틀려 질 수도 있습니다. ( 소스 컴파일시 temp 폴더 생성, yum 설치시 var 폴더 생성... 이는 mysql.sock 의 위치에 따라 달라 지는 것을 의미 합니다. )
※※※ 여기선 소스 컴파일 설치 방법을 예제로 만들어 것 입니다. ※※※
9. 기존 /home 디렉토리를 /chroot/home 디렉토리에 바인딩 마운트시키면 간단하게 해결됩니다.
[root@localhost ~]# mkdir -p /chroot/home
[root@localhost ~]# mount --bind /home /chroot/home

10. 시스템 시작시 자동으로 마운트되도록 /etc/rc.d/rc.local 파일에 마운트 커맨드를 추가해 줍니다.
[root@localhost ~]# echo "mount --bind /home /chroot/home" >> /etc/rc.d/rc.local
이제 chroot를 적용할 시스템 계정의 그룹 소유권을 chrootgroup으로 변경합니다. chrootgroup이라는 이름의 그룹은 아까 /etc/ssh/sshd_config 파일에 추가한 Match Group 옵션에 지정해 준 그룹명으로 지정하는 것입니다.

[root@localhost ~]# groupadd -g 499 chrootgroup
시스템 바이너리, 라이브러리 및 환경설정 파일 복사
 이제 제한된 쉘에서 사용을 허용할 시스템 커맨드 세팅을 위해 앞서 언급했던 /chroot 디렉토리 하단에 bin, dev, usr, etc 관련 시스템 디렉토리 및 파일을 복사해 넣는 작업을 해주면 됩니다.
[root@localhost ~]# cd /chroot
[root@localhost ~]# mkdir bin dev etc lib tmp usr sbin

 우선 null, zero와 같은 특수파일을 만들어 줍니다.
[root@localhost ~]# mknod dev/null c 1 3
[root@localhost ~]# mknod dev/zero c 1 5

 실행 바이너리와 이에 연관된 각종 라이브러리를 복사해 넣어줍니다. 작업 요령은 간단합니다.
 우선 시스템 커맨드 중 하나인 cp를 예로 들어보겠습니다.
 cp 커맨드의 절대 경로는 아래와 같네요.
[root@localhost ~]# which cp
/bin/cp
[root@localhost ~]#

 ldd 커맨드로 바이너리 실행에 필요한 라이브러리를 파악할 수 있습니다.
[root@localhost ~]# ldd /bin/cp
        linux-gate.so.1 =>  (0xb7fa8000)
        libacl.so.1 => /lib/libacl.so.1 (0x48d0d000)
        libselinux.so.1 => /lib/libselinux.so.1 (0x48968000)
        libc.so.6 => /lib/libc.so.6 (0x477c0000)
        libattr.so.1 => /lib/libattr.so.1 (0x48d06000)
        libdl.so.2 => /lib/libdl.so.2 (0x47906000)
        libsepol.so.1 => /lib/libsepol.so.1 (0x48982000)
        /lib/ld-linux.so.2 (0x477a2000)
[root@localhost ~]#
 위에 출력된 내용을 참고하여 관련 라이브러리 원본 및 심볼릭링크 파일을 복사해 넣어주면 됩니다.
/lib/libacl.so.1 은 /chroot/lib/libacl.so.1 로 복사하면 되는 것이죠.

11. 실서비스를 위한 세부 설정
 그러나 여기까지 작업을 마쳐도 실질적으로 chroot 환경의 ssh 서비스를 하기에는 미흡합니다.
 지금까지의 설정만으로는 제한된 쉘을 이용하는 일반 사용자들이 /chroot 로 가두어진 쉘을 이용한다 하더라도 다른 계정 사용자들의 홈디렉토리로는 마음대로 이동이 가능하다는 단점이 남게 됩니다. 이는 chroot 설정으로 가두어진 쉘을 이용하는 모든 계정들을 하나의 그룹으로 묶고 각 계정 홈디렉토리의 그룹 퍼미션을 0으로 만들면 해결할 수 있습니다.
 그러므로 /etc/ssh/sshd_config 파일에 정의했던 Match Group chrootgroup 옵션에 따라 /chroot/home 안의 사용자들은 모두 chrootgroup에 속하게 하고 각 계정 홈디렉토리 안의 모든 디렉토리와 파일의 그룹 퍼미션을 0으로 만들면 되겠죠. 이렇게 하면 chrootgroup 그룹에 속한 모든 계정은 오직 자신의 계정 디렉토리 내용만 읽기 및 쓰기, 실행이 가능하고 타 계정 사용자의 홈디렉토리는 접근 자체가 불가능하게 됩니다.
 우선 /chroot/home 하단의 모든 디렉토리 및 파일의 그룹 소유권을 chrootgroup으로 변경합니다. 아파치 웹서버의 경우 웹게시판 등을 통해 웹상에서 첨부파일로 업로드된 데이터나 nobody 또는 apache 소유권이어야 정상 작동하는 웹소스의 경우 nobody 또는 apache 소유권을 그대로 유지하여야 하므로 무작정 일괄 변경해서는 안됩니다.
 nobody 또는 apache 소유권 확인은 httpd.conf 파일에서 확인이 가능 하다. 아래 예제는 nobody 소유권일때 적용한 예이다. 소유권 확인에 대해서 잘 모른다면 아래 예제대로 해도 무방하다...^^;;

[root@localhost ~]# find /chroot/home \( ! -user nobody -o ! -group nobody \) -exec chown .chrootgroup {} \;
 그리고 아래와 같이 명령을 내려 /chroot/home 하단의 chrootgroup에 속한 모든 계정의 디렉토리와 파일의 그룹퍼미션을 0으로 만듭니다.
[root@localhost ~]# find /chroot/home -group chrootgroup -exec chmod g-w-r-x {} \;

그렇게 해서 설정한 /chroot 하단의 디렉토리 및 파일의 소유권 및 퍼미션 구성도를 정리하면 아래와 같습니다.
[root@localhost /]# ls -lh / | grep chroot
drwx--x--x 10 root chrootgroup 4.0K  4월 21 23:07 chroot
drwx--x--x  3 root chrootgroup 4.0K  6월 14 08:36 home     <--퍼미션 711로 변경한다.
[root@localhost /]# ls -lh /chroot
합계 40K
drwx--x--x 2 root root        4.0K  4월 21 23:07 bin
drwx--x--x 2 root root        4.0K  4월 21 23:06 dev
drwx--x--x 4 root root        4.0K  4월 21 23:07 etc
drwx--x--x 3 root chrootgroup 4.0K  6월 14 08:36 home
drwx--x--x 2 root root        4.0K  6월 14 08:23 lib
drwx--x--x 2 root root        4.0K  4월 21 23:07 sbin
drwxrwxrwt 4 root root        4.0K  6월 14 08:36 tmp
drwx--x--x 6 root root        4.0K  4월 21 23:08 usr
[root@localhost /]# ls -lh /chroot/home
합계 12K
drwx-----x 3 apachezone apachezone 4.0K  6월 14 08:36 apachezone
drwx-----x 3 jsb        jsb        4.0K  6월 14 08:50 jsb
drwx-----x 3 myhome     myhome     4.0K  6월 14 08:51 myhome
[root@localhost /]#
위에 보이는것과 같이 동일하게 퍼미션과 소유권이 되어 있어야 정상적으로 작동 합니다.
 이제 타 계정 홈디렉토리로 이동하려 하면 퍼미션 금지 에러가 뜨는 것을 확인할 수 있을 것입니다.
 ※ 위에 소개한 소유권/퍼미션 일괄 변경 방법은 시스템에 따라 돌이킬 수 없는 사태를 야기할 수 있으므로 맹목적으로 무작정 따라하지 마시길 바랍니다. 될 수 있으면 find 커맨드 바로 뒤의 경로 설정을 최소한도로 국한시켜가며 차근차근 테스트하며 진행하시길 바랍니다.
 이제 root가 아닌 일반계정으로 ssh에 접속하여 시스템 최상위 경로로 이동해 보면 /가 아닌 /chroot 경로에 가두어진 쉘환경임을 확인할 수 있습니다.
 그리고 기존의 데이터 뿐만이 아닌 앞으로 쉘상에서 새롭게 생성할 계정도 그룹 퍼미션 환경을 0으로 만들어줄 필요가 있겠죠.
 새롭게 생성할 계정 GID를 모두 chrootgroup으로 지정하고 UMASK 설정을 통해 그룹퍼미션을 제거합니다.
[root@localhost ~]# cat /etc/default/useradd
# useradd defaults file
GROUP=499
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/bash
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes
[root@localhost ~]# cat /etc/login.defs  | grep UMASK
UMASK           072

 이젠 일반사용자들이 쉘에 접속했을 때 처음 만나게 되는 프롬프트 모양을 결정지으며 원활한 커맨드 및 편집기 사용을 위한 일반사용자 전용의 쉘 환경변수를 새롭게 정의해 줄 필요가 있습니다. chroot 환경의 쉘에 접속하는 일반 사용자는 /chroot/etc/bashrc 파일의 설정을 지배받게 되므로 이를 적절히 수정하면 됩니다. /etc/bashrc 파일을 복사해와 편집기로 열어 상단 부분을 한 번 보겠습니다.
[root@localhost ~]# cp /etc/bashrc /chroot/etc/
[root@localhost ~]# head -n 13 /chroot/etc/bashrc
# /etc/bashrc
# System wide functions and aliases
# Environment stuff goes in /etc/profile
# By default, we want this to get set.
# Even for non-interactive, non-login shells.
if [ $UID -gt 99 ] && [ "`id -gn`" = "`id -un`" ]; then
        umask 002
else
        umask 022
fi
 붉은색으로 표시한 스크립트 조건문에 의하면 UID가 99보다 크면서 UID와 GID 값이 같은 경우 umask 002를 적용하고 그 외의 경우는 022를 적용하라는 의미입니다.
 /etc/passwd 파일에서 UID가 99인 사용자를 확인하면 nobody이죠.
 nobody보다 UID가 크면서 UID와 GID값이 같은 계정은 useradd 커맨드로 생성하는 /home 아래의 일반사용자들의 경우가 대표적입니다 결국 root나 일반계정으로 bash 쉘에 로그인 후 디렉토리나 파일을 생성하면 별다른 이유가 없는 한 umask 002를 적용하게 되는 것입니다.
 쉘상에서 UID나 GID를 확인하는 데에 관계되는 커맨드나 환경설정 파일도 없기 때문에 /chroot/etc/bashrc 파일 상에서의 위 설정 내용은 수정이 필요합니다.
 답은 간단합니다. 위 붉은색 부분을 삭제하고 아래 한 줄로 대신하면 됩니다.
umask 072
 어차피 chrootgroup으로 묶은 일반사용자들만 chroot로 제한된 쉘에 접속할 것이기 때문에 쉘스크립트의 조건문 등으로 예외 상황을 가정할 필요 없이 위의 단 한 줄 만으로 umask를 선언하면 되는 것입니다.
 
 
 하단부의 불필요한 부분도 모두 제거하여 최적화시킨 bashrc 파일의 내용은 아래와 같습니다.
[root@localhost:/chroot/etc]# cat /chroot/etc/bashrc
# /etc/bashrc
# System wide functions and aliases
# Environment stuff goes in /etc/profile
# By default, we want this to get set.
# Even for non-interactive, non-login shells.
        umask 072
# vim:ts=4:sw=4
alias vi='vim'
alias grep='grep --color=auto'
alias ll='ls -alhF --color=tty --show-control-chars'
alias mysqldump='/usr/local/mysql/bin/mysqldump'     <-- 이부분이 중요하다. 경로가 정확해야 쉘(shell)상에서 mysqldump 를 사용 할 수 있다.
alias mysql='/usr/local/mysql/bin/mysql'             <-- 이부분이 중요하다. 경로가 정확해야 쉘(shell)상에서 mysql 을 사용 할 수 있다.
PS1="\[\033[1;31m\][SSH:\w]$ \[\033[0;37m\]"
붉은색으로 굵게 표시한 부분은 프롬프트 형태를 결정짓는 변수값으로 딱히 정해진 방법이 있는게 아니니 입맛에 맞게 수정해서 사용하면 됩니다.
alias mysql 관련 경로는 my.cnf 에서 확인이 가능 하다. 찾을수없다면
find -name mysqldump 를 이용해서 경로를 찾으면 된다...^^
ssh 로그인 시 뜰 안내문은 /chroot/etc/motd 파일로 설정하면 됩니다.
[root@localhost:/chroot/etc]# cat motd
#############################################
#                                                                                                 #
#                                                                                                 #
# * 타인계정이나 불법자료에 대한 접근은 헤킹이나 크래킹으로              #
#   간주되어 형사고발 및 불이익을 받으실수 있습니다                          #
#                                                                                                 #
#                                                                                                 #
#############################################


 mysql을 운영하는 경우 일부 mysql 쉘커맨드 중 /tmp/mysql.sock을 참고하게 되는데 chroot 환경의 쉘에서도 사용하려면 /chroot/tmp에도 mysql.sock를 위치시켜야 합니다. 바인딩 마운트로 해결 가능합니다.
 소스 컴파일 설치와 yum 설치는 mysql.sock 경로가 다를 수 있으니 주의 해야 한다. 아래 예제는 소스 컴파일시 적용된 예제이다.
[root@localhost:~]# chmod 1777 /chroot/tmp
[root@localhost:~]# mount --bind /tmp /chroot/tmp

시스템 시작시 자동으로 적용되도록 /etc/rc.d/rc.local 파일에 커맨드를 추가합니다.
[root@localhost:~]# echo "mount --bind /tmp /chroot/tmp" >> /etc/rc.d/rc.local

이렇게 설정한 각종 시스템 디렉토리 및 파일들의 변조를 원천 봉쇄하기 위해 chattr 커맨드로 수정/복사/삭제 속성을 제거합니다. 이렇게 하면 그나마 chroot 환경의 쉘에 들어와서 뻘짓을 감행하려는 시도조차 불가능해집니다.
[root@localhost:~]# chattr +i -R /chroot/lib
[root@localhost:~]# chattr +i -R /chroot/usr
[root@localhost:~]# chattr +i -R /chroot/etc
[root@localhost:~]# chattr +i -R /chroot/bin
[root@localhost:~]# chattr +i -R /chroot/dev
[root@localhost:~]# chattr +i -R /chroot/sbin
[root@localhost:~]# chattr -i /chroot/etc/passwd  -  수정이 가능 하도록 속성을 복구 해 줍니다. *중요*

작업이 모두 끝났으므로 SSH로 자신의 계정으로 접속 해보자.
그런데 퍼미션 권한이 없다고 나오는것이 몇개가 생긴다. 이것은 해당 파일의 퍼미션을
/chroot 폴더 내부에 복사한 bin, dev, etc, lib, sbin, usr, var 등.. 내부의 파일들의 속성을 711, 755, 등으로적절히 변경 해 주어야 한다.
 이 외에도 세밀하게 설정해야 할 부분들이 여럿 있을 수 있습니다.
특히 vi 편집기와 관련된 환경설정파일과 라이브러리와 관련된 디렉토리 및 파일 설정이
처음 시도하는 분들께는 다소 까다로운 작업이 될 수 있겠습니다.
검색 신공만이 답이겠죠.
저 같은 경우는 chroot 설정을 해보면서 쉘을 구성하는 환경설정 파일들에 대해 좀 더 깊은 이해를 할 수 있었습니다.
쉘스크립트에 대해서도 기초적인 이해의 필요성을 새삼 깨닫게 해준 보람된 작업이었다고나 할까요?
암튼 이 문서가 chroot 설정을 시도하려는 분들께 조금이나마 도움이 되었음 하는 바입니다.

소스 컴파일 설치와 yum 설치시 mysql 관련 실행 파일과 myslq.sock 의 경로가 달라 주의를 해야 합니다. find 나 그밖의 다른 방법으로 해당 파일을 찾아 경로를 수정 해 주셔야 쉘(shell) 상에서 mysql의 정상적인 사용이 가능 하다는것을 다시 한번 강조 합니다.


더 많은 정보는 블로그에 포스트 합니다.

퍼가시는것은 자유이나 출처는 남겨 주세요....^^

출처 : http://www.apachezone.com/blog/?id=8
[이 게시물은 관리자님에 의해 2011-10-31 17:32:05 Linux에서 이동 됨]
추천
1
  • 복사

댓글 8개

© SIRSOFT
현재 페이지 제일 처음으로