· KLDP.org · KLDP.net · KLDP Wiki · KLDP BBS ·
Docbook Sgml/ChrootAPM

Chroot 로 안전한 WebServer/MySQL 구축하기

Chroot 로 안전한 WebServer/MySQL 구축하기

정경주

                    
                

1 November 2003, DocBook Edit by pibonazi (at) hotmail.com : 3 November 2003


본 문서에 대한 저작권은 명시된 작성자에게 있습니다. 문서에 대한 배포는 모두 허용하며, 내용의 정정이 필요할때는 허락을 맡으셔야 합니다. 임의로 수정하여 문서를 배포시에는 저작권법에 따라 처벌 받습니다. 오타나 잘못된 부분은 수정을 하지 않을것이며, Plat 문서로 남기고 싶습니다. 잘 보시고, chroot 로 안전한 서버를 구축하세요 화이팅~ :=).


1. Chroot 의 이해

Chroot 라는것은 말이 필요없습니다. 저는 개인적으로 Change Root 라고 부릅니다. 최상위디렉토리를 임시 교체하는것입니다. 즉.. 맨페이지에는아래처럼 나와 있습니다.

NAME
	chroot  -  run  command  or interactive shell with special root directory
	

즉, 리눅스 시스템의 최상위디렉토리는 / 입니다. 그러나 /chroot라는 디렉토리를 하나 생성한뒤 그 디렉토리를 최상위 디렉토리로 전환할수가 있습니다. 그것이 Chroot 이며, glibc 라이브러리로 chroot 라는 C언어 함수를 제공합니다. 이 함수를 이용해서 만들어진것이 chroot 바이너리 입니다.

---------------------------------------------------------------------------
[root@localhost root]# ls -al /usr/sbin/chroot
-rwxr-xr-x    1 root     root        11232  2월 19  2003 /usr/sbin/chroot
[root@localhost root]#
---------------------------------------------------------------------------
	

그러나, 아무디렉토리나 지정하고 교체하려고 한다면 분명 실패할것입니다. 그 디렉토리안에는 필요한것이 있는데, 기본적으로 쉘파일과 쉘이 구동하기에 필요한 라이브러리가 모두 있어야합니다. 그리고 필요한 설정파일들도 넣어주면 좋습니다. 즉..

/chroot/bin
/chroot/etc
/chroot/lib
/chroot/usr
/chroot/tmp
/chroot/var
/chroot/dev
	

이런 식으로 디렉토리와 필요한 파일들을 재구성하는것입니다. 실제 리눅스 상위디렉토리처럼 말이죠. 이해하셨습니까?

bin 안에는 우리가 사용할 바운스쉘(bash) 도 필요하고, chroot 안에서 사용할 바이너리 파일들도 필요하겠죠? 이를테면 ls , cp , mv , rm ,mkdir ....

etc 안에는 뭐.. chroot 안에서만 사용할 복제판 passwd , shadow , group hosts .... 몇몇개만 있으면 되겟죠?

lib 안에야 말할것도 없습니다. chroot 로 진입한뒤에 작동할 바이너리 파일들이 필요로하는 라이브러리파일은 모두 여기에 복사해주면 됩니다.

usr 안에는 /usr/local/apache/usr/local/mysql 를 원래의 시스템에 설치된 경로로 할것이기 때문에 난중에 아파치나 데이타베이스서버 구동에 필요한 파일을 그대로 옴겨주면 되겠죠? 디렉토리 자체..;;

tmp 에는 필요업죠 뭐..

var 도 별건 없고 run 디렉토리나 logs 디렉토리를 만들어주면 됩니다.

마지막으로 dev 같은경우는 주로 쓰이는 /dev/null(공백장치)만 mknod 로 만들어 주면 되겠습니다.

그러면 이것으로 chroot에 대한 이해를 마쳤습니다. 마지막으로 위에서 소개한 chroot 라는 씨언어 함수에 대한 맨페이지의 메뉴얼을 약간만 볼까요?

# man 2 chroot
---------------------------------------------------------------------------
          CHROOT(2)            리눅스 프로그래머 메뉴얼           CHROOT(2)

          이름
                 chroot - 루트 디렉토리를 바꾼다.

          사용법
                 #include < unistd.h >

                 int chroot(const char *path);

---------------------------------------------------------------------------
#include< unistd.h >

main(){
int ret;

ret = chroot("/chroot"); 

if(ret==0) printf("chroot 작동 성공\n");
else printf("chroot 작동 실패\n");
}
	

간단히 이런 소스로 가능하겠죠? 뭐 성공하면 리턴값이 0 이고, 아니면 -1 을 리턴한다고 하네요.. 씨언어를 아시는 분이면 다 아실테죠.. 다음으로 넘어가도록 하겠습니다.


2. 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 스크립트는 형태로 파일에 삽입되어서 작동하기도 합니다.

이것이 어디에 작동하는지 모르신다면, 예를들죠? 웹게시판, 회원서비스, 자료실, 쇼핑몰, 메일링리스트, 방명록 ... 등등의 웹애플리케이션들입니다. 네티즌이라면 자주 접하는것들이죠.

