작성자 : EcusE http://free4u.wo.tc
수정:
2003.05.14 (php의 버전수정 파일 변경 php_version.h -> configure.in)
2007.06.25 (사이트 내부 url 변경,패치 제작자 사이트 url 수정, etc...)
(apache 1.x대의 패치만 있습니다. 2.x대에서는 사용할수 없습니다)
modsecurity를 사용중이라면 간단하게 apache를 chroot상태로 운영할 수 있습니다.
아래 링크를 참고하세요.
http://free4u.wo.tc/10189
1.소개
아파치를 chroot하에 운영하는 방법은 몇가지가 있지만 여기에선
아파치 소스에 패치를 해서 chroot를 적용하는 방법에대해 기술하고있다.
*nix에서 운영되는 각종 데몬들(ftpd, bind, 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 projrct
http://free4u.wo.tc/831
2.패치파일 다운로드
패치다운로드 사이트 - http://www.devet.org/apache/chroot/
위사이트의 패치는 apache-1.3.37버전용이지만 버전에 상관없이(1.3.x대) 패치가 적용되는 패치파일도
있으니 그것을 받기바란다.
apache-1.3.37용 패치
http://www.devet.org/apache/chroot/apache_1.3.37.chroot.patch
기타 버전용 패치
http://www.devet.org/apache/chroot/patch-zz
3.설치
일단 apache, php의 소스를 적당한 디렉토리에 풀어놓는다.
여기에선 /www를 예로들겠다.
#pwd
/www/src
phpinfo등에서 아파치 버전등을 숨기려면apache소스디렉토리의 이름을 변경하면된다.(ex httpd, webserver)
그리고 apache데몬 자체의 이름과 버전등을 숨기거나 변조하려면 아래링크를 참고하라.
필요에 따라서 php의 버전도 숨기거나 변조할수있다.
/www/src/php/configure.in열어서 적당히 수정하면된다.
이제 apache소스에 패치를 한다.
/www/src/apache디렉토리에 patch-zz를 옮겨놓고(1.3.26용도 같다)
patch -p1 < patch-zz 명령으로 패치를 한뒤 에러(reject등)가 나는지 확인한다.
몇몇 hunk가 나는데 별문제는 없다.
여기서부터는 일반적인 apache, php, mysql의 소스컴파일 작업과 같이 설치작업을 하면 된다.
3가지 모두 설치가 끝났으면 apache configure시 prefix로 지정한 디렉토리의 conf/httpd.conf파일을
열어서 아래와 같은 설정이 있는지 확인한다.
4. 환경설정
-
4-1. apache 설정
-
-
#file httpd.conf
-
# ChrootDir: The directory to chroot to
-
#
-
# NOTE: When using this all directory/file references in DocumentRoot,
-
# <Directory> and <Files> 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이하만
-
정상적으로 동작하게된다.
-
-
-
4-2. php 설정
-
#file 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파일등을
확인해서 문제를 해결해야하겠다.
-
4-3. mysql 설정
-
-
/www/etc/my.cnf예제는 아래를 참고하라.
-
#file 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이 될것이다.
----------------------------------------------------------
5.웹 프로그램등
여기부터는 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 설정이 끝났다.
'Security' 카테고리의 다른 글
CUPS, libpng 모듈의 버퍼오버플로우 취약점 패치 (1) | 2003.01.14 |
---|---|
BIND4와 BIND8의 원격 다중 취약점 (0) | 2002.11.14 |
Trojan Horse가 내포된 Sendmail 배포 (0) | 2002.10.10 |
Linux.Slapper 웜 (7) | 2002.09.15 |
sendmail 도움말 숨기기(?) (0) | 2002.09.02 |