본 문서에 대한 저작권은 명시된 작성자에게 있습니다. 문서에 대한
배포는 모두 허용하며, 내용의 정정이 필요할때는 허락을 맡으셔야
합니다. 임의로 수정하여 문서를 배포시에는 저작권법에 따라 처벌
받습니다. 오타나 잘못된 부분은 수정을 하지 않을것이며, Plat 문서
로 남기고 싶습니다. 잘 보시고, chroot 로 안전한 서버를 구축하세요
화이팅~ :=)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
━[Index] ━━━━━━━━━━━━━━━━━━━━━━━━━━━━
0x00000011. Chroot 의 이해
0x00001100. APM 정상 설치
0x00110000. 복제 파일시스템 "뷁뷁"
0x11000000. 라이브러리의 가출
0x00110000. 서버구동
0x00001100. 정말 안전할까?
0x00000011. 맺음말
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
━[Contents]━━━━━━━━━━━━━━━━━━━━━━━━━━━
0x00000011. Chroot 의 이해
Chroot 라는것은 말이 필요없습니다. 저는 개인적으로 Change Root 라고
부릅니다. 최상위디렉토리를 임시 교체하는것입니다. 즉.. 맨페이지에는
아래처럼 나와 있습니다.
NAME
chroot - run command or interactive shell with special
root directory
즉, 리눅스 시스템의 최상위디렉토리는 / 입니다. 그러나 /chroot 라는
디렉토리를 하나 생성한뒤 그 디렉토리를 최상위 디렉토리로 전환할수가
있습니다. 그것이 Chroot 이며, glibc 라이브러리로 chroot 라는 C언어
함수를 제공합니다. 이 함수를 이용해서 만들어진것이 chroot 바이너리
입니다.
뭐 성공하면 리턴값이 0 이고, 아니면 -1 을 리턴한다고 하네요.. 씨언어를 아시는
분이면 다 아실테죠..
다음으로 넘어가도록 하겠습니다.
0x00001100. APM 정상 설치
APM(Apache Php Mysql)의 묶음말이죠?
A = 공개용 아파치 웹서버 ( 80 포트를 사용 )
P = 공개용 PHP 웹프로그래밍 언어 ( <? 구문 ?> 으로 구성됨 )
M = 공개용 MYSQL 데이타베이스 서버 ( 3306 포트를 사용 )
이렇게 아파치웹서버를 기반으로 PHP언어가 작동합니다. 아파치웹서버에 PHP의 모듈
이 탑재 되는것이죠. 그리고 MYSQL 은 PHP 설정시에 디렉토리가 주어지는데 PHP 모듈
이 MYSQL 서버에 쿼리(질의문)를 보내서, 데이타베이스의 정보를 주거니 받거니 하면서
웹서버에 접속한 웹방문자에게 알맞게 조리해서 보여주게 됩니다.
이런식으로 구성된것은 웹상에 http://도메인/file.php 혹은 php3 등이나..
경우에 따라서는 htm html 까지도 PHP 스크립트는 <? 구문 ?> 형태로 파일에 삽입
되어서 작동하기도 합니다.
보시는 바와 같이 /bin 을 옴겨놓은것입니다. 원래는 웹에서 접근하는 방문자
들은 이런 명령어들을 별로 쓸일이 없기 때문에, 몇몇개만 남겨두고 지우셔도
되지만, 범용성을 위해서 그냥 두었습니다. 이곳에 있는 바이너리파일들은..
chroot 로 변환되어 /chroot 가 -> / 가 될때 그속에서 사용될 바이너리 명령
어파일들이죠.
다음은 etc 를 볼까요?
---------------------------------------------------------------------------
[root@koreasecurity bin]# cd ..
[root@koreasecurity chroot]# cd etc
[root@koreasecurity etc]# pwd
/chroot/etc
[root@koreasecurity etc]# ls
group hosts localtime my.cnf nsswitch.conf passwd resolv.conf shadow
[root@koreasecurity etc]#
---------------------------------------------------------------------------
여기에 있는 파일들은 /etc 안에 있는것을 몇개 cp 명령으로 복사한것입니다.
하나하나 기능을 설명해보겠습니다.
group : 리눅스 시스템의 유저들을 모아놓은 그룹목록이 있는 파일
hosts : 시스템에서 알고 있는 호스트들의 아이피주소/도메인/호스트명의 목록 파일
localtime : 로컬의 시간을 가지는 파일인가 봅니다. (잘모르겠군요 blabla)
my.cnf : MYSQL 의 설정파일(이것은 /etc 안에 있던것이 아닙니다. 만들어준것)
nsswitch.conf : 네임서버스위치 관련된 설정파일이군요. (별필요없을듯)
passwd : 리눅스의 계정정보가 있는 목록 파일
resolv.conf : 리눅스박스가 사용할 네임서버들이 적혀있는 파일
shadow : passwd 파일에 기재된 계정들의 암호화된 해시비밀번호가 있는 목록 파일
대략 이렇습니다. 이 파일들중 shadow 만 퍼미션을 700 으로 주고 나머지는 모두
읽기권한을 오픈된 상태로 두시면됩니다. 아래 처럼..
---------------------------------------------------------------------------
[root@koreasecurity etc]# ls -al *
-rw-r--r-- 1 root root 53 10월 28 20:20 group
-rw-r--r-- 1 root root 147 10월 28 16:46 hosts
-rw-r--r-- 1 root root 152 10월 28 16:46 localtime
-rw-r--r-- 1 root root 218 10월 29 00:13 my.cnf
-rw-r--r-- 1 root root 1750 10월 28 16:46 nsswitch.conf
-rw-r--r-- 1 root root 130 10월 28 20:19 passwd
-rw-r--r-- 1 root root 88 10월 28 16:46 resolv.conf
-rw------- 1 root root 47 10월 28 20:59 shadow
[root@koreasecurity etc]#
---------------------------------------------------------------------------
위 파일들을 복사해 오기전에 우리는 먼저 해야할 몇가지일이 있습니다.
1) www(웹서비스) 계정 만들기
계정을 만드는 명령어는 아래와 같습니다.
어떤가요? shadow 파일안에는 root의 암호화된 비밀번호가 드러나기 때문에 제거
해줬습니다. 그러나 실제의 /etc/shadow 가 아니기 때문에 걱정하실것은 없습니다.
이것으로 편집은 끝났군요.
보안을 원한다면, 이 파일들의 변조를 막기위해서 모든 작업을 마친뒤에 chattr
이라고 하는 명령어로써 파일들을 잠궈두면됩니다. 모든 파일 작업을 한뒤에..
그렇게 되면 아래처럼 chattr -i 옵션으로 풀지 않는한은 루트계정으로도 지워
지지 않습니다. chattr 은 root 계정만 사용할수 있지만.. 실제 chroot 안에는
저 파일을 복사해주지 않을것이므로, 해커가 웹을통해 접근해와도 지울수 없을
것입니다.
---------------------------------------------------------------------------
[root@koreasecurity etc]# ls
group hosts localtime my.cnf nsswitch.conf passwd resolv.conf shadow
[root@koreasecurity etc]# chattr +i *
[root@koreasecurity etc]# rm -rf *
rm: cannot chdir from `.' to `group': 디렉토리가 아닙니다
rm: cannot chdir from `.' to `hosts': 디렉토리가 아닙니다
rm: cannot chdir from `.' to `localtime': 디렉토리가 아닙니다
rm: cannot chdir from `.' to `my.cnf': 디렉토리가 아닙니다
rm: cannot chdir from `.' to `nsswitch.conf': 디렉토리가 아닙니다
rm: cannot chdir from `.' to `passwd': 디렉토리가 아닙니다
rm: cannot chdir from `.' to `resolv.conf': 디렉토리가 아닙니다
rm: cannot chdir from `.' to `shadow': 디렉토리가 아닙니다
[root@koreasecurity etc]# ls
group hosts localtime my.cnf nsswitch.conf passwd resolv.conf shadow
[root@koreasecurity etc]#
---------------------------------------------------------------------------
어떤가요? 하나도 지워지지가 않죠?
이것으로 etc 도 마치고, 다음을 살펴볼까요..
---------------------------------------------------------------------------
[root@koreasecurity etc]# cd ..
[root@koreasecurity chroot]# cd dev
[root@koreasecurity dev]# ls -al
합계 12
drwxr-xr-x 2 root root 4096 10월 28 21:45 .
drwxr-xr-x 13 root root 4096 10월 28 19:32 ..
crw-rw-rw- 1 root root 1, 3 10월 28 16:45 null
-rw-r--r-- 1 root root 16 10월 30 05:10 tty
[root@koreasecurity dev]# pwd
/chroot/dev
[root@koreasecurity dev]#
---------------------------------------------------------------------------
dev 입니다. Device(장치)들이 들어가는곳인데요. 기본적으로 하나의 장치만
만들어주면 됩니다. 그장치는 공백장치(null)입니다. 이것은 /dev/null 에 있고
그냥 복사를 해주는게 아니라 장치이기 때문에 mknod 라는것으로 생성해주어야
합니다.
---------------------------------------------------------------------------
[root@koreasecurity dev]# rm -rf null
[root@koreasecurity dev]# ls
tty
[root@koreasecurity dev]# mknod null 1 3
mknod: 인수의 개수가 잘못되었습니다
더 많은 정보를 얻으러면 `mknod --help'명령을 하십시오.
[root@koreasecurity dev]# mknod null c 1 3
[root@koreasecurity dev]# ls
null tty
[root@koreasecurity dev]# ls -al
합계 12
drwxr-xr-x 2 root root 4096 11월 1 02:37 .
drwxr-xr-x 13 root root 4096 10월 28 19:32 ..
crw-r--r-- 1 root root 1, 3 11월 1 02:37 null
-rw-r--r-- 1 root root 16 10월 30 05:10 tty
[root@koreasecurity dev]#
---------------------------------------------------------------------------
인수가 3개이군요.
앞에 c 비트가 붙어 있죠? 그것도 보고 적어준거죠
mknod null c 1 3
이렇게 해서 널 장치도 생성되었습니다. tty 라는 장치는 일부러 생성
해주지 않아도, chroot 로 로그인하면 생성되게 되어 있습니다.
다음으로..
---------------------------------------------------------------------------
[root@koreasecurity dev]# cd ..
[root@koreasecurity chroot]# cd home
[root@koreasecurity home]# ls
[root@koreasecurity home]# ls -al
합계 8
drwxr-xr-x 2 root root 4096 10월 28 16:35 .
drwxr-xr-x 13 root root 4096 10월 28 19:32 ..
[root@koreasecurity home]#
---------------------------------------------------------------------------
홈디렉토리는 실제 계정서비스를 이 chroot 안에서 하지 않을것이기 때문에
구지 필요가 없겠네요(이 디렉토리는 지우셔도 무관..)
립(라이브러리) 디렉토리는 chroot 안에서 작동하는 모든 바이너리파일들이 작동
하기 위해서 의존하는 라이브러리를 복사해둔것입니다. 이 라이브러리 파일들을
무엇이 필요한지 알수 있는가 하는것은 다음장에서 다룰것입니다.
(from.집나간 라이브러리편에서..헤헤)
lost+found 디렉토리는 실제 필요가 없지만 만들어준것입니다.(blabla)
root 디렉토리는 /root 를 모방한것으로, 없어도 무관하지만 chroot 라는것을 해
커에게 쉽게 드러나지 않게 하려는 구성입니다. 필요하다면 만드세요.
sbin 디렉토리도 /bin과 마찬가지로 필요한 툴들을 복사했는데요.
귀찮으시면 cp -R /sbin /chroot 하시면됩니다. 통째로 복사를..
다음으로 tmp 디렉토리는 임시파일들을 작업하는 디렉토리인데, 이것은 그냥 만들어
주시면 됩니다.
---------------------------------------------------------------------------
[root@koreasecurity chroot]# ls -al | grep tmp
drwxrwxrwt 2 root root 4096 11월 1 01:47 tmp
[root@koreasecurity chroot]# cd tmp
[root@koreasecurity tmp]# ls
mysql.sock
[root@koreasecurity tmp]#
---------------------------------------------------------------------------
디렉토리를 mkdir tmp 로 만든뒤에 chmod 1777 tmp 로써 권한을 줍니다.
여기서 1 은 끝에 붙은 t(temp) 비트이며, 777은 rwxrwxrwx 입니다.
rwxrwxrwx 로 권한을 주지 않으면, mysql 의 임시 소켓파일인 mysql.sock 파일이
제대로 생성되지 않아 웹서버를 구동시 오류를 내므로, 권한을 제대로 주십시오.
아..디렉토리가 참 많군요. (설명하기 힘드네요..~_~)
usr 디렉토리는 usr/local 안에 apache 랑 mysql 등이랑.. 이에 필요한 라이브러리
혹은 include(헤드)파일들과 usr/bin 파일들이 옴겨질 디렉토리에요.
살펴볼까요 ? 집중하세요 ..
---------------------------------------------------------------------------
[root@koreasecurity tmp]# cd ..
[root@koreasecurity chroot]# cd usr
[root@koreasecurity usr]# ls
bin include lib local sbin share
[root@koreasecurity usr]#
---------------------------------------------------------------------------
bin : usr/bin 을 그대로 복사해준것입니다.
include :
---------------------------------------------------------------------------
[root@koreasecurity usr]# pwd
/chroot/usr
[root@koreasecurity usr]# cd include
[root@koreasecurity include]# ls
mysql
[root@koreasecurity include]# cd mysql
[root@koreasecurity mysql]# ls
chardefs.h m_ctype.h my_net.h mysql_com.h sslopt-case.h
dbug.h m_string.h my_no_pthread.h mysql_version.h sslopt-longopts.h
errmsg.h my_config.h my_pthread.h mysqld_error.h sslopt-usage.h
history.h my_global.h my_sys.h raid.h sslopt-vars.h
keymaps.h my_list.h mysql.h readline.h tilde.h
[root@koreasecurity mysql]#
---------------------------------------------------------------------------
이 include/mysql 에는 mysql 설치시에 만들어진 헤드파일들을 옴겨놓은것인데..
원본은 /usr/include/mysql 이죠.. 그대로 옴겨오시면 됩니다. 여기 있는 것은
난중에 mysql 관련해서 사용하게 되는 씨언어 소스를 작성시에 사용하게 되겠죠
lib :
---------------------------------------------------------------------------
[root@koreasecurity usr]# cd lib
[root@koreasecurity lib]# ls
mysql
[root@koreasecurity lib]# cd mysql
[root@koreasecurity mysql]# ls
libdbug.a libmyisammrg.a libmysqlclient.so.10 libnisam.a
libheap.a libmysqlclient.a libmysqlclient.so.10.0.0
libmerge.a libmysqlclient.la libmystrings.a
libmyisam.a libmysqlclient.so libmysys.a
[root@koreasecurity mysql]#
---------------------------------------------------------------------------
mysql 설치시에 포함된 파일들을 옴겨놓은것인데, mysql 작동에 필요한 라이브
러리 파일들입니다. 설치시에 /usr/lib/mysql 에 있던것인데, 그대로 옴겨주시면
됩니다.
sbin : 이 디렉토리 역시 /usr/sbin 을 그대로 옴겨주시면 됩니다.
마지막으로 share 를 살펴볼까요..
---------------------------------------------------------------------------
[root@koreasecurity mysql]# cd ..
[root@koreasecurity include]# cd ..
[root@koreasecurity usr]# cd share
[root@koreasecurity share]# ls
man man1 man2 man3 man4 man5 man6 man7 man8 man9 mann mysql pt_BR
[root@koreasecurity share]# cd mysql
[root@koreasecurity mysql]# ls
binary-configure greek my-large.cnf portuguese
charsets hungarian my-medium.cnf romanian
czech italian my-small.cnf russian
danish japanese mysql-3.23.58.spec slovak
dutch korean mysql-log-rotate spanish
english make_binary_distribution mysql.server swedish
estonian mi_test_all norwegian ukrainian
french mi_test_all.res norwegian-ny
german my-huge.cnf polish
[root@koreasecurity mysql]#
---------------------------------------------------------------------------
역시 /usr/share 를 옴겨놓은것으로 공유파일들이 들어 있는 디렉토리죠. mysql
에 관련된 공유파일들도 있군요. 옴겨주시면 되겠네요.
---------------------------------------------------------------------------
[root@koreasecurity mysql]# cd ..
[root@koreasecurity share]# cd ..
[root@koreasecurity usr]# cd local
[root@koreasecurity local]# ls
apache bin etc include k_sec lib mysql share
[root@koreasecurity local]# pwd
/chroot/usr/local
[root@koreasecurity local]#
---------------------------------------------------------------------------
usr/local 에는 얘기햇듯이 기본설치한 /usr/local/apache 디렉토리와 mysql
디렉토리 자체를 이곳에 복사했으며, bin 역시 그렇습니다. 나머지도 복사를
했는데, 디렉토리를 살펴보면 아래와 같습니다.
---------------------------------------------------------------------------
[root@koreasecurity local]# cd etc
[root@koreasecurity etc]# ls
pear.conf
[root@koreasecurity etc]#
[root@koreasecurity etc]# cd ..
[root@koreasecurity local]# cd include
[root@koreasecurity include]# ls
php
[root@koreasecurity include]# cd php
[root@koreasecurity php]# ls
TSRM Zend acconfig.h ext main regex
[root@koreasecurity php]#
[root@koreasecurity php]# cd ..
[root@koreasecurity include]# cd ..
[root@koreasecurity local]# cd lib
[root@koreasecurity lib]# ls
php
[root@koreasecurity lib]# cd php
[root@koreasecurity php]# ls
Archive DB.php Mail.php PEAR XML doc test
Console HTTP.php Net PEAR.php build extensions
DB Mail OS System.php data pearcmd.php
[root@koreasecurity php]# cd ..
[root@koreasecurity lib]# cd ..
[root@koreasecurity local]# pwd
/chroot/usr/local
[root@koreasecurity local]# cd share
[root@koreasecurity share]# pwd
/chroot/usr/local/share
[root@koreasecurity share]# ls
info man
[root@koreasecurity share]# cd ..
[root@koreasecurity local]# cd ..
[root@koreasecurity usr]#
---------------------------------------------------------------------------
이렇게 역시 옴겨놓은것입니다. 전부 APM 에 구동에 필요한 파일들이니..
그대로 설치된 경로에 맞춰서 옴겨준것이죠. /chroot 를 / 라고 생각하고..
이해되시죠~
ㅎㅎ 한장 넘기기 돼게 힘드네요.. 다음장으로 ..
0x11000000. 라이브러리의 가출
chroot 로 /chroot -> / 로 해서 진입했을때, 사용되는 실행파일들을 작동하려는
데 오류가 난다고요? 라이브러리가 없다는둥.. 그런식의 영문으로된 오류가 나죠.
그럴땐 라이브러리 파일들이 가출을 한것이라 보면됩니다.
Ex) 가출한 자식때문에 가족들이 식탁에 둘러앉아 맛있는 저녁식사를 하지 못하고
걱정하고 있는 상태인거죠. (가족=실행파일, 자식=라이브러리파일)
그러면 어떻게 라이브러리 파일들.. 자식들을 알아보고, 홈그라운드(집안)으로 데려
오느냐? 즉 /lib 이나 /usr/lib 안에 어떤 파일들이 진정 /chroot/lib 안으로 옴겨
와야 하느냐?? 그것이 문제죠.. 간단합니다.
ldd(엘디디)라는 툴이 있습니다.
ldd 파일명
이렇게 사용하는데, 파일이 사용하는 라이브러리 파일의 경로를 모두 보여줍니다.
그러니 복사해주시면 되겠죠? 필요에 따라..(조금 귀찮긴 합니다)
/chroot 디렉토리로 상위디렉토리가 변환된뒤 아파치웹서버를 가동하고
mysql 데몬역시 가동시킵니다. 그리고 그 안에 있는게 아니라..
저 두가지 작동된 프로세스들만 /chroot 를 / 라고 착각하고 작동하게
되는것입니다. ?-.- 바보되는거죠..(babo)
이것으로 구동도 어렵지 않네요..
syslog 나 그런거에 대한것은 생략하도록 하겠습니다.
0x00001100. 정말 안전할까?
정말 안전한지 모르시겠다고요? 일반적으로 웹을 통해서 어떤식으로 접근하든지
시스템상으로 침투하기 위해서는 웹계정(www)로 쉘상에 명령어를 실행하려 할것
입니다. 그렇다면.. 이 침투한 해커들이나 혹은 PT들이..
cat /etc/passwd
라고 명령을 주면 어떻게 될까요?
실제 /etc/passwd 이 보여질까요?
아니면 /chroot/etc/passwd 가 보여질까요?
당연하죠.. 후자입니다.
아파치웹서버는 /chroot 를 / 로 생각하고 작동중이기 때문입니다.
그래서 중요한 계정들의 목록은 드러나지 않게됩니다.
또 열심히 노력(??해킹)해서 /etc/shadow 파일을 얻은들.. 아무소용이 없습니다.
왜냐? 실제로 얻는건 /chroot/etc/shadow 이기에...흑흑..
역시 중요한 데이타는 이안에 두지 않을것이기 때문에, chroot 를 깨는 기법이나.
mysql 데이타베이스에 시스템상의 root 계정 비밀번호를 남기지 않는한은 아무런
효용이 없어질것입니다.
이제 어느정도 안전하다고 볼수 있겠죠?
이 방법으로 웹을 가두는것을 chroot jail 기법이라고 부르기도 합니다.
완전하지는 않지만, 잘 관리한다면 대부분의 어리석고 준비들된 해커들의 장난으로
부터는 완전히 보호될수 있을거라 장담합니다.
이 문서의 핵심은 이것에 있는것이죠. "시스템정보보호"
0x00000011. 맺음말
3:33 분이군요. 거진 2시간 30분정도를 걸쳐, 초고속으로 쓰여진 문서인 만큼 부족
한부분이 많을것 같습니다. 부족하나마 "재구성" 이라는 측면에서 완전한 이해를 하신
다면, 이 문서가 없이도 chroot 로 자유자재로 다룰수 있을거라 생각합니다.
꼭 APM 뿐만이 아니라, 다른 서버나 파일들을 위해서 응용될수도 있겠죠?!
그럼 허기진 배를 달래고, 이만 손을 때야겠군요. :=)
이 문서는 koreasecurity.net 의 운영자인 bongjuroo(백봉주) 형의 요청에 의해서
작성된 문서로써, 필요하다면 여러곳에 배포해둘 생각이니.. 잘 읽으셨길 바랍니다.