이제 APM 에 대한 이해를 하셨으리라 믿습니다. 설치에 대해서는 여러가지 수없이 많은 메뉴얼이 있지만.. 이 문서에서는 주제에 촛점을 맞추기위해서 서버설치과정은 담지 않습니다. 설치는 관련 책자나 다음링크에서 읽어보시고 따라하시기 바랍니다.

http://linux.co.kr/theme/pageview.html?ca=200101=28=apm=나만의%20웹서버%20꾸미기

이제 /usr/local/apache 디렉토리에는 아파치 웹서버를 설치하고, /usr/local/mysql에는 마이에스큐엘 데이타베이스를 설치한 디렉토리라는 가정하에서 문서를 계속 진행하겠습니다.


3. 복제 파일시스템 "BreakBreak"

우리의 유전자복제기술을 시연해보였던 '복제양 돌리' 가 생각이나서 타이틀을 정했는데 괜찮은가요? BreakBreak(아주난해한단어:외계어-닥북에디터주:외계어가 위키위키에 입력이 안됩니다. -_-;) ..;;

이 장에서는 무엇을 알아보려고 되지도않는 유머를 구사하는가? 하실텐데요.. 간단합니다. 아까전에 chroot에 대해서 설명드렸다시피, 디렉토리나 필요한 파일들을 재구성하는것입니다. 뭐 그것에 대해서 어떤어떤 것들을 재구성해주어야 하는지에 대해서 다뤄볼것입니다.

필자가 문서쓰는게 새벽인지라.. 다시 하려면 문서쓰는 시간이 꽤나 길어질것 같아서, 미리 구성해놓은 서버에 접속해서 캡쳐해서 부분부분 설명하겠습니다.

양해바래요 ..

---------------------------------------------------------------------------
[root@koreasecurity /]# ls -al / | grep chroot
drwxr-xr-x   13 root     root         4096 10월 28 19:32 chroot
[root@koreasecurity /]#
---------------------------------------------------------------------------
	

755 로 기본 권한으로 되어 있죠? 루트소유자로..

mkdir /chroot 로 만든것입니다. 이 디렉토리를 chroot 로 상위디렉토리로 전환할거죠.. 이해되시죠?

그럼 /chroot 디렉토리안에 들어가서 하나하나 되짚어볼께요.

---------------------------------------------------------------------------
[root@koreasecurity /]# cd /chroot
[root@koreasecurity chroot]# ls
bin  dev  etc  home  lib  lost+found  root  sbin  tmp  usr  var
[root@koreasecurity chroot]# pwd
/chroot
[root@koreasecurity chroot]#
---------------------------------------------------------------------------
	

상위디렉토리 처럼 재구성되어 있죠?

bin 부터 살펴보죠.

---------------------------------------------------------------------------
[root@koreasecurity chroot]# cd bin
[root@koreasecurity bin]# ls
arch        cut            gawk      ls             rm         touch
ash         date           gettext   mkdir          rmdir      true
ash.static  dd             grep      mknod          rpm        umount
awk         df             gtar      mktemp         rvi        uname
basename    dnsdomainname  gunzip    more           rview      unicode_start
bash        doexec         gzip      mount          sed        unicode_stop
bash2       domainname     hostname  mt             setfont    unlink
bsh         dumpkeys       igawk     mv             setserial  usleep
cat         echo           ipcalc    netstat        sh         vi
chgrp       ed             kbd_mode  nice           sleep      view
chmod       egrep          kill      nisdomainname  sort       ypdomainname
chown       env            link      pgawk          stty       zcat
cp          ex             ln        ps             sync
cpio        false          loadkeys  pwd            tar
csh         fgrep          login     red            tcsh
[root@koreasecurity bin]# pwd
/chroot/bin
[root@koreasecurity bin]#
---------------------------------------------------------------------------
	

보시는 바와 같이 /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]#
---------------------------------------------------------------------------
	

위 파일들을 복사해 오기전에 우리는 먼저 해야할 몇가지일이 있습니다.

www(웹서비스) 계정 만들기: 계정을 만드는 명령어는 아래와 같습니다.

useradd -c "Apache Server" -u 80 -s /bin/bash -d /chroot/usr/local/apache/htdocs
	

이렇게 하면 uid 80 번호를 가진 /bin/bash(실제로 쓰여질것은 /chroot/bin/bash)를 가진 계정이 생성되죠. 실제 인증체계에서는 chroot안에 계정정보가 참조되지는 않지만 이렇게 복사해줄 필요성이 있기에 만들어주는겁니다.

그리고 /chroot/etc 안으로 복사를 한뒤에.. 필요한 계정(root, www, mysql) 만 남겨놓고 passwd, shadow, group 파일의 목록에서 지워주어야 합니다. 지우는것은 vi 편집기를 열어서 dd를 두번누르면 한줄씩 지워집니다.

그러면 한번 확인해볼까요?

