RSS구독하기:SUBSCRIBE TO RSS FEED
즐겨찾기추가:ADD FAVORITE
글쓰기:POST
관리자:ADMINISTRATOR
출처 블로그 > 『해킹.... 속임수의 예술....』
원본 http://blog.naver.com/zsup1343/60003541855
1.소개


아파치를 chroot하에 운영하는 방법은 몇가지가 있지만 여기에선
아파치 소스에 패치를 해서 chroot를 적용하는 방법에대해 기술하고있다.
*nix에서 운영되는 각종 데몬들(ftpd, named, etc)이 chroot를적용해
운영되는 추세로 보인다.
웹서버의 보안 취약점과 chroot에 관한것은 plus의 문서를 참고하기바란다.
http://www.plus.or.kr/book/SecurityPLUS-2nd/node10.html


다른방법으로 chroot를 적용하는 방법은 아래링크를 참고하기 바란다.
http://www.linuxfocus.org/English/January2002/article225.shtml
http://www.networkdweebs.com/chroot.html


시스템을 chroot상태로 운영하는 jail프로젝트와 apache를 chroot적용시켜
같이 운영한다면 좀더 안전한 서버운영이 될것으로 생각된다.

jail project
http://free4u.dnip.net/weblog/stories.php?story=01/10/24/5067801



2.패치파일 다운로드


패치다운로드 사이트 - http://home.iae.nl/users/devet/apache/chroot/

위사이트의 패치는 apache-1.3.26버전용이지만 버전에 상관없이(1.3.x대)
패치가 적용되는 패치파일도 있으니 그것을 받기바란다.

apache-1.3.26용 패치
http://home.iae.nl/users/devet/apache/chroot/apache_1.3.26.chroot.patch
(위의 경로에서 받기가 힘들다면 아래경로에서 받을 수 있다.)
http://free4u.dnip.net/docs/apache/apache_1.3.26.chroot.patch

기타 버전용 패치
http://home.iae.nl/users/devet/apache/chroot/patch-zz
(위의 경로에서 받기가 힘들다면 아래경로에서 받을 수 있다.)
http://free4u.dnip.net/docs/apache/patch-zz



3.설치

일단 apache, php의 소스를 적당한 디렉토리에 풀어놓는다
여기에선 /www를 예로들겠다.
#pwd
/www/src
phpinfo등에서 아파치 버전등을 숨기려면apache소스디렉토리의 이름을
변경하면된다.(ex httpd, webserver)
그리고 apache데몬 자체의 이름과 버전등을 숨기거나 변조하려면
아래링크를 참고하라.
http://free4u.dnip.net/weblog/stories.php?story=01/08/08/6470343

필요에 따라서 php의 버전도 숨기거나 변조할수있다.
/www/src/php/main/php_version.h열어서 적당히 수정하면된다.
이제 apache소스에 패치를 한다.

/www/src/apache디렉토리에 patch-zz를 옮겨놓고(1.3.26용도 같다)
patch -p0 < patch-zz 명령으로 패치를 한뒤 에러(reject등)가 나는지 확인한다.
몇몇 hunk가 나는데 별문제는 없다.

여기서부터는 일반적인 apache, php, mysql의 소스컴파일 작업과 같이
설치작업을 하면 된다.


3가지 모두 설치가 끝났으면 apache configure시 prefix로 지정한
디렉토리의 conf/httpd.conf파일을 열어서 아래와 같은 설정이 있는지
확인한다.

4. 환경설정

#file httpd.conf
# ChrootDir: The directory to chroot to
#
# NOTE: When using this all directory/file references in DocumentRoot,
# and should be relative to this ChrootDir!
#
#ChrootDir "/some/path"

위의 설정에서 주석을 풀고 (여기에선 /www/를 chroot디렉토리로 예를든다)
ChrootDir "/www"
ServerRoot "/www/httpd" 로 설정을 했다면 apache가 인식하는 시스템 "/"는
"/www"로 대체된다. 또한 ServerRoot역시 /www/httpd로 설정

DocumentRoot "/www/httpd/htdocs"와 같이 /chroot_fir/serverroot_dir/htdocs
의경로로 인식하게 설정이 된다.
당연히 html문서의 링크등은 시스템루트로 설정하면 안된다. chroot디렉토리인
/www를 벗어날수가 없기때문이다.

모든 html,php등의 링크, include등은 chroot_dir인 /www/httpd/htdocs이하만
정상적으로 동작하게된다.


#php.ini설정

php.ini에 zendoptimizer,phpa등을 설치해사용했었다면
/www/lib등의 디렉토리를 만들고 php.ini에서 경로를 수정하면 동작할것이다.
php역시 apache의module로 동작을 하게되어서 시스템 "/"에는 접근할수가 없고
"/www"를 시스템 "/"로 인식하게된다.

아래ZendOptimizer설정에서 "/Zend" 는 /www/Zend가 될것이다.
zend_extension=/Zend/lib/ZendOptimizer.so

기존에 jail시스템을 설치해서 운영했다면
jail설치시 설정한 chroot디렉토리와 chroot패치된apache의 시스템루트를
같게 설정한다면 유저와 웹서버 모두 chroot된 상태로 좀더 안전한
시스템 운영이 가능할것이다.