---------------------------------------------------------------------------
[root@koreasecurity etc]# ls
group  hosts  localtime  my.cnf  nsswitch.conf  passwd  resolv.conf  shadow
[root@koreasecurity etc]# cat passwd
root:x:0:0:root:/root:/bin/bash
www:x:80:80:Apache Server:/usr/local/apache:/bin/bash
mysql:x:500:500::/usr/local/mysql:/bin/bash
[root@koreasecurity etc]# cat shadow
www:!!:12353::::::
mysql:!!:12353:0:99999:7:::
[root@koreasecurity etc]# cat group
root:x:0:root
wheel:x:10:root
www:x:80:
mysql:x:500:
[root@koreasecurity etc]# cat my.cnf
[mysqld]
user=root
datadir=/usr/local/mysql/data
socket=/tmp/mysql.sock
skip-innodb

[client]
user=root
socket=/tmp/mysql.sock

[safe_mysqld]
err-log=/var/log/mysqld.log
pid-file=/usr/local/mysql/data/mysqld.pid

[root@koreasecurity etc]#
---------------------------------------------------------------------------
	

어떤가요? 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]# ls -al /dev/null
crw-rw-rw-    1 root     root       1,   3  8월 31  2002 /dev/null
[root@koreasecurity dev]#
---------------------------------------------------------------------------
	

보시면 아시겠지만, 저기 가운데 (1, 3) 이라고 되어 있습니다.

이 숫자를 보고 그대로 사용해주면 됩니다. (blabla)

---------------------------------------------------------------------------
[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 안에서 하지 않을것이기 때문에 구지 필요가 없겠네요(이 디렉토리는 지우셔도 무관..)

다음은 많은 라이브러리 파일들이 모인 디렉토리군요..

---------------------------------------------------------------------------
[root@koreasecurity home]# cd ..
[root@koreasecurity chroot]# rmdir home
[root@koreasecurity chroot]# cd lib
[root@koreasecurity lib]# ls
ld-linux.so.2             libnss1_files-2.2.93.so  libnss_ldap.so.2
libacl.so.1               libnss1_files.so.1       libnss_nis-2.2.93.so
libattr.so.1              libnss1_nis-2.2.93.so    libnss_nis.so.1
libc.so.6                 libnss1_nis.so.1         libnss_nis.so.2
libcrypt.so.1             libnss_compat-2.2.93.so  libnss_nisplus-2.2.93.so
libdl.so.2                libnss_compat.so.1       libnss_nisplus.so.2
libexpat.so.0             libnss_compat.so.2       libpam.so.0
libexpat.so.0.3.0         libnss_dns-2.2.93.so     libpam_misc.so.0
libgcc_s.so.1             libnss_dns.so.1          libproc.so.2.0.7
libm.so.6                 libnss_dns.so.2          libpthread.so.0
libncurses.so.5           libnss_files-2.2.93.so   libresolv.so.2
libnsl.so.1               libnss_files.so.1        librt.so.1
libnss1_compat-2.2.93.so  libnss_files.so.2        libstdc++.so.5
libnss1_compat.so.1       libnss_hesiod-2.2.93.so  libtermcap.so.2
libnss1_dns-2.2.93.so     libnss_hesiod.so.2       libz.so.1
libnss1_dns.so.1          libnss_ldap-2.2.90.so
[root@koreasecurity lib]#
---------------------------------------------------------------------------
	

립(라이브러리) 디렉토리는 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 안에 apachemysql 등이랑.. 이에 필요한 라이브러리 혹은 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/ 라고 생각하고.. 이해되시죠~

ㅎㅎ 한장 넘기기 돼게 힘드네요.. 다음장으로 ..


4. 라이브러리의 가출

chroot/chroot -> / 로 해서 진입했을때, 사용되는 실행파일들을 작동하려는데 오류가 난다고요? 라이브러리가 없다는둥.. 그런식의 영문으로된 오류가 나죠. 그럴땐 라이브러리 파일들이 가출을 한것이라 보면됩니다.

Ex) 가출한 자식때문에 가족들이 식탁에 둘러앉아 맛있는 저녁식사를 하지 못하고 걱정하고 있는 상태인거죠. (가족=실행파일, 자식=라이브러리파일)

그러면 어떻게 라이브러리 파일들.. 자식들을 알아보고, 홈그라운드(집안)으로 데려오느냐? 즉 /lib 이나 /usr/lib 안에 어떤 파일들이 진정 /chroot/lib 안으로 옴겨와야 하느냐?? 그것이 문제죠.. 간단합니다.

ldd(엘디디)라는 툴이 있습니다.

ldd 파일명
	

이렇게 사용하는데, 파일이 사용하는 라이브러리 파일의 경로를 모두 보여줍니다. 그러니 복사해주시면 되겠죠? 필요에 따라..(조금 귀찮긴 합니다)

---------------------------------------------------------------------------
[root@koreasecurity /]# ldd /bin/bash
        libtermcap.so.2 => /lib/libtermcap.so.2 (0x0012a000)
        libdl.so.2 => /lib/libdl.so.2 (0x0012f000)
        libc.so.6 => /lib/i686/libc.so.6 (0x42000000)
        /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x00110000)
[root@koreasecurity /]# ldd /bin/ls
        libtermcap.so.2 => /lib/libtermcap.so.2 (0x0012a000)
        libacl.so.1 => /lib/libacl.so.1 (0x0012f000)
        libc.so.6 => /lib/i686/libc.so.6 (0x42000000)
        libattr.so.1 => /lib/libattr.so.1 (0x00135000)
        /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x00110000)
[root@koreasecurity /]# ldd /bin/cp
        libacl.so.1 => /lib/libacl.so.1 (0x0012a000)
        libc.so.6 => /lib/i686/libc.so.6 (0x42000000)
        libattr.so.1 => /lib/libattr.so.1 (0x00131000)
        /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x00110000)
[root@koreasecurity /]# ldd /bin/rm
        libacl.so.1 => /lib/libacl.so.1 (0x0012a000)
        libc.so.6 => /lib/i686/libc.so.6 (0x42000000)
        libattr.so.1 => /lib/libattr.so.1 (0x00131000)
        /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x00110000)
[root@koreasecurity /]# ldd /bin/uname
        libc.so.6 => /lib/i686/libc.so.6 (0x42000000)
        /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x00110000)
[root@koreasecurity /]#
---------------------------------------------------------------------------
	

언드 스탠드?

        libc.so.6 => /lib/i686/libc.so.6 (0x42000000)
	

이줄을 보면 /lib/i686/libc.so.6 이 경로에 있는 라이브러리 파일이 필요하다는거죠. 그러면, cp /lib/i686/libc.so.6 /chroot/lib 해주시면, 게임 오버 되겠죠? 가출한 라이브러리(자식)들을 하나씩 집으로 데려오는 작업이야 말로, 이 강의문의 핵심이라고 할수있겠죠..

이제 모든것은 끝났습니다.


5. 서버구동

이제 chroot 안에 설치한 각종서버들을 구동해보는 시간입니다.

간단히 할수 있습니다. 구동중에 오류가 나는 경우도 있을것입니다. 그런경우에는 서버관련 메뉴얼을 참조하시어, 해결하시길 바랍니다.

	아파치 구동파일 : /chroot/usr/local/apache/bin/apachectl
	MySQL 구동파일 : /chroot/usr/local/mysql/bin/safe_mysqld
	

이렇게 되죠?

그러나 chroot/chroot -> / 로 변환하고 나면..

	아파치 구동파일 : /usr/local/apache/bin/apachectl
	MySQL 구동파일 : /usr/local/mysql/bin/safe_mysqld
	

이런 경로가 되죠? 그럼 간단합니다.

vi 편집기로 /etc/rc.local 파일을 열어서 아래두줄을 추가합니다.

chroot /chroot /usr/local/apache/bin/apachectl start
chroot /chroot /usr/local/mysql/bin/safe_mysqld &
	

이렇게 하고 저장한뒤, 시스템을 재가동하면됩니다. 그러면 재가동할때 위의 명령행들이 실행되고.. /chroot 디렉토리로 상위디렉토리가 변환된뒤 아파치웹서버를 가동하고 mysql 데몬역시 가동시킵니다. 그리고 그 안에 있는게 아니라.. 저 두가지 작동된 프로세스들만 /chroot / 라고 착각하고 작동하게 되는 것입니다. ?-.- 바보되는거죠..(babo)

이것으로 구동도 어렵지 않네요..

syslog 나 그런거에 대한것은 생략하도록 하겠습니다.


6. 정말 안전할까?

정말 안전한지 모르시겠다고요? 일반적으로 웹을 통해서 어떤식으로 접근하든지 시스템상으로 침투하기 위해서는 웹계정(www)로 쉘상에 명령어를 실행하려 할것입니다. 그렇다면.. 이 침투한 해커들이나 혹은 PT들이..

cat /etc/passwd 
	

라고 명령을 주면 어떻게 될까요? 실제 /etc/passwd 이 보여질까요? 아니면 /chroot/etc/passwd 가 보여질까요?

당연하죠.. 후자입니다. 아파치웹서버는 /chroot/ 로 생각하고 작동중이기 때문입니다. 그래서 중요한 계정들의 목록은 드러나지 않게됩니다.

또 열심히 노력(??해킹)해서 /etc/shadow 파일을 얻은들.. 아무소용이 없습니다. 왜냐? 실제로 얻는건 /chroot/etc/shadow 이기에...흑흑..

역시 중요한 데이타는 이안에 두지 않을것이기 때문에, chroot 를 깨는 기법이나,mysql 데이타베이스에 시스템상의 root 계정 비밀번호를 남기지 않는한은 아무런 효용이 없어질것입니다.

이제 어느정도 안전하다고 볼수 있겠죠? ( 서버가 root 권한으로 작동하거나, suid 버그가 있는 파일이 chroot 디렉토리 안에 없다는 가정 ) 이 방법으로 웹을 가두는것을 chroot jail 기법이라고 부르기도 합니다. 완전하지는 않지만, 잘 관리한다면 대부분의 어리석고 준비들된 해커들의 장난으로 부터는 완전히 보호될수 있을거라 장담합니다.

이 문서의 핵심은 이것에 있는것이죠. "시스템정보보호"