기존 jail시스템과 apache, php, mysql을 통합운영시
mysqld의 sock파일의 위치가 중요한데 일단 아파치가 접근가능한곳에
소켓파일이 위치해야한다.
apache의 chroot디렉토리인 /www/tmp등이 적당하다.
기존에 사용하던 my.cnf파일을 /www/etc/에 카피후 기존의 mysqld의 starting
script를 열어 기존경로의 것을 /www/mysql로 수정후 실행하고
mysql데몬이 실행되지 못하고 죽거나 한다면 /www/mysql/data/*.log파일등을
확인해서 문제를 해결해야하겠다.

/www/etc/my.cnf예제는 아래를 참고하라.
###########################################################
[client]
password =
port = 3306 #필요에 의해 포트는 변경할수있다.
socket = /www/var/lock/mysql.sock

[mysqld]
password =
port = 3306
socket = /www/var/lock/mysql.sock
##########################################################

그리고 기존의 웹보드등도 설정파일에서 mysql.sock파일의 위치를 수정해야
mysql db를 사용할수 있을것이다.
위의 설정에서 각 웹보드의 소켓위치 경로는
:/www/var/lock/mysql.sock이 될것이다.
----------------------------------------------------------
여기부터는 jail시스템을 운영하면서 chroot된 apache와 같이 운영할때의
설정을 얘기하겠다.

웹보드(jsboard, zeroboard, etc) 혹은 php의 mail()함수 사용시 메일이
정상적으로 보내지지 않는다.

php가 시스템에 설치된 sendmail을 자동으로 설정해서 sendmail을 실행하는데
시스템의 sendmail위치는 /usr/sbin이기때문에 /www/usr/sbin디렉토리를 만들고
sendmail이 정상실행가능하도록 sendmail, 라이브러리와 설정파일들을 카피해야한다.
ldd /usr/sbin/sendmail 명령으로 sendmail실행파일이 참조하는
공유 라이브러리를찾는다.
다음과 비슷한 메세지를 보여줄것이다.

[root@free4u:/]#ldd /usr/sbin/sendmail
libnsl.so.1 => /lib/libnsl.so.1 (0x40020000)
libsasl.so.7 => /usr/lib/libsasl.so.7 (0x40036000)
libgdbm.so.2 => /usr/lib/libgdbm.so.2 (0x40040000)
libdb-3.1.so => /lib/libdb-3.1.so (0x40046000)
libresolv.so.2 => /lib/libresolv.so.2 (0x400bf000)
libcrypt.so.1 => /lib/libcrypt.so.1 (0x400d1000)
libdl.so.2 => /lib/libdl.so.2 (0x400ff000)
libc.so.6 => /lib/i686/libc.so.6 (0x40103000)
libpam.so.0 => /lib/libpam.so.0 (0x4023f000)
/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)

이제 /www디렉토리아래에 원래의 시스템과 같이 /etc, /lib, /usr, /usr/bin,
/usr/sbin등의 디렉토리를 만든다(jail시스템을 설치했다면 이미 만들어져
있을것이다.물론 jail시스템 운영에 필요한 파일들도 카피가 되어있을것이다.)

차례대로 원래의 시스템 경로와 같이 /www/lib/, /www/usr/lib등에 라이브러리를
카피한다.
라이브러리카피가 끝났다면 sendmail이 정상적으로 실행될수있도록
sendmail이 참조하는 /etc/mail 디렉토리를 /www/etc/mail디렉토리로
카피한다.그리고 /etc/passwd에서 mail유저에 해당하는 필드를 복사해서
/www/etc/passwd에 추가한다.

/www/var/spool/clientmqueue 디렉토리를 만들고 소유권을 root.mail그룹으로
변경한다
- clientmqueue와 mail디렉토리 퍼미션은 755이상 줘야한다 -

(혹은 기존 /var/spool/clientmqueue디렉토리를 복사해도 된다.물론
퍼미션은 유지한채로 복사해야한다)

역시 같은 방법으로 /www/var/spool/mail 디렉토리를 만들고 소유권은
clientmqueue와 같이 설정한다.

또한 /etc/shadow에서도 mail유저에 해당하는 필드를 /www/etc/shadow에 추가한다.

php.ini에서 snedmail의 경로는 주석처리된 기본값으로 사용한다.
설정이 정확히 됐다면 chroot된 apache의 모듈인 php에서 폼메일등으로
메일을 보냈다면 sendmail은 /www/usr/sbin/sendmail이 실행되고
실제 메일데이타는 /var/spool/mail/user_name으로 저장될것이다.

웹메일등의 프로그램으로 정상적으로 메일이 도착하는지 확인하는것으로 sendmail
설정이 끝났다.
2006/09/11 10:34 2006/09/11 10:34
이 글에는 트랙백을 보낼 수 없습니다
웅쓰:웅자의 상상플러스
웅자의 상상플러스
전체 (379)
게임 (5)
영화 (2)
기타 (23)
맛집 (5)
영어 (2)
대수학 (3)
형태소 (5)
Hacking (9)
Linux (112)
HTML (48)
Application_developing (48)
Web_developing (102)
Window (11)
«   2024/04   »
  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30        
  1. 2016/01 (1)
  2. 2015/12 (3)
  3. 2015/10 (3)
  4. 2015/03 (2)
  5. 2015/01 (4)