Chroot 로 안전한 WebServer/MySQL 구축하기

Chroot 로 안전한 WebServer/MySQL 구축하기

정경주

                    
                

1 November 2003, DocBook Edit by pibonazi (at) hotmail.com : 3 November 2003


본 문서에 대한 저작권은 명시된 작성자에게 있습니다. 문서에 대한 배포는 모두 허용하며, 내용의 정정이 필요할때는 허락을 맡으셔야 합니다. 임의로 수정하여 문서를 배포시에는 저작권법에 따라 처벌 받습니다. 오타나 잘못된 부분은 수정을 하지 않을것이며, Plat 문서로 남기고 싶습니다. 잘 보시고, chroot 로 안전한 서버를 구축하세요 화이팅~ :=).


1. Chroot 의 이해

Chroot 라는것은 말이 필요없습니다. 저는 개인적으로 Change Root 라고 부릅니다. 최상위디렉토리를 임시 교체하는것입니다. 즉.. 맨페이지에는아래처럼 나와 있습니다.

NAME
	chroot  -  run  command  or interactive shell with special root directory
	

즉, 리눅스 시스템의 최상위디렉토리는 / 입니다. 그러나 /chroot라는 디렉토리를 하나 생성한뒤 그 디렉토리를 최상위 디렉토리로 전환할수가 있습니다. 그것이 Chroot 이며, glibc 라이브러리로 chroot 라는 C언어 함수를 제공합니다. 이 함수를 이용해서 만들어진것이 chroot 바이너리 입니다.

---------------------------------------------------------------------------
[root@localhost root]# ls -al /usr/sbin/chroot
-rwxr-xr-x    1 root     root        11232  2월 19  2003 /usr/sbin/chroot
[root@localhost root]#
---------------------------------------------------------------------------
	

그러나, 아무디렉토리나 지정하고 교체하려고 한다면 분명 실패할것입니다. 그 디렉토리안에는 필요한것이 있는데, 기본적으로 쉘파일과 쉘이 구동하기에 필요한 라이브러리가 모두 있어야합니다. 그리고 필요한 설정파일들도 넣어주면 좋습니다. 즉..

/chroot/bin
/chroot/etc
/chroot/lib
/chroot/usr
/chroot/tmp
/chroot/var
/chroot/dev
	

이런 식으로 디렉토리와 필요한 파일들을 재구성하는것입니다. 실제 리눅스 상위디렉토리처럼 말이죠. 이해하셨습니까?

bin 안에는 우리가 사용할 바운스쉘(bash) 도 필요하고, chroot 안에서 사용할 바이너리 파일들도 필요하겠죠? 이를테면 ls , cp , mv , rm ,mkdir ....

etc 안에는 뭐.. chroot 안에서만 사용할 복제판 passwd , shadow , group hosts .... 몇몇개만 있으면 되겟죠?

lib 안에야 말할것도 없습니다. chroot 로 진입한뒤에 작동할 바이너리 파일들이 필요로하는 라이브러리파일은 모두 여기에 복사해주면 됩니다.

usr 안에는 /usr/local/apache/usr/local/mysql 를 원래의 시스템에 설치된 경로로 할것이기 때문에 난중에 아파치나 데이타베이스서버 구동에 필요한 파일을 그대로 옴겨주면 되겠죠? 디렉토리 자체..;;

tmp 에는 필요업죠 뭐..

var 도 별건 없고 run 디렉토리나 logs 디렉토리를 만들어주면 됩니다.

마지막으로 dev 같은경우는 주로 쓰이는 /dev/null(공백장치)만 mknod 로 만들어 주면 되겠습니다.

그러면 이것으로 chroot에 대한 이해를 마쳤습니다. 마지막으로 위에서 소개한 chroot 라는 씨언어 함수에 대한 맨페이지의 메뉴얼을 약간만 볼까요?

# man 2 chroot
---------------------------------------------------------------------------
          CHROOT(2)            리눅스 프로그래머 메뉴얼           CHROOT(2)

          이름
                 chroot - 루트 디렉토리를 바꾼다.

          사용법
                 #include < unistd.h >

                 int chroot(const char *path);

---------------------------------------------------------------------------
#include< unistd.h >

main(){
int ret;

ret = chroot("/chroot"); 

if(ret==0) printf("chroot 작동 성공\n");
else printf("chroot 작동 실패\n");
}
	

간단히 이런 소스로 가능하겠죠? 뭐 성공하면 리턴값이 0 이고, 아니면 -1 을 리턴한다고 하네요.. 씨언어를 아시는 분이면 다 아실테죠.. 다음으로 넘어가도록 하겠습니다.


2. 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 스크립트는 형태로 파일에 삽입되어서 작동하기도 합니다.

이것이 어디에 작동하는지 모르신다면, 예를들죠? 웹게시판, 회원서비스, 자료실, 쇼핑몰, 메일링리스트, 방명록 ... 등등의 웹애플리케이션들입니다. 네티즌이라면 자주 접하는것들이죠.

이제 APM 에 대한 이해를 하셨으리라 믿습니다. 설치에 대해서는 여러가지 수없이 많은 메뉴얼이 있지만.. 이 문서에서는 주제에 촛점을 맞추기위해서 서버설치과정은 담지 않습니다. 설치는 관련 책자나 다음링크에서 읽어보시고 따라하시기 바랍니다.

http://linux.co.kr/theme/pageview.html?ca=200101=28=apm=나만의%20웹서버%20꾸미기

이제 /usr/local/apache 디렉토리에는 아파치 웹서버를 설치하고, /usr/local/mysql에는 마이에스큐엘 데이타베이스를 설치한 디렉토리라는 가정하에서 문서를 계속 진행하겠습니다.


3. 복제 파일시스템 "BreakBreak"

우리의 유전자복제기술을 시연해보였던 '복제양 돌리' 가 생각이나서 타이틀을 정했는데 괜찮은가요? BreakBreak(아주난해한단어:외계어-닥북에디터주:외계어가 위키위키에 입력이 안됩니다. -_-;) ..;;

이 장에서는 무엇을 알아보려고 되지도않는 유머를 구사하는가? 하실텐데요.. 간단합니다. 아까전에 chroot에 대해서 설명드렸다시피, 디렉토리나 필요한 파일들을 재구성하는것입니다. 뭐 그것에 대해서 어떤어떤 것들을 재구성해주어야 하는지에 대해서 다뤄볼것입니다.

필자가 문서쓰는게 새벽인지라.. 다시 하려면 문서쓰는 시간이 꽤나 길어질것 같아서, 미리 구성해놓은 서버에 접속해서 캡쳐해서 부분부분 설명하겠습니다.

양해바래요 ..

---------------------------------------------------------------------------
[root@koreasecurity /]# ls -al / | grep chroot
drwxr-xr-x   13 root     root         4096 10월 28 19:32 chroot
[root@koreasecurity /]#
---------------------------------------------------------------------------
	

755 로 기본 권한으로 되어 있죠? 루트소유자로..

mkdir /chroot 로 만든것입니다. 이 디렉토리를 chroot 로 상위디렉토리로 전환할거죠.. 이해되시죠?

그럼 /chroot 디렉토리안에 들어가서 하나하나 되짚어볼께요.

---------------------------------------------------------------------------
[root@koreasecurity /]# cd /chroot
[root@koreasecurity chroot]# ls
bin  dev  etc  home  lib  lost+found  root  sbin  tmp  usr  var
[root@koreasecurity chroot]# pwd
/chroot
[root@koreasecurity chroot]#
---------------------------------------------------------------------------
	

상위디렉토리 처럼 재구성되어 있죠?

bin 부터 살펴보죠.

---------------------------------------------------------------------------
[root@koreasecurity chroot]# cd bin
[root@koreasecurity bin]# ls
arch        cut            gawk      ls             rm         touch
ash         date           gettext   mkdir          rmdir      true
ash.static  dd             grep      mknod          rpm        umount
awk         df             gtar      mktemp         rvi        uname
basename    dnsdomainname  gunzip    more           rview      unicode_start
bash        doexec         gzip      mount          sed        unicode_stop
bash2       domainname     hostname  mt             setfont    unlink
bsh         dumpkeys       igawk     mv             setserial  usleep
cat         echo           ipcalc    netstat        sh         vi
chgrp       ed             kbd_mode  nice           sleep      view
chmod       egrep          kill      nisdomainname  sort       ypdomainname
chown       env            link      pgawk          stty       zcat
cp          ex             ln        ps             sync
cpio        false          loadkeys  pwd            tar
csh         fgrep          login     red            tcsh
[root@koreasecurity bin]# pwd
/chroot/bin
[root@koreasecurity bin]#
---------------------------------------------------------------------------
	

보시는 바와 같이 /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]#
---------------------------------------------------------------------------
	

위 파일들을 복사해 오기전에 우리는 먼저 해야할 몇가지일이 있습니다.

www(웹서비스) 계정 만들기: 계정을 만드는 명령어는 아래와 같습니다.

useradd -c "Apache Server" -u 80 -s /bin/bash -d /chroot/usr/local/apache/htdocs
	

이렇게 하면 uid 80 번호를 가진 /bin/bash(실제로 쓰여질것은 /chroot/bin/bash)를 가진 계정이 생성되죠. 실제 인증체계에서는 chroot안에 계정정보가 참조되지는 않지만 이렇게 복사해줄 필요성이 있기에 만들어주는겁니다.

그리고 /chroot/etc 안으로 복사를 한뒤에.. 필요한 계정(root, www, mysql) 만 남겨놓고 passwd, shadow, group 파일의 목록에서 지워주어야 합니다. 지우는것은 vi 편집기를 열어서 dd를 두번누르면 한줄씩 지워집니다.

그러면 한번 확인해볼까요?

---------------------------------------------------------------------------
[root@koreasecurity etc]# ls
group  hosts  localtime  my.cnf  nsswitch.conf  passwd  resolv.conf  shadow
[root@koreasecurity etc]# cat passwd
root:x:0:0:root:/root:/bin/bash
www:x:80:80:Apache Server:/usr/local/apache:/bin/bash
mysql:x:500:500::/usr/local/mysql:/bin/bash
[root@koreasecurity etc]# cat shadow
www:!!:12353::::::
mysql:!!:12353:0:99999:7:::
[root@koreasecurity etc]# cat group
root:x:0:root
wheel:x:10:root
www:x:80:
mysql:x:500:
[root@koreasecurity etc]# cat my.cnf
[mysqld]
user=root
datadir=/usr/local/mysql/data
socket=/tmp/mysql.sock
skip-innodb

[client]
user=root
socket=/tmp/mysql.sock

[safe_mysqld]
err-log=/var/log/mysqld.log
pid-file=/usr/local/mysql/data/mysqld.pid

[root@koreasecurity etc]#
---------------------------------------------------------------------------
	

어떤가요? 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]# ls -al /dev/null
crw-rw-rw-    1 root     root       1,   3  8월 31  2002 /dev/null
[root@koreasecurity dev]#
---------------------------------------------------------------------------
	

보시면 아시겠지만, 저기 가운데 (1, 3) 이라고 되어 있습니다.

이 숫자를 보고 그대로 사용해주면 됩니다. (blabla)

---------------------------------------------------------------------------
[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 안에서 하지 않을것이기 때문에 구지 필요가 없겠네요(이 디렉토리는 지우셔도 무관..)

다음은 많은 라이브러리 파일들이 모인 디렉토리군요..

---------------------------------------------------------------------------
[root@koreasecurity home]# cd ..
[root@koreasecurity chroot]# rmdir home
[root@koreasecurity chroot]# cd lib
[root@koreasecurity lib]# ls
ld-linux.so.2             libnss1_files-2.2.93.so  libnss_ldap.so.2
libacl.so.1               libnss1_files.so.1       libnss_nis-2.2.93.so
libattr.so.1              libnss1_nis-2.2.93.so    libnss_nis.so.1
libc.so.6                 libnss1_nis.so.1         libnss_nis.so.2
libcrypt.so.1             libnss_compat-2.2.93.so  libnss_nisplus-2.2.93.so
libdl.so.2                libnss_compat.so.1       libnss_nisplus.so.2
libexpat.so.0             libnss_compat.so.2       libpam.so.0
libexpat.so.0.3.0         libnss_dns-2.2.93.so     libpam_misc.so.0
libgcc_s.so.1             libnss_dns.so.1          libproc.so.2.0.7
libm.so.6                 libnss_dns.so.2          libpthread.so.0
libncurses.so.5           libnss_files-2.2.93.so   libresolv.so.2
libnsl.so.1               libnss_files.so.1        librt.so.1
libnss1_compat-2.2.93.so  libnss_files.so.2        libstdc++.so.5
libnss1_compat.so.1       libnss_hesiod-2.2.93.so  libtermcap.so.2
libnss1_dns-2.2.93.so     libnss_hesiod.so.2       libz.so.1
libnss1_dns.so.1          libnss_ldap-2.2.90.so
[root@koreasecurity lib]#
---------------------------------------------------------------------------
	

립(라이브러리) 디렉토리는 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 안에 apachemysql 등이랑.. 이에 필요한 라이브러리 혹은 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/ 라고 생각하고.. 이해되시죠~

ㅎㅎ 한장 넘기기 돼게 힘드네요.. 다음장으로 ..


4. 라이브러리의 가출

chroot/chroot -> / 로 해서 진입했을때, 사용되는 실행파일들을 작동하려는데 오류가 난다고요? 라이브러리가 없다는둥.. 그런식의 영문으로된 오류가 나죠. 그럴땐 라이브러리 파일들이 가출을 한것이라 보면됩니다.

Ex) 가출한 자식때문에 가족들이 식탁에 둘러앉아 맛있는 저녁식사를 하지 못하고 걱정하고 있는 상태인거죠. (가족=실행파일, 자식=라이브러리파일)

그러면 어떻게 라이브러리 파일들.. 자식들을 알아보고, 홈그라운드(집안)으로 데려오느냐? 즉 /lib 이나 /usr/lib 안에 어떤 파일들이 진정 /chroot/lib 안으로 옴겨와야 하느냐?? 그것이 문제죠.. 간단합니다.

ldd(엘디디)라는 툴이 있습니다.

ldd 파일명
	

이렇게 사용하는데, 파일이 사용하는 라이브러리 파일의 경로를 모두 보여줍니다. 그러니 복사해주시면 되겠죠? 필요에 따라..(조금 귀찮긴 합니다)

---------------------------------------------------------------------------
[root@koreasecurity /]# ldd /bin/bash
        libtermcap.so.2 => /lib/libtermcap.so.2 (0x0012a000)
        libdl.so.2 => /lib/libdl.so.2 (0x0012f000)
        libc.so.6 => /lib/i686/libc.so.6 (0x42000000)
        /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x00110000)
[root@koreasecurity /]# ldd /bin/ls
        libtermcap.so.2 => /lib/libtermcap.so.2 (0x0012a000)
        libacl.so.1 => /lib/libacl.so.1 (0x0012f000)
        libc.so.6 => /lib/i686/libc.so.6 (0x42000000)
        libattr.so.1 => /lib/libattr.so.1 (0x00135000)
        /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x00110000)
[root@koreasecurity /]# ldd /bin/cp
        libacl.so.1 => /lib/libacl.so.1 (0x0012a000)
        libc.so.6 => /lib/i686/libc.so.6 (0x42000000)
        libattr.so.1 => /lib/libattr.so.1 (0x00131000)
        /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x00110000)
[root@koreasecurity /]# ldd /bin/rm
        libacl.so.1 => /lib/libacl.so.1 (0x0012a000)
        libc.so.6 => /lib/i686/libc.so.6 (0x42000000)
        libattr.so.1 => /lib/libattr.so.1 (0x00131000)
        /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x00110000)
[root@koreasecurity /]# ldd /bin/uname
        libc.so.6 => /lib/i686/libc.so.6 (0x42000000)
        /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x00110000)
[root@koreasecurity /]#
---------------------------------------------------------------------------
	

언드 스탠드?

        libc.so.6 => /lib/i686/libc.so.6 (0x42000000)
	

이줄을 보면 /lib/i686/libc.so.6 이 경로에 있는 라이브러리 파일이 필요하다는거죠. 그러면, cp /lib/i686/libc.so.6 /chroot/lib 해주시면, 게임 오버 되겠죠? 가출한 라이브러리(자식)들을 하나씩 집으로 데려오는 작업이야 말로, 이 강의문의 핵심이라고 할수있겠죠..

이제 모든것은 끝났습니다.


5. 서버구동

이제 chroot 안에 설치한 각종서버들을 구동해보는 시간입니다.

간단히 할수 있습니다. 구동중에 오류가 나는 경우도 있을것입니다. 그런경우에는 서버관련 메뉴얼을 참조하시어, 해결하시길 바랍니다.

	아파치 구동파일 : /chroot/usr/local/apache/bin/apachectl
	MySQL 구동파일 : /chroot/usr/local/mysql/bin/safe_mysqld
	

이렇게 되죠?

그러나 chroot/chroot -> / 로 변환하고 나면..

	아파치 구동파일 : /usr/local/apache/bin/apachectl
	MySQL 구동파일 : /usr/local/mysql/bin/safe_mysqld
	

이런 경로가 되죠? 그럼 간단합니다.

vi 편집기로 /etc/rc.local 파일을 열어서 아래두줄을 추가합니다.

chroot /chroot /usr/local/apache/bin/apachectl start
chroot /chroot /usr/local/mysql/bin/safe_mysqld &
	

이렇게 하고 저장한뒤, 시스템을 재가동하면됩니다. 그러면 재가동할때 위의 명령행들이 실행되고.. /chroot 디렉토리로 상위디렉토리가 변환된뒤 아파치웹서버를 가동하고 mysql 데몬역시 가동시킵니다. 그리고 그 안에 있는게 아니라.. 저 두가지 작동된 프로세스들만 /chroot / 라고 착각하고 작동하게 되는 것입니다. ?-.- 바보되는거죠..(babo)

이것으로 구동도 어렵지 않네요..

syslog 나 그런거에 대한것은 생략하도록 하겠습니다.


6. 정말 안전할까?

정말 안전한지 모르시겠다고요? 일반적으로 웹을 통해서 어떤식으로 접근하든지 시스템상으로 침투하기 위해서는 웹계정(www)로 쉘상에 명령어를 실행하려 할것입니다. 그렇다면.. 이 침투한 해커들이나 혹은 PT들이..

cat /etc/passwd 
	

라고 명령을 주면 어떻게 될까요? 실제 /etc/passwd 이 보여질까요? 아니면 /chroot/etc/passwd 가 보여질까요?

당연하죠.. 후자입니다. 아파치웹서버는 /chroot/ 로 생각하고 작동중이기 때문입니다. 그래서 중요한 계정들의 목록은 드러나지 않게됩니다.

또 열심히 노력(??해킹)해서 /etc/shadow 파일을 얻은들.. 아무소용이 없습니다. 왜냐? 실제로 얻는건 /chroot/etc/shadow 이기에...흑흑..

역시 중요한 데이타는 이안에 두지 않을것이기 때문에, chroot 를 깨는 기법이나,mysql 데이타베이스에 시스템상의 root 계정 비밀번호를 남기지 않는한은 아무런 효용이 없어질것입니다.

이제 어느정도 안전하다고 볼수 있겠죠? ( 서버가 root 권한으로 작동하거나, suid 버그가 있는 파일이 chroot 디렉토리 안에 없다는 가정 ) 이 방법으로 웹을 가두는것을 chroot jail 기법이라고 부르기도 합니다. 완전하지는 않지만, 잘 관리한다면 대부분의 어리석고 준비들된 해커들의 장난으로 부터는 완전히 보호될수 있을거라 장담합니다.

이 문서의 핵심은 이것에 있는것이죠. "시스템정보보호"




sponsored by andamiro
sponsored by cdnetworks
sponsored by HP

Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2006-07-22 13:05:02
Processing time 0.1362 sec