리눅스클러스터기술백서 클루닉스 / 1/401 페이지
차례 Chapter 1. 철학이있는리눅스운영체제구성 - Page 003 Chapter 2. 리눅스기반인터넷서비스구성 - Page 058 Chapter 3. 부하분산 (Load Balancing) 클러스터구성 - page 112 Chapter 4. 고가용성 (High Availability) 클러스터구성 - page 206 Chapter 5. 고성능 (High Performance Computer) 클러스터구성 - Page 256 2/401 페이지
To install Linux with philosophy ( 철학이있는리눅스운영체제구성 ) 클루닉스기술부 1 차세미나자료 3/401 페이지
철학이있는리눅스설치 주요내용 ====================================================================== 1. 리눅스설치 1 설치전고려사항 i. 파티션정책 ii. SCSI Adapter Driver Patch 2 리눅스설치 i. 파티션정책 ii. iii. 패키지정책 설치완료후기본확인작업 3 설치완료후부가작업 i. 주요서비스파티션구성확인및파일시스템 ii. 시스템구성확인 2. 패키지업데이트 1 S/W 패키지업데이트 2 H/W 패키지업데이트 3. OS 관련기본보안정책및보안패키지설치 1 OS 관련기본보안정책 i. 데몬관리정책 ii. iii. iv. 기본시스템계정정책 시스템퍼미션정책 일반사용자관리정책 v. TCP 보안정책 2 보안패키지설치 i. Fcheck 설치후관리하기 4/401 페이지
4. OS 설치후중요데이터백업정책 1 2 3 백업정책설정시고려할점 백업의방식 2 차및 3 차백업에대해 i. FTP 를이용한 2 차백업 ii. RSYNC 를이용한 2 차백업 4 5 6 복구의방식 백업및복구시주의점 실전백업예제 5. 문제발생시응급복구방법 1 2 3 4 긴급부팅시키기부팅디스켓만들기파일시스템점검수리 RPM 패키지상태초기화하기 ====================================================================== 5/401 페이지
1. 리눅스설치 1 설치전고려사항 i. 파티션정책 자동파티션설치를선택하면기본적으로 /boot, /, swap 3개의파티션으로자동활당되어진다. 하지만정식서비스를위해서는가지고있는하드디스크를계산하여성능및보안등을고려하여현서비스에가장적절한정책을세워야한다. 리눅스의대표파티션들은모두보안적인측면이나성능적인측면에서의미를부여하고있다. 리눅스의대표적인파티션을살펴보면다음과같다. /boot / /etc /home /usr /usr/local /tmp /var swap 각대표적인모든파티션을다나누어설치를하게되면가장안정적일수있지만제한된하드디스크로모든파티션을나누게되면각파티션에서사용할수있는용량이고정되어버리기때문에실제서비스도중특정파티션에용량이초과할경우추가하드디스크를사용해야하는경우가발생하기쉽다. 뿐만아니라많은파티션을나누어놓게되면성능면에서는 Disk i/o 를분산시킬수있어바람직할수있지만관리측면을고려해본다면필요에의한적절한파티션분배가이루어져야할것이다. 각파티션별로그의미에대해알아보자. /boot : 6/401 페이지
/boot 파티션은리눅스부팅에관련된파일이나이미지들이모여있는파티션이다. 만일 /boot 파티션을나누어놓은경우는크게세가지의미가있다. 첫째는안정성이다. 실제 /boot 파티션을나누지않고그냥 / 에포함시킬경우시스템이과도한사용이나해킹등의이유로 / 파티션이망가질경우실제 / 포함된 /boot 디렉토리의 booting image 들역시깨어질위험성이크다. /boot 가나누어져있을경우 / 가망가지더라도새로운 / 파티션을만들고 /boot 에있는부팅이미지를가지고어느정도까지는복구가가능하다. 둘째는기능성 (?) 이라볼수있다. 실제 /boot 에들어있는 kernal image 가즉리눅스 OS 라볼수도있다. 만일당신이개발자나리눅스전문엔지니어라서여러개의배포판을설치할경우각배포판마다 /, swap 등의파티션을별도로나누어서설치해야하는어리석음을갖지말길바란다. 실제배포버전별로 /boot 파티션을나누어준다고하면각각의다른리눅스배포판을설치하고도실제 /etc /usr/local 등에있는설정이나패키지를통합해서관리할수가있다. 셋째는리눅스 OS의부트로더의기능적인제한때문에 /boot 를나누는경우가많다. 리눅스의대표적인부트로더로 Lilo 가있는데이는실제 1024 실린더밖에설치될경우치명적인에러가발생한다. 그래서대부분이하드디스크의 MBR 영역에설치를하게되는데만일 MBR 에다른부트로더를설치하고 Lilo 는리눅스파티션의첫번째파티션에설치를한다고할때 /boot 파티션을첫번째파티션으로만들어이곳에 Lilo를설치할수있다. / : 루트파티션은실제리눅스파티션의최상위파티션으로실제 / 파티션과 Swap 파티션만으로도리눅스를설치하여서비스를할수도있다. 하지만이렇게설치를하게되면앞에서언급하였고뒤에서설명하는바와같이부적절한상황을초래하기쉽다. 일단커널이미지에서실제 / 파티션을찾아서 / 파티션을최상위로해서하위의파티션들을찾기때문에 / 파티션이없으면리눅스를부팅시킬수없게된다. 아래에서설명하는바와같이여러개의파티션을나눌경우실제별도의파티션을나누지않는상위디렉토리들이모두이 / 파티션안에포함되게될것이다. /etc : /etc 는리눅스시스템의모든설정파일이모여있는디렉토리이다. 만일 /etc 7/401 페이지
를 / 파티션에포함한경우변수에의해 / 파티션이깨어진경우별도의백업이없으면관리자로써상당히난처한상황에빠지게딘다. 즉아무리데이터를백업을하고있다하더라도설정파일이없으면서비스를구동할수없게된다. 그렇기때문에 /etc 를별도의파티션으로나누는것도고려해야할것이다. 하지만 /etc 의용량은매우작기때문에백업만적절히한다고하면굳이나눌필요는없다. 파티션이너무많이나누어지면관리측면에서부적절할수도있다. /usr : /usr 는실제레드헷리눅스의 RPM 패키지가설치되는파티션이다. 이파티션을나누는이유는크게성능과패키지관리측면에서볼수있다. 일단레드헷리눅스의모든프로그램이이곳에설치가된다고볼수있다. 즉서비스구동시에프로그램성능에가장큰영향을주는파티션인만큼다른 Disk i/o 과많은다른파티션과동일파티션으로구성하면성능에많은지장을주게된다. 관리측면으로보면최근배포판버전으로업그레이드를하고자할때 /usr 파티션이나누어져있을경우설치시 /usr 파티션만새로포맷하고새패키지를설치하면실제 redhat 7.3 에서 redhat 9 로업그레이드를한다고해서서버의모든자료를백업하고새로 OS 설치후복구하는수고를들수있다. /usr/local : /usr/local 는응용프로그램을 Source 로설치할경우파일이위치하는디렉토리이다. 기본적으로배포판의패키지는기본적이서버구성에해당하는패키지만설치하고나머지는모두 Source 설치하는걸권장한다. 리눅스배포판의패키지를무분별하게설치할경우에는보안 / 관리측면에서상당히부적절할수있다. 그러므로최소설치후필요한프로그램을 Source 로설치하는것을권장하는바이다. 즉 Source 로설치하는프로그램을관리하는파티션이다. /usr 과같은의미를가진다. 성능과패키지관리측면이다. 만일 /, /usr 등의문제로인해다시설치할경우 /usr/local 파티션이 /, /usr 에속해있으면재설치할때마다.. 일일이 Source 설치도다시해야한다. 하지만 /usr/local 이별도로나누어져있으면 OS를다시깔아도실제서비스프로그램을다시깔필요는없게된다. /var : 8/401 페이지
/var 는시스템 log 파일이저장되는곳이다. /var 파티션을분리하는이유는실제 log 를기록하면그만큼많은 Disk i/o 병목이시스템에발생하게된다. 실제서비스가이루어지는 / 혹은 /usr 와사용자데이터가저장되는 /home 등과같은파티션이존재하게되면 /var 에일어나는병목으로인해시스템의성능이저하되게될것이다. 이를방지하기위해 /var 파티션을별도로활당하던지네트워크드라이브를이용하여원격디스크를활용하는방법을사용한다. ( log 서버와같이..) /var 는로그및메일큐등이쌓이는곳이기때문에해커들이고의적으로시스템에나쁜코드를심어놓거나 mail 서버의 spam를무수히보냄으로해서 /var의디스크용량이무지커지는경우가발생한다. 이때 /var의파티션이나누어있지않는경우실제 / 파티션의 disk 용량이가득차게되고, 이로인해 / 파티션의중요한파일들이손상을입게된다. 이런일들을방지하기위해서도 /var 파티션을나누는것을권장한다. 이밖에해커들이 / 파티션을공격하여시스템을깨어버린다하더라도실제 /var 파티션이나누어져있으면이런해커의작업등이시스템로그에남게됨으로시스템은망가졌지만이후 /var 의로그를이용하여시스템에무슨문제가있었는지를확인할수도있다. /tmp : /tmp 는실제시스템서비스가가동될때임시파일이나세션파일들이생기는곳이다. 보통 nobody 권한의파일들이생김으로해서보안이약한곳이라볼수있는데해커들이주고이 /tmp 를통해원격지에서시스템을공격하는경우가많다. 그러므로해서해커의공격을받더라도 /tmp 디렉토리만영향을받게하기위해파티션을분리하는것을권장한다. swap : 은물리적인메모리가부족한경우하드디스크를메모리처럼사용할수있게하는데이용되는파티션이다. 보통시스템의물리적인메모리의 1.5배에서 2배로잡는것이정석이다. 시스템의주요사용용도중에매우큰용량의파일을다루는작업일경우보통 swap 을크게잡아야한다. 대표적으로 Oracle 의경우보통 DB file 하나가작게는 500M 에서크게는 2Gbyte 정도하는실제 DB 엔진에서메모리에이큰파일을올려놓고작업을하게되는데실제물리적메모리가 1.5 G 일경우 swap 이없는경우에는작업을할수없게되거나페이징이일어나성능이급속 9/401 페이지
도록떨어지게된다. 이를방지하기위해서서비스에이용되는메모리수치를예상하여 swap 을잡으면된다. swap 은상황에따라서여러가지방법으로추가할수있기때문에초기에는권장방법대로 1.5배에서 2배정도로잡으면된다. ii. SCSI Adapter Driver Patch 최신 Ultra320 SCSI Controllor 의경우기본레드헷지원드라이버를사용하면 i/o error 를발생하는경우가있다. 대표적인제품으로 Adatec 의 AIC-29320 제품의경우그러함. 설치시에그냥설치하면 SCSI 장치인식중에멈처버리는증세가발생함. boot : linux apic 와같은방식으로부팅하면장치는인식하지만레드헷기본커널에있는드라이버로서비스가동시에조금과도한 Disk Access 작업을할경우 kernel panic 상태가된다. 이에설치전에각장치공급사의홈페이지에서최신드라이버를다운받아서설치시에최신드라이버를인식하도록해주어야한다. http://www.adaptec.com/ 에서최신드라이버를다운받을수있음 먼저각하드웨어공급사의최신드라이브를다운받은후설치시적용할수있는이미지디스켓을만든다. ==================================================================== ====== # fdformat /dev/fd0 # dd if=aic79xx-2.0.2-i686-rh90.img of=/dev/fd0 bs=1024 ==================================================================== ====== 그런후설치 CD 로부팅후 boot prompt 가뜨면 < linux dd > 란 command 로설치시추가드라이브를적용시킨다. 10/401 페이지
==================================================================== ====== boot : linux dd ==================================================================== ====== 그럼설치 CD 의커널이미지로부팅을진행하면서하드디스크혹은기타장치를인식하기전에추가드라이브디스켓을삽입하라는메세지가뜬다. 이때위에서만든드라이브디스켓을삽입한다. 그러면설치 CD 에있는장치드라이브를이용하는것이아니라다운받은최신드라이브로장치를인식하여설치를하게된다. 2 레드헷리눅스서버설치 서버용으로설치를할경우앞에서설명한바와같이이서버가서비스할서비스내역을충분히이해한후반드시필요한패키지만을설치하는것을권장한다. 사용하지않는패키지를설치할경우사용하지않는패키지의보안적문제가생겼을때관리자는이를신경쓰지않게되고, 이패키지를통한해킹의위험을가지게된다. 기본적은설치과정에대한설명은생략하고파티션과패키지구성에대한정책만을설명하겠다. 이는저의개인적인견해를설명한것이니이가완변한설치정책이라말하지는않겠다. i. 파티션정책 실제서비스를대상으로하는서버를설치할경우에는전기본적으로아래와같이파티션을나눈다. /boot / /usr /usr/local 11/401 페이지
/var /tmp /home swap /boot : 100M ~ 200M / : 1G /usr : 3G /usr/local : 2G /var : 2G ~ 3G /tmp : 500M /home : 필요한만큼 swap : 물리적인메모리의 2배 여기서 /boot /tmp 는그용량이작기때문에적절한백업을할경우에는관리상의이유로 / 에포함하는경우도많다. /usr/local 역시관리상의이유로 /usr 에포함하는경우도많다. 대신이와같이포함하는경우에는반드시포함시키는파티션의크기에신경을써야한다. /var 파티션의경우로그의중요성이낮거나메일서비스등을하지않는경우에는관리상의이유로하여 / 에포함하는경우도많다. 하지만메일서버등을중점으로하는서비스에서는반드시 /var 의파티션을나누어주고용량도충분히주길바란다. /home /usr/local 의파티션을별도로나눌경우성능을고려한다면설치시파티션을지정하지말고기본 OS 설치후 fdisk 를통해수동으로파티션을나눈후레드헷기본파일시스템인 ext3 대신 reiserfs 혹은 xfs 파일시스템을사용하는것을권장한다. ext3 에비해 reiserfs 나 xfs 파일시스템이안정성에서우수함을인증받은상태이고성능에서도 30% 정도의성능향상을가져올수있다. ( hdperm 으로디스크성능을체크해보면 ext3 의경우초당 40M 정도의 read buffer 의성능을나타내지만 reiserfs 의경우초당 55M 의성능을발휘한다. ) /home 이나 /usr/local 파티션의성격상디스크사용량이많거나실제사용하는프로그램이설치되는곳인만큼시스템의 Disk I/O 성능의영향을많이받는곳이기에보다안정스럽고좋은성능의파일시스템을사용하는게좋다. 12/401 페이지
swap 역시 oracle 과같은큰파일을다루는서버라고하면 1G 용량으로여러개의 swap 파티션을잡아두는것을권장한다. ( 그냥큰용량으로 swap을잡지않고적절한용량으로나누어여러개를잡는이유는 swap 파티션의크기역시일반 IA32 시스템에서는 2G 제한이있고 2G의스왑파티션보다는 1G의스왑파티션 2개가 I/O 분산으로인해성능이좋기때문이다. OS 의설치는초보엔지니어나경력엔지니어나다기본으로하기마련이다. 하지만시스템엔지니어의시작이 OS 설치라고하면마지막역시 OS 설치라고말할수있는만큼자신만의설치방법을세워두길바란다. ii. 패키지정책 실제 OS 구동에필요한기본프로그램 ( 부팅관련프로그램, 라이브러리 ) 은배포판에있는패키지를선택하지만서비스에필요한프로그램은대도록이면 Source 로직접설치하는것을권장한다. 이는패키지관리및보안성격상에도큰의미를가지고있지만시스템성능에미치는영향도크다 실제배포판은대표적인아키텍처에해당하는시스템에서해당프로그램을 build 하여패키지를만들어놓은것이다. 유사한아키텍처를가진시스템에서사용하는데는지장이없지만그래도자기시스템에최적화된프로그램을사용하기위해서는실제 Source 로해당시스템에서직접설치하는것이좋다. ( 이와같은패키지관리를한다고하면앞에서설명한바와같이 /usr/local 파티션을별도로나누어관리하는것이시스템문제발생하여재설치시오랜시간이소요되는 Source rebuiling 작업을생략할수있게된다. ) 레드헷리눅스에서의패키지선택은기본적으로패키지선택단계에서 / 편집기 / DNS 서버 / 네트워크서버 / 개발도구 / 커널개발 / 시스템도구 정도를기본설치하고기타서비스관련프로그램및기타관리도구는필요한프로그램만을수동으로설치하면된다. iii. 설치완료후기본확인작업 13/401 페이지
기본적으로설치가완료된후부팅이정상적으로되는지와부팅시에러내용이있는지, 파티션이정책대로적용이되었는지등을확인합니다. # dmesg -> 부팅메세지확인 # df -h -> 파티션별용량확인 부팅시 bootloader 에서문제가발생하는경우가많다. 특히 SCSI 하드와 IDE 하드를같이장착하고설치한경우 LILO 혹은 GRUB 등의 bootloader 에서정상적으로커널이미지를 Loading 하지못하는경우가생긴다. 기본적인해결방법을설명하겠다. // LILO Bootloader 로부팅시문제발생했을때해결방법 ==================================================================== ================= 리눅스설치CD로부팅해서 rescue 모드로들어갔다. df 쳐보니 /dev/hda2 가 /mnt/sysimage 에 mount 되어있다. 하드디스크에있는 lilo.conf 는 /mnt/sysimage/etc/lilo.conf 에잘있다. 이제이파일을잘고쳐서 lilo 를실행하면된다. rescue 모드에서도 vi는실행된다. # vi /mnt/sysimage/etc/lilo.conf /mnt/sysimage/etc/lilo.conf 를수정후 /etc 에복사한다 # cp /mnt/sysimage/etc/lilo.conf /etc 여기까지만하고 lilo 를실행시키면에러가난다. /etc/lilo.conf 에서 /boot 라고되어있는곳을 /mnt/sysimage/boot 로바꾸고저장한다. 이제 lilo 를실행시킨다. # /mnt/sysimage/sbin/lilo 14/401 페이지
/boot/chain.b 를못찾는다는메시지가나타나면, # cp /mnt/sysimage/boot/chain.b /boot/ 한다음에 #/mnt/sysimage/sbin/lilo 혹은 # chroot /mnt/sysimage # /sbin/lilo 하면된다. ==================================================================== =========== // GRUB Bootloader 로부팅시문제발생했을때해결방법 ==================================================================== =========== 긴급시 grub 으로부팅을시키는과정입니다. grub > 먼저 root 지정을해줍니다. grub > root (hd0,0) -> 실제 /boot 파티션의위치를지정한다. 만일별도의 /boot 파티션이없는경우에는 / 위치를지정합니다. grub > kernel /vmlinuz-2.4.20-8smp ro root=/dev/sda2 -> 실제 / 파티션위치를적어줍니다. grub > initrd /initrd-2.4.20-8smp.img 15/401 페이지
-> SCSI 하드인경우 initrd 이미지가없으면하드인식을못함. grub > boot 하면부팅됩니다. 그런후 /etc/grub.conf 를수정하거나쉽게 LILO 를수정하여다시적용하고실행하면된다. 참고로 LILO 로 SCSI 와 IDE 를병행할때 sda 가첫번째디스크가아니라는에러가발생하는경우가있다. 이는 LILO라는부트로더는실제 BIOS 의장치에관련된정보를참조하지않기때문에발생하는문제이다. 디스크에관련해서이런문제가발생하면.. lilo.conf 에다음내용을추가해주면된다. disk=/dev/sda bios=0x80 disk=/dev/hda bios=0x81 위의설정내용은 SCSI 가첫번째하드라는것을 LILO 에서인식하도록해주는것이다. 이렇게해야부팅시정상적으로 LILO 가띄워질것이다. 3 설치완료후부가작업 i. 주요서비스파티션구성확인및파일시스템설정 앞의파티션정책에서설명했듯이주요서비스파티션중데이터관련파티션인 /home 과서비스프로그램관련파티션인 /usr/local 을구성해야하고이두개의파티션을안정성및효율이높은 reiserfs 혹은 xfs 로파일시스템을설정하는하도록한다. 16/401 페이지
# fdisk /dev/sda -> /usr/local : 3G -> /home : 나머지전부활당 # mkfs.reiserfs /dev/sda8 -> /dev/sda? 에는해당파티션의디바이스명을적어준다. # mkfs.reiserfs /dev/sda9 # vi /etc/fstab ==================================================================== ============= LABEL=/ / ext3 defaults 1 1 LABEL=/boot /boot ext3 defaults 1 2 none /dev/pts devpts gid=5,mode=620 0 0 none /proc proc defaults 0 0 none /dev/shm tmpfs defaults 0 0 LABEL=/tmp /tmp ext3 defaults 1 2 LABEL=/usr /usr ext3 defaults 1 2 LABEL=/var /var ext3 defaults 1 2 /dev/sda6 swap swap defaults 0 0 /dev/cdrom /mnt/cdrom udf,iso9660 noauto,owner,kudzu,ro 0 0 /dev/fd0 /mnt/floppy auto noauto,owner,kudzu 0 0 # 아래를추가해줌 /dev/sda8 /usr/local reiserfs defaults 1 2 /dev/sda9 /home reiserfs defaults 1 2 ==================================================================== ============= # tar czvf local.tgz /usr/local -> /usr/local 의디렉토리구조를백업해둠 # cp local.tgz / # mount -a # cd / # tar xzvf local.tgz 실제파티션과파일시스템구성이정상적으로되었는지를확인한다. # df -h 17/401 페이지
==================================================================== ============= Filesystem Size Used Avail Use% Mounted on /dev/sda2 981M 121M 811M 13% / /dev/sda1 198M 15M 173M 8% /boot none 1009M 0 1009M 0% /dev/shm /dev/sda7 487M 8.1M 454M 2% /tmp /dev/sda5 2.9G 898M 1.9G 33% /usr /dev/sda3 2.9G 58M 2.7G 3% /var /dev/sda8 2.9G 33M 2.8G 2% /usr/local /dev/sda9 22G 33M 22G 1% /home ==================================================================== ============= ii. 시스템구성확인 마지막으로현재시스템의 H/W, S/W 구성정보를확인및기록해두도록합니다. 이는현재시스템장치가재대로인식을하는지확인과동시에이후유지관리를위한시스템정보를기록하는의미를가지고있습니다. 이는시스템의정보를확인하는방법으로이후관리시에큰도움이될것입니다. - booting message 확인 # dmesg - CPU 정보 # cat /proc/cpuinfo - 메모리정보 # cat /proc/meminfo - SCSI 정보 HDD 정보 # cat /proc/scsi/scsi - SCSI controllor 정보 # cat /proc/scsi/aic7xxx/0 - IDE 하드정보 18/401 페이지
# cat /proc/ide/hda/model # cat /proc/ide/hda/setting - 네트워크정보 # ifconfig # route -n - 파티션정보 # fdisk l /dev/sda - 디스크용량 # df h 이로써대략적인설치과정이완료되었습니다. 다음장에서는설치이후설치된패키지의최신패키지업데이트및기타하드웨어의최신드라이브업데이트에대한설명을하겠습니다. 2. 패키지업데이트 1 S/W Package Update 리눅스시스템은 Open 된 OS 인만큼보안에대한취약점이있다고생각할수있지만이와달리 Open 된시스템인만큼보안의취약점을미리사전에파악하여패치함으로관리자의관심만유지되면보안에더강력하다고말할수있다. 레드헷리눅스의경우 up2date 란프로그램을통해윈도우처럼자동으로패키지를업데이트할수있는데기본적으로배포판에설치되는 up2date 로업그레이드를하면 SSL 인증에러가발생하게될것이다. 이는현재배포버전인 Redhat9 이발표된이후레드헷사의 up2date 인증방식에변경이있었기때문에정상적인 up2date를이용하여전체적인패키지업데이트를하기위해서는먼저 up2date 를업그레이드해야한다. # wget ftp://updates.redhat.com/9/en/os/i386/up2date* 위의구문으로바로 up2date 에관련된패키지를다운받을수있을것이다. up2date / up2date-gnome 두개의패키지를다운받게될것인데이중 up2date-gnome 19/401 페이지
은 Xwindows 의 gnome 이설치된경우에만설치하도록한다. # rpm -Uvh up2date # /etc/rc.d/init.d/rhnsd restart # rhn_register 최초 rhn_register 를실행하면 rhn_register 구성편집화면이나오는데그냥 q 를치면빠저나온다. # rpm --import /usr/share/rhn/rpm-gpg-key # rhn_register # gpg --import /usr/share/rhn/rpm-gpg-key 레드헷사에현시스템의정보및간단한인증정보를기록합니다. 정식레드헷배포판을구매하면 up2date 의지원을계속받을수있지만공개배포판의경우에는 3개월기간제한이있기때문에설치시에한번지원받는다는의미를가진다. # up2date -p -> 현시스템이 RPM 패키지정보를정리한다. # up2date -u -d -> 업데이트를시킬패키지를다운받는다. up2date 에서 -d 옵션을사용하면업데이트대상패키지를다운받아 /var/spool/up2date 안데저장된다. -u 옵션만사용하면다운받아서업데이트패키지를바로설치하고설치가완료된 rpm 을삭제하게됩니다. 만일업데이트대상시스템이여러대일경우계속같은방법으로업데이트시킬필요없이한곳에서다운받아놓고그패키지를이용하여다른시스템들의업그레이드를시키는방법이편할것이다. 단위경우는시스템의패키지구성이유사한경우에의미가있다. 2 H/W Driver Update dmesg message 를살펴보면커널이로딩한장치의드라이브버전을확인할수있다. 흔히문제가되는것이 SCSI Controllor 와 Intel Gigabit Card 가대표적이다. 먼저현재시스템에설치시인식된장치를확인합니다. 20/401 페이지
# cat /etc/modules.conf ==================================================================== =========== alias eth0 e1000 alias eth1 e100 alias scsi_hostadapter aic7xxx alias usb-controller usb-uhci ==================================================================== =========== # dmesg grep Driver # dmesg grep DRIVER # dmesg grep driver scsi0 : Adaptec AIC7XXX EISA/VLB/PCI SCSI HBA DRIVER, Rev 6.2.8 Intel(R) PRO/1000 Network Driver - version 4.4.19-k1 Intel(R) PRO/100 Network Driver - version 2.1.29-k2 대표적인버전은 AIC79XX -> 2.0.2 이상 e1000 -> 5.0.43 이상 e100 -> 2.2.21 이상 의버전을설치하도록한다. rpm 으로만들어진드라이브버전은현시스템커널버전에의존함으로드라이버설치후 kernal upgrade를할경우에는반드시다시장치드라이브버전을확인하셔야합니다. 3. OS 관련기본보안정책및보안패키지설치 1 OS 관련기본보안정책 i. 데몬관리정책 21/401 페이지
* 불필요한데몬제거 /sbin/chkconfig --del anacron /sbin/chkconfig --del atd /sbin/chkconfig --del autofs /sbin/chkconfig --del echo /sbin/chkconfig --del finger /sbin/chkconfig --del gpm /sbin/chkconfig --del nfs /sbin/chkconfig --del nfslock /sbin/chkconfig --del portmap /sbin/chkconfig --del rlogin /sbin/chkconfig --del rsh /sbin/chkconfig --del rsync /sbin/chkconfig --del lpd /sbin/chkconfig --del xfs * 기본데몬 /sbin/chkconfig --add crond /sbin/chkconfig --add network /sbin/chkconfig --add sshd /sbin/chkconfig --add syslog * 서비스데몬 /sbin/chkconfig --add named /sbin/chkconfig --add proftpd /sbin/chkconfig --add sendmail /sbin/chkconfig --add nfs /sbin/chkconfig --add portmap /sbin/chkconfig --add rlogin /sbin/chkconfig --add rsh /sbin/chkconfig --add rsync * 불필요한 xinetd 데몬제거 22/401 페이지
# rm -f chargen # rm -f chargen-udp # rm -f daytime # rm -f daytime-udp # rm -f echo # rm -f echo-udp # rm -f finger # rm -f ntalk # rm -f rexec # rm -f rlogin # rm -f rsh # rm -f rsync # rm -f servers # rm -f services # rm -f sgi_fam # rm -f talk # rm -f telnet # rm -f time # rm -f time-udp # rm -f proftpd-inetd ii. 기본시스템계정정책 * 불필요한시스템계정삭제 # userdel adm # userdel lp # userdel sync # userdel shutdown # userdel halt # userdel news # userdel uucp # userdel operator # userdel games # userdel gopher * 불필요한시스템그룹삭제 23/401 페이지
# groupdel adm # groupdel lp # groupdel news # groupdel uucp # groupdel games # groupdel dip iii. 시스템퍼미션정책 * suid sgid 퍼미션의명령어검색후퍼미션변경 # find / -type f \( -perm -4000 -o -perm -2000 \) chmod 700 /usr/bin/chage chmod 700 /usr/bin/gpasswd chmod 700 /usr/bin/wall chmod 700 /usr/bin/chfn chmod 700 /usr/bin/chsh chmod 700 /usr/bin/newgrp chmod 700 /usr/bin/write chmod 700 /usr/bin/passwd chmod 700 /usr/bin/at chmod 700 /usr/bin/lockfile chmod 700 /usr/bin/rcp chmod 700 /usr/bin/rlogin chmod 700 /usr/bin/rsh chmod 700 /usr/bin/slocate chmod 700 /usr/bin/crontab chmod 700 /usr/libexec/openssh/ssh-keysign chmod 700 /usr/sbin/ping6 chmod 700 /usr/sbin/traceroute6 chmod 700 /usr/sbin/usernetctl chmod 700 /usr/sbin/userhelper chmod 700 /usr/sbin/lockdev chmod 700 /usr/sbin/userisdnctl chmod 700 /usr/sbin/sendmail.sendmail chmod 700 /usr/sbin/traceroute 24/401 페이지
chmod 700 /usr/sbin/utempter chmod 700 /bin/ping chmod 700 /bin/mount chmod 700 /bin/umount chmod 700 /bin/su chmod 700 /sbin/pam_timestamp_check chmod 700 /sbin/pwdb_chkpwd chmod 700 /sbin/unix_chkpwd chmod 700 /sbin/netreport chmod 4750 /usr/bin/rcp chmod 4750 /usr/bin/rsh chmod 4750 /usr/bin/rlogin chmod 4111 /usr/bin/sudo chmod 2750 /usr/sbin/sendmail.sendmail chmod 4750 /bin/su * 중요시스템설정파일보호정책 chattr +i /etc/fstab * 관리자그룹에포함된계정에게시스템관리명령어사용허용정책 chmod 750 /bin/ps chmod 750 /bin/netstat chmod 750 /bin/dmesg chmod 750 /bin/df chmod 750 /usr/bin/w chmod 750 /usr/bin/who chmod 750 /usr/bin/last chmod 750 /usr/bin/top chmod 750 /usr/sbin/lsof chgrp wheel /bin/ps chgrp wheel /bin/netstat chgrp wheel /bin/dmesg chgrp wheel /bin/df chgrp wheel /usr/bin/w 25/401 페이지
chgrp wheel /usr/bin/who chgrp wheel /usr/bin/last chgrp wheel /usr/bin/top chgrp wheel /usr/sbin/lsof chgrp wheel /usr/bin/rcp chgrp wheel /usr/bin/rsh chgrp wheel /usr/bin/rlogin # vi /etc/group ==================================================================.. wheel:x:10:root,clunix,alang. ================================================================== * 시스템최상위디렉토리퍼미션정책 chmod 711 / chmod 711 /home chmod 711 /var chmod 711 /var/log chmod 711 /etc chmod 700 /root iv. 일반사용자관리정책 * 일반 shell 사용자작업내용감시하기 /etc/profile 파일의제일밑부분에아래내용추가 =================================================================== if [ $LOGNAME!= "admin" ] then HISTFILE=/var/log/user_history 26/401 페이지
TMOUT=200 echo -n " =================================================================== userhistory 로그인 ID: $LOGNAME 접속시간 : `/bin/date` =================================================================== " >> /var/log/user_history fi =================================================================== /root/.bashrc 파일밑부분에다음라인추가 HISTFILE=/root/.bash_history TMOUT=-1 마지막으로 /var/log/user_history 파일의퍼미션을 662 으로해줍니다. v. TCP 보안정책 * TCP Wrapper 로 TCP 서비스접근권한정책 # vi /etc/hosts.deny sshd : ALL : twist ( /root/bin/hostchk Y Y %a %c %d %h %n %p %s %u ) & in.proftpd : ALL : twist ( /root/bin/hostchk Y Y %a %c %d %h %n %p %s %u ) & # vi /etc/hosts.allow sshd : localhost 127.0.0.1 211.241.202. 192.168.1. 27/401 페이지
in.proftpd : localhost 127.0.0.1 211.241.202. 192.168.1. # vi /root/bin/hostchk #!/bin/sh ################################ 변수정의부문 # 메일수신자 mailto=alang@clunix.com # 화면출력여부, 메일전송여부 dsp=$1; msg=$2 # 접속자정보등 a=$3; c=$4; d=$5; h=$6; n=$7; p=$8; s=$9; u=$10 # 현재시간 time=`date` # 접속시도자소속서버의 finger 정보 finger=`/usr/bin/finger -l @$h 2> /dev/null` ################################ 화면출력부문 if [ $dsp = Y ] then /bin/echo -n " =================================== 접속이허용되지않습니다. =================================== Access Time Client host address : $a : $time 28/401 페이지
" fi Client information : $c Client host name(or IP) : $h Client host name : $n Client user name : $u ################################ 메일송신부문 if [ $msg = Y ] then /bin/echo -n " =============================== 접속거부자상세정보 =============================== " \ Access Time : $time Access client host address : $a Access client information : $c The daemon process name : $d Access client host name(or IP) : $h Access client host name : $n The daemon process id : $p Server information : $s Access client user name : $u -------------------------------------- Access client finger information -------------------------------------- $finger ------------------------------------------------ /bin/mail -s "tcp_wrapper report [$d]" $mailto fi 29/401 페이지
* Syn Flooding DOS 공격방지정책 # vi /root/bin/synfl sysctl -w net.ipv4.tcp_max_syn_backlog=1024 sysctl -w net.ipv4.tcp_syncookies=1 sysctl -w net.ipv4.icmp_destunreach_rate=1 sysctl -w net.ipv4.icmp_echo_ignore_broadcasts=1 sysctl -w net.ipv4.icmp_echoreply_rate=1 sysctl -w net.ipv4.icmp_ignore_bogus_error_responses=1 sysctl -w net.ipv4.icmp_paramprob_rate=1 sysctl -w net.ipv4.icmp_timeexceed_rate=1 sysctl -w net.ipv4.igmp_max_memberships=1 sysctl -w net.ipv4.ip_default_ttl=64 sysctl -w net.ipv4.ip_forward=0 sysctl -w net.ipv4.ipfrag_time=15 sysctl -w net.ipv4.tcp_syn_retries=3 sysctl -w net.ipv4.tcp_retries1=3 sysctl -w net.ipv4.tcp_retries2=7 sysctl -w net.ipv4.conf.eth0.rp_filter=2 sysctl -w net.ipv4.conf.lo.rp_filter=2 susctl -w net.ipv4.conf.default.rp_filter=2 sysctl -w net.ipv4.conf.default.rp_filter=2 sysctl -w net.ipv4.conf.all.rp_filter=2 sysctl -w net.ipv4.conf.eth0.accept_redirects=0 sysctl -w net.ipv4.conf.lo.accept_redirects=0 sysctl -w net.ipv4.conf.default.accept_redirects=0 sysctl -w net.ipv4.conf.all.accept_redirects=0 sysctl -w net.ipv4.conf.eth0.accept_source_route=0 sysctl -w net.ipv4.conf.lo.accept_source_route=0 sysctl -w net.ipv4.conf.default.accept_source_route=0 sysctl -w net.ipv4.conf.all.accept_source_route=0 sysctl -w net.ipv4.conf.eth0.bootp_relay=0 sysctl -w net.ipv4.conf.lo.bootp_relay=0 sysctl -w net.ipv4.conf.default.bootp_relay=0 sysctl -w net.ipv4.conf.all.bootp_relay=0 30/401 페이지
sysctl -w net.ipv4.conf.eth0.log_martians=1 sysctl -w net.ipv4.conf.lo.log_martians=1 sysctl -w net.ipv4.conf.default.log_martians=1 sysctl -w net.ipv4.conf.all.log_martians=1 sysctl -w net.ipv4.conf.eth0.secure_redirects=0 sysctl -w net.ipv4.conf.lo.secure_redirects=0 sysctl -w net.ipv4.conf.default.secure_redirects=0 sysctl -w net.ipv4.conf.all.secure_redirects=0 sysctl -w net.ipv4.tcp_keepalive_time=30 sysctl -w net.ipv4.tcp_fin_timeout=30 sysctl -w net.ipv4.tcp_tw_buckets=1440000 sysctl -w net.ipv4.tcp_tw_buckets=1440000 sysctl -w net.ipv4.tcp_keepalive_probes=2 sysctl -w net.ipv4.tcp_max_ka_probes=100 * 시스템시작시자동실행코드추가 # vi /etc/rc.d/rc.local rdate -s time.bora.net /root/bin/synfl * 최종적으로 Open port scan 확인 기본적인 OS 설정및보안설정이완료되면최종적으로현재서비스가이루어지는 TCP/IP Port 에대해시스템초기상태에서알아두어야한다. 이후이때파악되지않는서비스포트가열려있을경우보안에의심을해보아야할것이다. Port Scan 도구로는가장많이사용하는것이 nmap,nc,netstat,lsof 등이다. 사용법은다음과같다. 31/401 페이지
nmap,nc,netstat 등을이용해서시스템의열린포트를점검한다. # nmap localhost -p 1-65535 # nc -w 3 -v -z localhost 1-65535 # netstat -ant grep LISTEN 21/tcp open ftp 22/tcp open ssh 23/tcp open telnet 25/tcp open smtp 53/tcp open domain 80/tcp open http 3306/tcp open mysql 2 보안패키지설치 i. fcheck 설치및관리 ** 파일무결성체크프로그램 (Fcheck 설치..) 지금까지의시스템설치후기본보안에신경을써야할부분에대해서알아보았고마지막으로현재기본보안처리된시스템의무결성에대해앞으로감시해서유지해야할것이다. 무결성체크프로그램으로는대표적인게 Tripwire 가있다. 하지만여기서소개하는 Fcheck 는가볍고간단하면서 Tripwire 의역활을충분히할수있다. 먼저프로그램을다운받도록하자. http://www.geocities.com/fcheck2000/ 가면최신프로그램이있을것이다. 다운을받고 /usr/local 및에둔다. 압축을풀고..fcheck,fcheck.cfg 파일의설정값을몇개수정하자. # tar xzvf FCheck_2.07.59.tar.gz 32/401 페이지
# cd fcheck # vi fcheck ############################################################### ############## # # # User modifiable variable definitions: # # # ############################################################### ############## # This should be passed through the command line, but hard coding still works $config="/usr/local/fcheck/fcheck.cfg"; ----------------------------------------- 이부분을시스템환경에맞게수정 ------------------------------------------------------------------- # vi fcheck.cfg ------------------------------------------------------------------- Directory = /etc/ Directory = /bin/ Directory = /usr/bin/ Directory = /sbin/ Directory = /usr/sbin/ Directory = /usr/local/bin/ Directory = /usr/local/sbin/ Directory = /lib/ Directory = /usr/lib/ Directory = /usr/local/lib/ # # Directory 설정은 fcheck 가체크할파일들이들어있는디렉토리로시스템에 # 중요한명령어나설정파일등이있는곳을정해주면된다. # Exclusion Exclusion = /etc/passwd = /etc/shadow 33/401 페이지
# # Exclusion 설정은 Directory 설정에서정한디렉토리중자주변경이되는파일 # 이있어서체크때마다걸리므로체크생략을요하는파일을정해주면된다. # 호스팅업체나기타자주사용자를추가하는서버라면위와같이해주면된다. # DataBase = /usr/local/fcheck/data/data.dbf # # DataBase 설정은리눅스파일정보를 DB 파일로저장해서다음체크시비교 # 분석할때사용되어진다. # TimeZone = GMT-9 # # 한국시간을적용한다. GMT-9 # #File = /usr/local/admtools/logs/sol.dbf File 설정은필요없으니주석처리해준다. 기타여러설정값이있으나크게작동하는데영향을주지않는다. 기본값을적용한다. 이와같이적용후 /usr/local/fcheck/data 디렉토리를만들어준다. # mkdir /usr/local/fcheck/data # /usr/local/fcheck/fcheck -ac 이와같이 fcheck -ac 로파일무결성체크를시작한다. 그럼 data 디렉토리안에 data.dbf 파일이생성되어진다. 이제 Directory 설정에해당하는디렉토리안에다가파일을하나생성하고재대로점검을하는지테스트를하여보자.. 34/401 페이지
# touch /etc/test # /usr/local/fcheck/fcheck -a 그럼아마아래와같은결과를출력할것이다. PROGRESS: validating integrity of /etc/ STATUS: ADDITION: [zzang911.net] /etc/test Inode Permissons Size Created On 19508 -rw-r--r-- 0 Sep 19 20:13 2001 자이제이명령어를이용하여주기적으로시스템파일무결성을체크하고관리자에게통보하는프로그램을만들어보도록하자. # vi fcheck.sh #!/bin/sh CHECK=`/usr/local/fcheck/fcheck -a grep Inode` HOSTNAME=`hostname` if [ -n "$CHECK" ] then /usr/local/fcheck/fcheck -a > fcheck_result mail -s "$HOSTNAME File 무결성체크결과 " admin@clunix.com < fcheck_result rm -f fcheck_result fi 간단한이정도스크립터로보다효율적인관리가가능해질것이다. 이제 cron 에등록시켜놓고.. 매일파일무결성체크를간단히메일로받아서관리할수있게된다. 만일변화된파일이정당한변화라면.. # /usr/local/fcheck/fcheck -ac 35/401 페이지
로 DBfile 를업데이트시켜줘야한다. 아님.. 계속메일이날아오게된다. 이로써시스템설치후점검해야할보안설정에대해서마치겠다. 시스템보안은초기의보안설정이아주큰부분을차지하고있다. 하지만.. 지속적은감시와관리역시초기보안상태를유지하는가장중요한작업이라고도할수있다. 4. OS 설치후중요데이터백업정책 이른바 정보보호 의마인드가확산되면서해킹이나크래킹에대비한정보보호의측면으로많은논의가되고정보가공유되고있지만정작매우중요한백업에대한구체적방식및주의점에대해서는많은정보가공유되고있지않는실정이다. 실무적으로시스템을담당하는이들은사전에백업의중요성을인식하지못하다가중요한데이터를훼손당하거나긴급하게데이터를복구하여야할필요성이있을경우에서야비로소백업의중요성을인식하여소잃고외양간고치는격으로백업을실시하거나, 설사백업을하더라도사전지식이나올바른정책없이실시하여매우비효율적인방법으로백업을하는경우가많이있다. 따라서이섹션에서는일반적으로폭넓게사용하고있는리눅스를중심으로보안이라는화두와결코따로갈수없는백업의방식과백업시주의점에대해알아보도록하겠다. 1 백업정책설정시고려할점. 백업을실시할경우어떤방법으로어떤매체를이용해어떤주기로할것인지이른바 백업정책 을설정하여야하는데. 이때고려하여야할점에대해알아보기로하자. (1) 호환성 - 자신이운영하는시스템에서백업의대상이되는데이터가각기다른운영체제와다른시스템과호환이될필요가있다면백업후데이터의호환성이나이식성을고려하여야한다. (2) 자동백업 - 사실백업이라는절차가만일의사고에대비하여꼭필요한절차이기는하지만손이많이가는작업이기는하다. 특히백업을하여야할대상이여러시스템이거 36/401 페이지
나하나의시스템내에서도일괄백업이아닌일부의데이터에대해서만백업을할필요가있다면일련의백업작업의자동화는필수라고할수있을것이다. (3) 비용 - 데이터의유실이나사고발생시에는백업의소중함을더없이인식하지만평소에는백업이마치사치라고생각하는사람이있을수도있다. 따라서가급적이면적은비용으로백업을할수있다면좋을것이다. (4) 작업의편리성 - 요즘에는편리하게백업정책을설정하고복잡한설정도쉽게할수있으며백업상황등을 GUI 환경으로볼수있는백업유틸리티나상용솔루션들이많이나와있다. 그러나이러한 X-Windows 기반의프로그램의경우일반데스크탑에서는유용하나보안을중요시하는서버시스템의경우 X-Windows 자체를사용하지않는경우가있으므로이부분은신중하게검토할필요가있다. (5) 네트워크백업 - 이부분은자동백업과함께가장중요한부분중의하나라고판단된다. 일반적으로백업은백업매체의자체백업 ( 또는 1차백업이라한다.) 뿐만아니라일정주기로 2차,3차백업을하게되는데, 이러한 2차,3차백업이자동으로되려면네트워크를통한백업이가능하여야한다. (6) 저장매체의선택 - 백업의매체에따라저장방식이다른경우가있으므로신중히선택되어야한다. 고전적인방식의테이프나추가의하드디스크, 다시쓸수있는 CD등다양한매체가있을수있다. 위의여러가지사항및자신이관리하는시스템의특성을고려하여저장매체를선택하여야할것이다. 권장할만한방식. 위의여러가지상황을고려하여이식성이높고여러옵션이지원되며백업파일을이용해복구시에서도강력한기능을제공하는 tar를이용하여, 하드디스크에저장하는방식을권장한다. tar는 "Tape ARchiver" 에서나온말에서도알수있듯이초기에주로테이프백업을위해자주쓰였던유틸리티인데, 이는리눅스를포함한변종의유닉스계열에서도모두사용이가능하고 Shell Script 등을이용하면복잡해보이는백업정책도쉽고단순하게세울수있으며백업후복구가필요한시점에서도강력한기능을발휘할수있다. 그리고, 예전에는주로테이프백업을선호하였지만요즘에는고속의고용량, 저가의하드드라이브가보편화되면서테이프보다는하드드라이브를추가장착하여백업매체로써널리이용하는추세이다. 37/401 페이지
2 백업의방식 그럼, 이제구체적으로어떻게백업할것인지백업의방식에대해이야기해보도록하자. 먼저, 어떤데이터를어떤주기로백업할것인가를선택하여야할것이다. 모든데이터를매일백업하는것은비효율적이므로꼭백업이필요한데이터만적당한주기로백업하는것이불필요한백업으로인한디스크공간을절약할수있고백업작업으로이한필요이상의프로세스를줄일수있다. 백업을할대상은, 다른서버에서복사 ( 이식 ) 가가능한바이너리나기본설정화일들은굳이백업할필요가없으며각시스템마다고유한시스템설정 (Configuration) 과실제데이터는반드시백업하여야할것이다. 일반적으로리눅스의경우대부분의설정은 /etc 디렉토리에있으며, 각종데이터는 /home 이하에, 그리고기타부가적으로설치하는프로그램은 /usr/local 에있으니자신의시스템고유의설정을고려하여각각의디렉토리이하에대해적절히백업을하면된다. 이를테면메일서버의경우추가적으로 /var/spool/mail 이하의데이터가매우중요하므로백업시추가하여야할것이다. 백업디렉토리설정시주의할점은 backup 이되는파일을다시백업하여무한루프에빠지는실수를주의하여야하고실시간으로시스템내프로세스에대한정보가저장되는 /proc 역시백업을하는실수를범하지말아야한다. 그럼. 예제를통해실제로백업을하는명령어를알아보도록하자. cd /backup tar cvpfz /backup/home.tar.gz /home --exclude=/home/test [ 스크립트 1 ] 위의명령에서사용한옵션에대해하나씩알아보도록하자. 먼저백업파일은 /backup 이라는디렉토리에서생성하기를원하므로 /backup 으로이동한후 tar 명령을이용해백업을시작한다. c" 는 Create a new archive 의뜻으로백업시새로운파일을생성하며 38/401 페이지
v" 는 Verbosely list files processed 의뜻으로백업시백업이진행되고있는상황및디렉토리리스트를보여주며 f" 는 archive file is local 의뜻이며명령어이후의이름이생성될파일의이름이라는뜻이며 p" 는 Preserve-Permissions 의뜻으로이전데이터의 Permission 정보를그대로보존한다는뜻이며 "z" 는 filter the archive through gzip의뜻으로 gzip 으로압축한다는뜻이다. 일반적으로 tar로백업시사용되는확장자규칙은압축되지않고단순히하나의파일로패킹 (packing) 한파일의경우에는 tar" 를, gzip 으로압축된파일의경우에는 tar.gz" 나 tgz" 를확장자로한다. 따라서확장자가 home.tar.gz 나 home.tgz 일경우 tar 로packing ( 즉단순히하나의파일로묶기만함 ) 된후 gzip 으로압축되었음을뜻한다. [ 스크립트 1] 과같이실행되었을경우에는 /backup 디렉토리에 /home/test 이하를제외한 /home 이하의모든파일들이 home.tar.gz 라는이름으로생성된다. 제외할디렉토리나파일이더있을경우에는 -- exclude 옵션을계속이어서쓰면된다. 그리고백업시 ``z'' ( 압축 ) 옵션의사용에유의하여야한다. 단순히하나의파일로압축백업시에는때에따라데이터의일부가손상되는경우가있는데, 이때에는백업된파일전체가깨어져복구를할수없게되는경우가있다. 백업시압축을하지않고단순히 tar 로 Packing한 ( 묶은 ) 경우에는설사파일이깨어지거나손상되었다하더라도파일의복구가가능하기때문에백업시압축을할것인지여부를신중히선택하여야한다. 아울러현재까지최신안정커널인 Kernel 2.2 리눅스의경우, 하나의파일은최대 2G 가최대사이즈인데, 특정파티션이하에많은파일이있어하나의파일로백업하였는데, 2G를넘을경우에는적당히분산하여백업을하여야한다. 이때에는아래와같은방법이가능할것이다. tar cvfpz home_a_h.tar.gz /home/[a-h]* tar cvfpz home_i_p.tar.gz /home/[i-p]* tar cvfpz home_q_z.tar.gz /home/[q-z]* /home 이하의디렉토리에많은하부디렉토리및파일이있을때에는전체디렉토리를백업할경우 2기가를초과하여백업파일이제대로생성되지않으므로, 이를 /home 이하의디렉토리명이나피일이름의이니셜로구분하여 3등분하면서백업을하는것이다. 39/401 페이지
그럼, 실제로백업을하는스크립트를분석해보자. #!/bin/sh... (1) cd /backup... (2) rm -f *.tar.gz... (3) tar cvfpz apache.tar.gz /usr/local/apache/*... (4) tar cvfpz home.tar.gz /home/* --exclude=/home/test... (5) tar cvfpz etc.tar.gz /etc/*... (6) tar cvfpz mail.tar.gz /var/spool/mail/*... (7), chown backup.backup *.tar.gz... (8) chmod 700 *.tar.gz... (9) ls -alh mail -s www50_backup backup@clunix.com... (10) df -sh mail -s www50_df backup@clunix.com... (11) [ 스크립트 2 ] (1) 번은시작되는내용이 Shell Script 임을정의한다. (2) 백업작업이이루어지는파티션인 /backup 으로이동한다. (3) 새롭게백업을하여아하므로기존의백업된파일을모두삭제한다. (4) - (7) 번까지는백업을해야할디렉토리이하에대해데이터를각각백업한다. (8) 백업된파일의소유권을 backup 으로설정한다. (9) 백업된파일의권한을 700 으로설정한다. (10) 백업이제대로되었는지확인하기위해현재의디렉토리내백업파일의리스트등의정보를백업담당자인 backup@clunix.com 에게메일로발송한다. (11) 혹파티션이가득찰수도있으니현재의파티션사용정보를백업담당자에게메일로발송한다. 별도의설명이필요하지않을정도로간단한스크립트이다. Shell 스크립트는실행되어야할명령어를순서대로나열하기만하면된다. 위예에서는 Full Backup을보여주고있는데, 필요에따라적절히 증가분백업 도이용하기바란다. 증가분 ( 변경분 ) 백업은풀백업을받은후기존의백업데이터와비교하여이미백업된이후변경되거나추가된부분만백업하는방식이다. 40/401 페이지
예를들어설명해보도록하자. 아래의예는백업을단순화하기위해 /home 에대해서만백업하는예를들겠다. 백업정책은일주일을단위로풀백업을받고이후매일증가분백업을하기로한다. #!/bin/sh...(1) TODAY=`date +"%d %b %Y"`... (2) PREVIOUSDAY=`cat FULL_BACKED_DAY`... (3) tar cvfpzg _modified_home.tgz -N "$PREVIOUSDAY" /home...(4) [ 스크립트 3 ] 먼저위의스크립트를실행하기에앞서 [ 스크립트 2] 를참고하여일주일을단위로 ( 정기적으로백업을하는방법은이후에설명할 CRON을이용하면된다.) /home 에대해 Full Backup을실행하기로한다.( 이때백업스크립트제일하단에 echo `date +"%d %b %Y"` > FULL_BACKED_DAY 를추가한다 ) 이후매일위의 [ 스크립트3] 스트립트를실행하면풀백업이후추가및변경된파일과디렉토리만선별하여별도로백업을하게되는것이다. (1) 실행되는스크립트가 Shell 스크립트임을정의한다. (2) 현재의시각을 -N 옵션이이해할수있는 13 Jan 2001 형태로 TODAY 라는변수에대입한다. (3) 이전에 Full 백업시의시각인 FULL_BACKED_DAY를읽어 PREVIOUSDAY 라는변수에대입한다. (4) /home 디렉토리이하에대해 Full 백업시의시각이후로변경, 추가된파일에대해서만 modified_home.tgz 라는파일로저장한다. 증가분백업스크립트는다소복잡하기는하지만각자의환경에따라 [ 스크립트 2] 스크립트와적절히혼합하여사용한다면프로세스의유발을최소화하여유용하게사용이가능할것이다. 그럼, 이의스크립트를매주또는매일일일이실행할필요없이자동으로실행할수있는방법은무엇일까? 이물음에해답을줄수있는것이바로 cron을이용하는것이다. cron 은일종의일정관리데몬으로서기본설정파일인 crontab 에서정해진시각에따라주기적으로명령을수행한다. crontab 은아래와같이 7개의구성요소로이루어지는데, 6번째필드 (User) 는생략되어도무방하다. 41/401 페이지
분 시 날짜 달 요일 사용자 명령어각항목은정수로나타낼수도있고또한몇개의항목은와일드카드문자로인식되는 ``*'' 문자로표현이가능한데, * 는 매 의의미이다. 즉시간항목에 * 이있다면매시간이라는뜻이고날짜항목에 * 이있으면매일이라는뜻이되는것이다. 그리고하나의필드에중복된시간을나타내고자하면콤마로구분하면되고, 연속된시간을나타내고자하면하이픈 (-) 을이용하여일정기간을나타낼수있다. 참고로분은 0-59, 시는 0-23, 날짜는 0-31, 달은 0-12(0또는 12는 12월, 1은 1월 ), 요일은 0-7(0과 7은일요일, 1은월요일 ) 로나타낸다. 그럼, crontab 파일을열어보자. 01 * * * * root run-parts /etc/cron.hourly 02 2 * * * root run-parts /etc/cron.daily 22 4 * * 0 root run-parts /etc/cron.weekly 42 4 1 * * root run-parts /etc/cron.monthly 0 0 * * 1 root rdate -s time.bora.net && clock -w 위설정에서각각의의미를알아보도록하자. 첫줄은매시 1분에 /etc/cron.hourly 디렉토리내의스크립트를실행한다는의미이고두번째줄은매일 02시 2분에 /etc/cron.daily 내의스크립트를실행한다는의미이며세번째줄은매월, 매일새벽 4시 22분에 /etc/cron.weekly 디렉토리내스크립트를실행하는것처럼보이지만 5번째필드인 < 요일 > 필드값이 * 이아닌 0 이므로 1주일에 1회일요일 (0이므로) 에 /etc/cron.weekly 디렉토리내의스크립트를실행하라는의미이다. 네번째줄은같은방식으로직접해석해보기바란다. 다섯번째줄과같이매일, 매주 0시0분, 매주월요일 (1) 에 rdate -s time.bora.net && clock -w 라는명령어를실행하라는형식으로직접명령어를지정해줄수도있다. 각디렉토리내실행스크립트는정기적으로시스템에의해실행이되어야하므로실행 (execute) 권한이있어야함은당연하다. 따라서위에서작성한스크립트를 700 정도의적당한실행권한을부여하여해당디렉토리에설정해주면될것이다. 또는직접 /etc/crontab를편집하여실행시간을정의할수도있다. 기타 tar나 crontab 에대한부가적인명령어옵셥은 man 페이지나 HOWTO 문서를참고하기바란다. 42/401 페이지
3 2 차및 3 차백업에대해 서버자체에서의 1차백업은짧은기간에정기적으로이전의백업을삭제하고새롭게백업을받으므로데이터의훼손이나삭제사실을늦게발견하였을경우에는이미삭제된데이터로백업을받아복구할수없는경우가발생한다. 또는자체백업이되는서버에장애가있거나백업데이터자체가훼손이되는경우도있다. 이러한경우에대비하여반드시 2차백업을, 가능하다면 3차백업까지설정하여운영하는것이필요한데, 2차백업은 1차백업의내용을 ftp로전송하거나, rsync를이용하여특정디렉토리이하에대해동기화를하는방법등이있다. 일반적으로백업주기를타이트하게설정시 1차백업은월, 수, 금새벽에진행하고, 2차백업은화, 목, 토새벽에, 그리고 3차백업은 2차백업서버에접속하여수, 일새벽정도에하는것이권장할만한방법이다. i. FTP 를이용한 2 차백업 ftp를이용한 2차백업서버로의전송은 expect 스크립트를이용해 ftp 작업을자동화할수있으며 ncftpget을이용, 스크립트를작성하는방법도있다. ## Expect script 를이용하는방법 #!/usr/bin/expect...(1) spawn ftp data.tt..co.kr...(2) expect "Name :"...(3) send "backup\r"...(4) expect "Password:"...(5) send "tomorrow\r"...(6) expect "ftp>"...(7) sleep 1... (8) send "bin\r"...(9) expect "200 Type set to I."...(10) sleep 1...(11) expect "ftp>"...(12) 43/401 페이지
send "get /backup/home.tar.gz /home/pr/data_home.tar.gz\r"...(13) expect " Kbytes/sec)"...(14) sleep 1...(15) expect "ftp>"...(16) send "quit\r"...(17) expect "221 Goodbye."...(18) interact...(19) (1) 먼저 expect 스크립트라는것을정의한후 (2) 백업을받으려는서버인 data.clunix.com 에 ftp로접속한다. (3)"Name :" 이라는응답이오기를기대 (expect) 한다. (4) 데이터서버에접속하기위해 username 인 backup 을입력후엔터를입력한다. (5) username을입력했으므로 Password: 라는반응이오기를기다린다. (6) username 에해당하는암호인 tomorrow를입력한다. ( 이부분은각자의환경에따라다를것이다 ) (7) ftp> 라는반응이오기를기다린다. (8) 1초간대기를한후 (9) binary 로전송을받아야하므로 bin 입력을한다. (10) 서버로부터 200 Type set to I 라는반응이오기를기다린후 (11) 1초간대기를한후 (12) ftp> 라는반응이오기를기대 (expect) 한후 (13) 원격지데이터서버의 /home/pr/data_home.tar.gz를백업서버의 /backup디렉토리에 home.tar.gz 라는파일로저장한다. (14) 사버로부터 Kbytes/sec) 라는메시지가출력되면 (15) 1초간대기를 (sleep) 한후 (16) ftp> 메시지가오기를기다린후 (17) quit를입력하여접속을끊고 (18) 221 Goodbye 메시지가나오기를기대한후 (19) 이후명령어입력정보를기다린다. 만약전송받는파일의사이즈가클경우에는 sleep 1 대신에 set timeout -1 를지정하여야정상적으로 ftp 전송이가능하다. 그러나 expect 보다는 ncftpget 을이용하는방법이더간단하고빠르게전송할수있다. 44/401 페이지
#!/bin/sh rm -f *.tar.gz...(1) ncftpget -u backup -p 'root///' data.clunix.com /home/data_backup \ '/backup/home.tar.gz'...(2) 이두줄로간단하게처리가되는데이는 (1) 기존의백업받았던데이터를삭제후 (2) ncftpget을이용해 data.clunix.com 에접속하여 /backup 디렉토리의 home.tar.gz 라는파일을백업서버의 /home/data_backup 디렉토리이하에 home.tar.gz 라는파일로 ncftp전송한다는뜻이다. expect 보다는 ncftpget 이좀더빠르고간단하므로 ncftpget을사용하기를권장한다. ii. RSYNC 를이용한 2 차백업 ncftpget 과비슷한방법으로 rsync 라는패키지를이용하는방법이있는데, 이는 rpm 으로도기본제공되므로쉽게이용이가능하며백업뿐만이아니라 Clustering 으로도적용가능하다. 설정방법은 (1) 먼저데이터서버의 /etc/inetd.conf 에 rsync stream tcp nowait root /usr/bin/rsync rsyncd --daemon를추가설정후 killall -HUP inetd 로 INETD를재설정한다. rsync 는포트 873을이용하며 --daemon은데몬모드로작동한다는뜻이다. (2) /etc/rsyncd.conf 에아래와같이설정한다. [mail] path = /backup comment = mail 서버 uid = root gid = root 45/401 페이지
use chroot = yes read only = yes hosts allow = 211.11.22.33 max connections = 1 [mail] rsync의서비스명으로어떠한이름을설정하여도된다. 단, 백업서버에서데이터전송시필요한설정이다. path 데이터를동기화할 ( 즉, 백업으로전송할 ) 디렉토리를설정한다. 여기에서는 /backup 이하의디렉토리에대해 2차백업을할것이다. comment 서비스명에대한설명이다. uid 파일을전송하는사용자의 uid로기본값은 nobody이다. gid 파일을전송하는사용자의 gid로기본값은 nobody이다. use chroot 위의 path를최상위디렉토리로사용하여이외의디렉토리는접근할수없도록하는설정으로보안상필요하므로꼭설정한다. read only 읽기전용모드로설정한다는의미이다. hosts allow 기본값은모든접속을받아들이므로보안을유지하려면반드시백업서버의 IP 를설정하여야한다. max connections 백업서버에서전송시동시접속자수를뜻한다. 1정도면적당하다. timeout 클라이언트에서의접근시타임아웃시간이다. 아래는데이터를백업할 2 차백업서버에서의설정내용이다. #!/bin/sh... (1) cd /mail_backup... (2) rm -rf *... (3) /usr/bin/rsync -av data.clunix.com::mail /mail_backup... (4) chown root.root *... (5) chmod 700 *... (6) (1) shell 스크립트임을정의한다. 46/401 페이지
(2) 백업을받을디렉토리인 /mail_backup 으로이동후 (3) 기존의백업받았던데이터를삭제한다. (4) rsync을이용해서버에접속하여데이터를받아온다. 이때 -a는아카이브모드로서파일의속성이나퍼미션및소유권등의정보를보존하여동기화한다는의미이며 -v 는 verbose 의의미로동기화의진행상황을자세하게보여준다. 데이터서버에서서비스명을 [mail] 로했으므로 data.clunix.com::mail 로설정되었으며동기화한데이터는 /mail_backup 이라는디렉토리에저장된다. (5),(6) 은위에서설명되었으며보다세부적인 rsynhc에대한내용은 HOWTO를참고하기바란다. 2차백업을좀더효율적으로하기위해서는데이터서버에이더넷카드를 2장설치하여 eth0 은일반서비스로이용하고 eth1은사설 IP를할당하여백업서버와 Direct 로연결하여백업시이용하는방법도있다. 이경우에는 2차백업시별도의이더넷카드로전송이되므로백업작업시발생하는이더넷카드에서의트래픽이서비스에영향을주지않아병목현상을피할수있고, 사설 IP를이용하므로백업서버의보안도일정정도강화할수있다. 단, 이러할경우백업서버는데이터서버와근거리에위치하여야하고, 사설 IP를할당하므로써백업서버에직접접근시사설 IP로접근하여야하는단점이있기는하다. 4 복구의방식 이제어렵게백업한파일을복구할필요가생기게되었다. 백업파일로부터의복구방법은그리복잡하지않은데, 복구시에는백업때와는달리 c 옵션대신 extract 의의미인 x를사용하는것만주의하면된다. 예를들어보면, tar zxvpf /backup/etc.tar.gz 와같이할경우현재의디렉토리에압축된파일에들어있는모든파일을복구하며 p옵션을주었으므로원래파일의소유자와퍼미션도그대로복구된다. 백업파일에있는모든파일을복구하는것이아니라특정디렉토리나파일에대해서만복구하려면아래와같이하면된다. 47/401 페이지
tar zxvpf /backup/home.tar.gz etc/passwd home/clunix/public_html 현재의디렉토리가 /home/user 라면위와같은경우현재의디렉토리에원래의 /etc/passwd 파일이 /home/user/etc/passwd 파일로복원이되고원래의 /home/clunix/public_html 이하의파일들이 /home/user/home/clunix/public_html 로복원되는것이다. 특정파일을지정할경우에는특정파일이복구되고, 디렉토리를지정할경우에는디렉토리이하의디렉토리및파일들이복원된다. 이때주의할점은백업이풀릴파일을지정시 /etc/passwd 와같이원래의절대경로를설정하면백업에서풀리면서현재의설정파일에백업본이그대로 overwrite를되므로주의하여야한다는점이다. 따라서복구시 / 를입력하지않는다. 5 백업및복구시주의점 (1) 데이터의변화주기및경중을고려하여백업주기를다르게설정한다. 백업할데이터가홈페이지관련데이터일경우일반적인 HTML 이나관련 GIF등의이미지파일들은자주변경이되지는않으며주로작업자의 PC에서작업후서버에업로드를하므로작업자의 PC에저장되어있는경우가많다. 그러므로이의데이터들은매일또는수시로백업을받을필요는없으며변경된내용만을백업하거나일정주기마다백업을하면된다. 그리고백업이동작시일반데이터뿐만아니라 zip 이나 asf 또는 mpeg 등과같이파일자체가압축되어있는형식의경우에는파일자체의사이즈가크고백업시많은부하를유발하게되므로이러한파일의경우에는꼭백업할필요가없다면데이터의경중을고려하여백업에서제외하거나백업일정을적당히조정할필요가있다. 요즘은회원제운영이보편화되면서대부분의홈페이지에서각종데이터베이스를연동하여사용하는경우가많은데, 데이터베이스의경우회원의 ID / PW 등의각종회원데이터가보관되고정보가자주변경되므로수시로백업을할필요가있다. 각데이터베이스프로그램의경우별도의백업명령어 (msqldump., mysqldump등 ) 가있으므로 tar 가아닌 dump 명령어를이용하는것도권장할만한다. (2) 1 차백업시백업파티션은별도의디스크로구성한다. 시스템인스톨시하나의물리적인디스크를여러파티션으로논리분할하여이용하는경우가많은데, 이때백업파티션의경우에는반드시별도의물리적인파티션분할을이용하여별도로디스크를구성하는것이중요하다. 이는만약데이터가보관된하드디스크가물리적인결함으로복구가불가능할경우이디스크에있던데이터는물론이고복구시필요한백업까지도함께복구가불가능하여백업으로서의의미가상실되기때문이 48/401 페이지
다. 일반적인데이터는빠른연산이필요하므로 SCSI 를이용하고백업디스크는비용부담이적은고용량의 IDE 방식도무난하다. (3) 백업된데이터에대한보안설정도중요하다. 일반적으로백업스크립트는 root 소유로작동하므로백업된파일이생성될때에는 root 소유로백업화일이생성된다. 그러나일반적으로 umask 는 022 로설정되어있으므로생성된백업파일은 644로저장된다. 644일경우아래와같이일반사용자가백업된파일에접근하여심지어는접근이불가능한 shadow 파일에도접근이가능하게되어보안상문제가될수있다. 따라서백업파티션을별도로구성하여백업이끝난후에는반드시백업파티션을 umount하여일반사용자가접근할수없도록하고백업을시작하기전에 mount를하면될것이다. 또는생성된파일의권한을 700 정도로제한하여도된다. 그리고백업작업중간에일반사용자가백업파일을복사할수도있으므로백업시작스크립트에 umask를 066으로설정하여생성되는파일의소유권을 600 으로하고백업이끝난후에 umask를다시 022로재설정하여일반사용자의비정상적인접근을차단할수있다. [user@www user]$id uid=500(user) gid=500(user) [user @www user]$ cat /etc/shadow cat: /etc/shadow: 허가거부됨 [user@www user]$ ls -la /backup/etc.tar.gz -rw-r--r-- 1 root root 954039 12월 12 04:22 /backup/etc.tar.gz [user@www user]$ cp /backup/etc.tar.gz. [user@www user]$ tar zxvfp etc.tar.gz etc/shadow etc/shadow [user@www user]$ cat etc/shadow root:$1$v.120zso3$cd/auqqr2eby0:11295:0:99999:7:-1:-1:134540356 bin:*:11266:0:99999:7::: daemon:*:11266:0:99999:7::: (4) 2 차, 3 차백업서버는가급적네트워크에서격리할필요가있다. 49/401 페이지
만약 1차백업이되고있는데이터서버가해킹을당해데이터가유실되었다면 2차나 3 차백업이되고있는서버의데이터로복원을하여야한다. 그런데, 만약 2차,3차백업서버도기존의서버와같은설정으로되어있어같은방식으로해킹을당해데이터가유실되었다면? 해결책이없는것이다. 따라서최후의보루라할수있는 2차,3차백업서버는기존의서버와환경설정을다르게하고관리자암호등접근권한도다르게설정할필요가있다. 그리고백업서버는일체의제공서비스없이백업만을담당하므로불필요한서비스는띄워놓을필요가없으며백업이작동할때이외에는네트워크에연결되어있을필요가거의없으므로백업이끝난후에는네트워크에서격리할필요가있는데, 이는 ipchains 등을이용하여자체방화벽을구성하여외부에서의접근을일체차단할수도있겠지만다음과같이아예네트워크에서격리를할수도있다. 백업시작전 : /etc/rc.d/init.d/network start 로 Netwok 연결백업종료후 : /etc/rc.d/init.d/network stop 로 Network 차단. 2차,3차백업서버는네트워크에서의격리뿐만아니라물리적으로도격리할필요가있다. 화재나천재지변등피치못할사정으로사고발생시백업서버가원 DATA가위치한서버와공동으로위치할경우돌이킬수없는문제가벌생할수있으므로가능한대로백업서버는다른건물로, 같은건물의경우라면다른층에위치하는것이좋다. 부득이같은층에있다면멀리위치시켜예기치못한서고의가능성을분산시키는것이필요하다. (5) 백업담당자를지정, 운영한다. 보안담당자도없는데백업담당자가필요하겠냐고생각할수있겠지만, 전담자까지는없더라도담당자는지정을하여정기적으로체크를함으로써보다책임성있고신뢰성있는백업체계를유지할필요가있다. 백업이되고있는줄알고복구를할일이있어백업서버를살펴보니 corn 데몬이죽어있다거나설정한스크립트가실행권한이없어실행이되고있지않는경우도있으니백업담당자가수시로체크를하여야한다. 백업체크일지를두거나정기적으로체크하는스크립트를만들어자동으로체크여부를알려주는것도좋은방법이될것이다. (6) tar 이외 cp를이용하는방법도고려할만하다. TAR를이용하여 Packing 이나압축없이 cp를이용하는방법도있는데, 이는일주일에 1회정도 cp -ap /etc /backup/ 와같이 /etc 디렉토리전체를풀복사한후 cp -aufp /etc/ /backup/etc/ 로풀복사이후새롭게생성이나변경, 수정된파일이나 50/401 페이지
디렉토리만복사하는방법도있다. (7) 라우터와스위칭의설정파일도백업을잊지않는다. 서버뿐만이아니라라우터와스위칭의 Configuration File 도설정변경시백업을할필요가있다. 특히라우터나스위칭의경우설정변경시원치않던설정까지변경되는경우가있고라우터의장애시에는라우터밑단에연결되어있는모든네트워크가영향을받으므로반드시백업을받아둘필요가있다. 다만설정이자주변경되지는않으므로정기적으로백업을할필요는없고, 설정이변경될때만그때그때마다설정파일을 Copy & Paste 로복사를해두면된다. 6 실전백업예제 이백업스크립터는총 3개의스크립터가필요하다. shell script 에대한준비가부족하다생각하면스크립터경로를변경하지말길바란다. /root/bin/backup-sh /root/bin/sysbkp /root/mesg/backupdisplay 이스크립터는매일중요데이터를백업하되이틀간의자료만을보관하는정책의스크립터입니다. # vi /root/bin/backup-sh #!/bin/sh 51/401 페이지
rdate -s time.bora.net bkdir_name=`date +%Y%m%d` # /dev/hdd 하드는백업하드를의미한다. 즉백업하드디스크가계속 mount 되어있다면 # 실제해커가들어왔을때백업파티션에있는백업자료까지도손상시킬수있기때문에 # 백업바로전에 mount 시켜주고백업작업이완료된후반드시 umount 시켜주도록한다. mount -t ext3 /dev/hdd /backup # 기존의백업자료를삭제한다. 즉오늘백업을하면실제 2 일전자료를삭제하는것이다. rm -rf /backup/bk_*-1 # 어제자료를다른이름으로하루더보관하기위한방법으로 Name Label 에다 -1 를붙여 # 디렉토리명을변경한다. mv /backup/* /backup/bk_${bkdir_name}-1 # 실제시스템백업리스트입니다. 각해당백업이저장될폴더를생성함. mkdir /backup/bk_${bkdir_name} mkdir /backup/bk_${bkdir_name}/home mkdir /backup/bk_${bkdir_name}/named mkdir /backup/bk_${bkdir_name}/named/zone mkdir /backup/bk_${bkdir_name}/passwd mkdir /backup/bk_${bkdir_name}/apache mkdir /backup/bk_${bkdir_name}/sendmail mkdir /backup/bk_${bkdir_name}/mysql mkdir /backup/bk_${bkdir_name}/real mkdir /backup/bk_${bkdir_name}/etc mkdir /backup/bk_${bkdir_name}/cron mkdir /backup/bk_${bkdir_name}/root # 사용자의개별데이터백업 ( 홈디렉토리백업 ) tar cvfpz /backup/home_a_h.tar.gz /home/[a-h]* tar cvfpz /backup/home_i_p.tar.gz /home/[i-p]* 52/401 페이지
tar cvfpz /backup/home_q_z.tar.gz /home/[q-z]* # 설정파일및시스템중요파일백업 # DNS 설정파일백업 cp -a /etc/named.conf /backup/bk_${bkdir_name}/named cp -a /etc/hosts /backup/bk_${bkdir_name}/named cp -a /etc/resolv.conf /backup/bk_${bkdir_name}/named cp -a /var/named/* /backup/bk_${bkdir_name}/named/zone # 메일설정파일백업 cp -a /etc/mail/* /backup/bk_${bkdir_name}/sendmail # 시스템계정설정파일백업 cp -a /etc/passwd* /backup/bk_${bkdir_name}/passwd cp -a /etc/shadow* /backup/bk_${bkdir_name}/passwd cp -a /etc/group* /backup/bk_${bkdir_name}/passwd # Apache web service 설정파일백업 cp -a /usr/local/apache/conf/httpd.conf /backup/bk_${bkdir_name}/apache # real media server 설정파일백업 cp -a /usr/local/real/rmserver.cfg /backup/bk_${bkdir_name}/real # 시스템자동설정 (cron) 에대한백업 cp -a /var/spool/cron/root /backup/bk_${bkdir_name}/cron # 사용자디스크쿼터에대한설정백업 cp -a /home/aquota.user* /backup/bk_${bkdir_name}/home # 시스템전체설정파일백업 53/401 페이지
tar czvfp /backup/bk_${bkdir_name}/etc/etc.tgz /etc # Mysql 데이터백업 ( 근래에는 /usr/local/mysql/data 디렉토리를사용하는경우있음 ) tar czvfp /backup/bk_${bkdir_name}/mysql/mysqldata.tgz /usr/local/mysql/var # root 디렉토리백업 tar czvfp /backup/bk_${bkdir_name}/root/root.tgz /root # 1 일동안수정된파일점검 -> 보안적인의미 find /home \! -type d -atime +1 -exec ls -l {} \; > /backup/bk_${bkdir_name}/home/today_access_file umount /backup sysbkp 스크립터는위의 backup-sh 스크립터를실행하고백업중에발생한오류및백업결과보고를관리자에게메일로해주는스크립터이다. # vi /root/bin/sysbkp #!/bin/sh data=`date +%Y%m%d` /root/bin/backup-sh 2> /root/mesg/err_all cat /root/mesg/err_all grep -v "Removing leading" > err_chk /root/mesg/backupdisplay > /root/mesg/backupnotice mail -s "$data 백업결과통보 " alang@clunix.com < /root/mesg/backupnotice 54/401 페이지
backupdisplay 스크립터는백업결과보고서의내용을보고서형태로정리해주는스크립터이다. # vi /root/mesg/backupdisplay #!/bin/sh bk_data=`date +%Y 년 %m 월 %d 일 %H 시 %M 분 ` echo -n " ----------------------------------------------------------- * * * WELCOM TO SYSTEM MANAGER WEB SITE!!!!!! * * SECURITY!! FAST!! GOOD!! WEBSERVER!! * * * * ------- http://www.clunix.com -------- * * * ----------------------------------------------------------- :*:...:*: :*:...:*: :*:...:*: :*:...:*: //////////////////// System user notice //////////////////// " if [! -s /root/mesg/err_chk ] then echo " 시스템백업이 $bk_data 에무사히마쳤습니다." else echo "$bk_data 이루어진백업에오류가발생하였습니다." fi echo -n " /////////////////////////////////////////////////////////// ////////////////// what's error /////////////////////////// 55/401 페이지
" echo /bin/cat /root/mesg/err_chk echo -n " /////////////////////////////////////////////////////////// :*: :*:...:*: :*:...:*: :*:.. :*:...:*: :*:...:*: :*:...*: ;; 워낙옛날에만든스크립터이지만지금에와서보니너무유치하다. 마지막으로 root 계정에서 /root/bin/sysbkp 스크립터를자동실행하게 cron 에등록한다. # crontab -e 0 3 * * * /root/bin/sysbkp # /etc/rc.d/init.d/crond restart 5. 문제발생시응급복구방법 파일시스템이깨졌거나해킹등의문제로정상부팅이안되는경우복구방법입니다. 실제리눅스커널로부팅을하는것이가장중요하다. 부팅을해서시스템상태를점검해야이다시설치를할지아님일부중요파일의백업을이용하여복구를할지결정이가능하다. 먼저시스템부팅이안된다. 이제부팅을시켜보자 1 긴급부팅시키기 56/401 페이지
1 장에서설정한 bootloader 설정내용도참조하세요. i. Linux 배포 CD 를통한부팅 단이때는기본적으로시스템의하드의파티션중 / 파티션의디바이스명을알고있어야한다. 1장에서언급한바와같이그래서초기셋팅후시스템정보를보관하는것은상당히중요하다. Linux Install CD 를넣고부팅한다. boot 프롬프트에다음내용을기재한다. boot : linux initrd= root=/dev/hda2 -> /dev/hda2 가실제 / 파티션의 device name 이는 Linux Install CD 에있는기본커널로시스템을부팅하여현시스템의 root mount point ( / ) 에접근하는것이다. 이경우는 IDE 하드에리눅스가설치된경우주로사용한다. SCSI 의경우 Install CD 커널에 SCSI 모듈정보가포함안되어져있어서 root device 를못찾는다면서실패할가능성이많다. 주로 Lilo 가깨졌을때많이사용한다. ii. rescue mode booting 역시 Linux Install CD 를이용하여부팅할때 boot 프롬프트에서 rescue 라는옵션과같이부팅 boot : linux rescue 그럼 text 설치과정과비슷하게넘어가다가 bash prompt ( # ) 바로떨어진다. 하드디스크에크게문제가없을경우에는 /mnt/sysimage 폴더에 system root 파티션이 mount 되어져있을것이다. # chroot /mnt/sysimage 하면마치정상적으로부팅한것처럼 mount 가되어진다. 이상태에서정검하면됩니다. 진짜중요한파일에문제가있어이것이안된다고하면 57/401 페이지
수동으로 mount 하여중요파일의손상정도를파악한다. rescue 방식은주로 SCSI 하드디스크일경우많이사용함. 주로 Lilo 깨졌을때, 파일시스템깨졌을때, 완전히망가졌을때 iii. single mode 로부팅하기 파일시스템에문제가발생하여파일시스템을체크하기위해부팅하는모드로 LILO Prompt 가뜨면.. Lilo : linux single 위와같이부팅한다. 그런후안정스럽게파일시스템을점검및복구한다. 이밖에파일시스템복구목적으로긴급부팅하는방법으로는 lilo: linux init=/bin/sh 도있다. 2 부팅디스켓만들기 먼저부팅디스켓으로사용할커널이미지를선택한다. 그리고선택한커널이미지가 root 장치 (root mount point) 가재대로잡혀있는지확인한다. # rdev /boot/vmlinuz Root device /dev/hda1 만일루트장치가현재잡혀있는거랑틀리다면아래와같이수정한다. # rdev /boot/vmlinuz /dev/hda3 # 58/401 페이지
이제깨끗한플로피디스켓하나준비하고포맷한다. # fdformat /dev/fd0 # dd if=/boot/vmlinuz of=/dev/fd0 bs=8192 3 파일시스템점검수리 # fsck -t [type] [device] fsck 파일점검은가능한 umount 한후에실행한다. 하지만 / 을 mount 하지않은면당근부팅이제대로될수없기에 / 를체크할때는플로피로부팅을하던지아님 single mode 로부팅한후체크한다. 체킹후 mount -t -w -o remount / 해주면된다. 4 RPM 패키지상태초기화하기 누가해킹혹은실수로 RPM 패키지의퍼미션이나권한등을변경하여정상적인작동을안할경우이를설치시상태로복구하는방법이다. # rpm --setperms -a 이로써 " 철학이있는리눅스설치 " 의모든내용을마치도록하겠습니다. 59/401 페이지
60/401 페이지
To construct internet service system in Redhat Linux 9 ( 리눅스기반인터넷서비스환경구성 ) 클루닉스기술부 2 차세미나자료 61/401 페이지
==================================================================== ========= Redhat 9 Linux Internet Service System 구축하기 ==================================================================== ========= * 주요내용 --------------------------------------------------------------------- 1. Bind 를이용한 DNS 서비스 2. Sendmail 을이용한 SMTP/POP3 메일서비스 3. Proftpd 를이용한 FTP 서비스 4. RealServer 를이용한 real media Streaming 서비스 5. Apache + PHP + Tomcat(JSP) + mysql 를이용한웹서비스 --------------------------------------------------------------------- * 사용된패키지 --------------------------------------------------------------------- OS : Redhat Linux 9 bind sendmail proftpd realserver apache php mysql tomcat tomcat-connectors Zend zlib tiff libpng clibpdf pdflib swf 62/401 페이지
freetype jpeg libungif gd --------------------------------------------------------------------- 1. BIND9 를이용한 DNS 서버구축하기 [root@ns /etc]# rndc-confgen > /etc/rndc.conf [root@ns /etc]# cat /etc/rndc.conf Key "rndc-key" { algorithm hmac-md5; secret "n+h/dagntmmekimn25/h4g=="; }; options { default-key "rndc-key"; default-server 127.0.0.1; default-port 953; }; [root@ns root]# vi /etc/rndc.conf key "syszone-key" { algorithm hmac-md5; secret "e05yfvyzq/y8hn+fmk7g9w=="; }; options { default-key "syszone-key"; default-server 127.0.0.1; default-port 953; }; rndc-key 값을자기사이트에맞게수정한다. ( 보안상문제 ) 63/401 페이지
[root@ns root]# vi /etc/named.conf options { directory "/var/named"; }; controls { inet 127.0.0.1 allow { localhost; } keys { "syszone-key"; }; }; key "syszone-key" { algorithm hmac-md5; secret "e05yfvyzq/y8hn+fmk7g9w=="; }; logging { category lame-servers { null; }; category unmatched { null; }; category network { null; }; category notify { null; }; }; zone "." IN { type hint; file "named.ca"; }; zone "localhost" IN { type master; file "localhost.zone"; allow-update { none; }; }; zone "41.238.211.in-addr.arpa" IN { 64/401 페이지
type master; file "syszone.rev"; }; zone "0.0.127.in-addr.arpa" IN { type master; file "named.local"; allow-update { none; }; }; zone "syszone.co.kr" IN { type master; file "syszone.zone"; allow-update { none; }; }; [root@ns root]# vi /var/named/syszone.zone $TTL 86400 @ IN SOA ns.syszone.co.kr. root.ns.syszone.co.kr. ( 1997092700 ; Serial 28800 ; Refresh 900 ; Retry 360000 ; Expire 3600 ) ; Minimum IN NS ns.syszone.co.kr. IN MX 10 mail IN A 211.238.41.180 ; ns IN A 211.238.41.180 ; www IN CNAME ns mail IN CNAME ns db IN CNAME ns ftp IN CNAME ns [root@ns root]# vi /var/named/syszone.rev $TTL 86400 @ IN SOA ns.syszone.co.kr. root.ns.syszone.co.kr. ( 65/401 페이지
1997022700 ; Serial 28800 ; Refresh 14400 ; Retry 3600000 ; Expire 86400 ) ; Minimum IN NS ns.syszone.co.kr. IN MX 10 mail.syszone.co.kr. 180 IN PTR syszone.co.kr. 180 IN PTR mail.syszone.co.kr. [root@ns root]# cat /etc/resolv.conf search syszone.co.kr nameserver 211.238.41.180 ;;; search 의의미 ;;; resolv.conf 파일에 search domain 을적어주는이유는여기에적힌도메인은보통자기자신의도메인을주로적고여기에적힌도메인의 sub name 은그냥 hostname 만으로도찾을수있게한다. [root@ns root]# nslookup mail ----------------------------------------------------------- Server: 211.238.41.180 Address: 211.238.41.180#53 mail.syszone.co.kr canonical name = ns.syszone.co.kr. Name: ns.syszone.co.kr Address: 211.238.41.180 ----------------------------------------------------------- 이제설정한도메인을검색해보자 [root@ns root]# nslookup syszone.co.kr ------------------------------------------------------------ Server: 211.238.41.180 66/401 페이지
Address: 211.238.41.180#53 Name: syszone.co.kr Address: 211.238.41.180 ------------------------------------------------------------ [root@ns root]# nslookup 211.238.41.180 ------------------------------------------------------------ Server: 211.238.41.180 Address: 211.238.41.180#53 180.41.238.211.in-addr.arpa name = mail.syszone.co.kr. 180.41.238.211.in-addr.arpa name = syszone.co.kr. ------------------------------------------------------------ ;; 주의점 ;; DNS 서버가방화벽안쪽에있을경우반드시 tcp 53 port 와 udp 953 port 를 open 시켜두어야한다. 2. Sendmail 로메일서버구축하기 인터넷이대중화되면서편지를주고받는것보다 E-Mail( 전자우편 ) 을주고받는것이일상적인일이되었습니다. 이번주테마에서는 E-Mail( 전자우편 ) 이어떻게전달되는지의개념과메일서버로가장많이사용되고있는 Sendmail의설치방법과사용법에대해서알아보도록하겠습니다. E-mail( 전자우편 ) 과메일서버 ----------------------------------------------------------------------------- Sendmail의설치와사용법을배우기전에 E-Mail( 전자우편 ) 이어떠한경로를통해전달되고어떻게사용되는지에대해살펴보겠습니다. 메일서버란인터넷에서 E-Mail( 전자우편 ) 을주고받는기능을수행하는서버를말하며, E-Mail( 전자우편 ) 은크게두종류의프로그램과프로토콜에의해전달됩니다. 여기서두종류의프로그램이란 MUA(Mail User Agent) 와 MTA(Mail Transfer Agent) 를말합니다. MUA로는사용자가직접메일을작성하거나보낼때사용하는넷스케이프메신저, 마이크로소프트아웃룩, 유도라등의프로그램이있고, MTA는실제로메일을전송해주는 Sendmail, Qmail등의프로그램이있습니다. 67/401 페이지
아래의그림과같이 Sendmail이설치된메일서버는 SMTP(Simple Mail Transfer Protocol) 프로토콜을사용하여메일을전송하고, 호스트로부터받은메일을클라이언트로전달할때는 POP3 또는 IMAP등의프로토콜을사용합니다. 예를들어 aroma@mail.linuxul.com이라는메일주소를가진사람이다른서버에계정을가진 nea@yahoo.co.kr이라는친구에게메일을보낸다고가정하면, 아래와같은과정을거쳐메일이전달됩니다. 1. aroma@mail.linuxul.com이라는사람이넷스케이프메신저와같은 MUA 프로그램에서보낸메일은먼저 SMTP 프로토콜을통해 mail.linuxul.com 메일서버에전달됩니다. 2. mail.linuxul.com에서대기하고있던 MTA데몬 (Sendmail) 은메일을메일큐디렉토리 (/var/spool/mqueue) 에임시저장한후 SMTP 프로토콜을통해다시 yahoo.co.kr메일서버로전송하고큐디렉토리에저장했던메일을삭제합니다. yahoo.co.kr에서는 sendmail 데몬이대기하고있다가 mail.linuxul.com 메일서버가보내온메일의도착지가자신의것인지확인한후맞으면메일박스 (/var/mail 디렉토리 ) 에 nea라는파일로저장합니다. 3. nea@yahoo.co.kr의사용자는마이크로소프트아웃룩이나유도라와같은 MUA를통해메일을확인하며, 이때에는 POP3나 IMAP등의프로토콜을통해메일이전송됩니다. Sendmail ----------------------------------------------------------------------------------- Sendmail은메일서버로가장많이사용되고있는 MTA프로그램으로공식사이트는 http://www.sendmail.org입니다. 대부분의리눅스배포판에기본적으로설치가되어있으므로자신의시스템에맞는환경설정을한후사용하시면됩니다. Sendmail의최신버전은 sendmail 8.11.2이며아래의사이트에서다운받을수있습니다. Sendmail 공식미러사이트 - ftp://ftp.sendmail.org Sendmail 미러사이트 - http://www.sendmail.org/mirrors.html 국내미러사이트 : ftp://ftp.linux.co.kr/server/sendmail 68/401 페이지
POP3와 IMAP ----------------------------------------------------------------------------------- 앞에서도설명했듯이넷스케이프메신저나마이크로소프트아웃룩과같은클라이언트프로그램에서메일을가져오려면메일서버에 POP3 또는 IMAP등의데몬이설치되어있어야합니다. POP3(Post Office Protocol version 3) 와 IMAP(Internet Message Access Protocol) 데몬은사용자의인증절차를거친후메일을클라이언트에보내는기능을수행합니다. RedHat 리눅스배포판에서는 IMAP과 POP 데몬을하나의패키지 (UW IMAP) 로제공하고있어누구나쉽게설치할수있으며최신버전은아래의사이트에서다운받으시면됩니다. UW IMAP 공식홈페이지 - http://www.washington.edu/imap/ UW IMAP 미러사이트 - ftp://ftp.cac.washington.edu/imap 국내미러사이트 - ftp://ftp.linux.co.kr/server/imap Sendmail 과 IMAP 설치하기 대부분의리눅스배포판에는 Sendmail이기본적으로내장되어있으므로최신버전이나보안문제로인해다시설치해야하는경우를제외하면소스를사용해설치하는경우는드물고배포판에들어있는 RPM 패키지를사용해설치합니다. Sendmail 설치하기 와우리눅스 7.0 까치버전을기본 OS로하여 Sendmail을설치하는방법에대해알아보겠습니다. 먼저 CD-ROM을마운트한후 /RedHat/RPMS 디렉토리에있는 sendmail을확인합니다. 기본적으로제공하는 Sendmail은 Sendmail-8.11.0입니다. # mount /dev/cdrom # cd /mnt/cdrom/redhat/rpms # ls sendmail* sendmail-8.11.0-8.i386.rpm sendmail-cf-8.11.0-8.i386.rpm sendmail-doc-8.11.0-8.i386.rpm 69/401 페이지
Sendmail에관련된 rpm패키지를모두설치합니다. # rpm -Uvh sendmail* sendmail ############################# sendmail-cf ############################# sendmail-doc ############################# Sendmail을실행하기전에 /etc/services 파일을열고 smpt 프로토콜에주석처리가되어있는지확인한후 Sendmail 서버를실행합니다. # cat /etc/services grep smtp smtp25/tcp mail smtp25/udp mail smtps 465/tcp # SMTP over SSL (TLS) Sendmail 서버가정상적으로실행되었는지확인하기위해 telnet을사용해 25번포트 (smpt) 로접속해봅니다. 아래와같은메시지가출력되면 Sendmail이정상적으로실행된것입니다. Sendmail 서버가정상적으로실행되었는지확인하기위해 telnet을사용해 25번포트 (smpt) 로접속해봅니다. 아래와같은메시지가출력되면 Sendmail이정상적으로실행된것입니다. # telnet 0 25 Trying 0.0.0.0... Connected to 0 (0.0.0.0). Escape character is '^]'. 220 xxxxxx.net ESMTP Sendmail 8.11.2/8.11.2; Sat, 21 Jul 2001 14:28:12 +0900 만약레드헷버젼이 7.1 이상부터는 relay 보안기능이강화되어서초기셋팅상태에서는내부사용자끼리만메일을보내고받을수있다. 원격지에서는이서버를통해서메일을주고받을수가없다. 일단.. 새로 sendmail.cf 파일을만들어야한다. 70/401 페이지
# cd /etc/mail /etc/mail/sendmail.mc 파일을수정한후 m4 를이용하여새로운 sendmail.cf 파일을만든다. (redhat 7.1 부터변경된사항 ) # vi sendmail.mc ------------------------------------------------------------------.. 아래설정부분제일앞에 "dnl" 을붙여준다. dnl DAEMON_OPTIONS(`Port=smtp,Addr=127.0.0.1, Name=MTA').. ------------------------------------------------------------------ # m4 sendmail.mc > /etc/sendmail.cf # /etc/rc.d/init.d/sendmail restart 확인하도록하자. # telnet 25 Trying x.x.x.x... Connected to 0. Escape character is '^]'. 220 xxxxxxx.net ESMTP Sendmail 8.11.2/8.11.2; Wed, 27 Jun 2001 01:29:51 +0900 Washington IMAP설치하기 ------------------------------------------------------------------------------------- Washington IMAP 역시 RPM 패키지로제공하고있으므로 CD-ROM을마운트한후쉽게설치할수있습니다. 먼저 CD-ROM에있는 UW IMAP 패키지를확인해보겠습니다. # mount /mnt/cdrom # cd /mnt/cdrom/redhat/rpms # ls imap* 71/401 페이지
imap-2000-3.i386.rpm Washington IMAP는 imap-2000-3이라는파일명으로패키징되어있으며, POP3와 IMAP 데몬이모두설치됩니다. # rpm -Uvh imap-2000-3.i386.rpm 이제설치한 imap과 pop3 데몬을클라이언트에서접속할수있도록실행시켜야합니다. 먼저 /etc/services 파일을열어 pop3와 imap의주석을제거하고아래와같이설정되었는지확인합니다. pop3 110/tcp pop-3 # POP version 3 pop3 110/udp pop-3 imap2 143/tcp imap # Interim Mail Access Proto v2 imap2 143/udp imap 레드햇 7.0 버전부터는슈퍼데몬이 inetd에서 xinetd로변경되었고, inetd.conf 설정파일이 xinetd.conf 파일로변경되었습니다. xinetd의기본적인설정파일들은 /etc/xinetd.d에위치하므로설치한 ipop3와 imaps 파일을열고 disable = no를추가하여아래의그림과같이설정합니다. # vi /etc/xinetd.d/ipop3 # default: on service pop3 { disable = no socket_type = stream protocol = tcp wait = nowait user = root server = /usr/sbin/ipop3d 72/401 페이지
log_on_success += USERID log_on_failure += USERID } 다음에는슈퍼데몬을다시재시작합니다. # /etc/rc.d/init.d/xinetd restart 이제마지막으로설치한 POP3와 IMAP이제대로가동되었는지확인해보겠습니다. telnet을이용하여 25번포트 (POP3) 와 143번포트 (IMAP) 로접속한후아래와같이테스트해봅니다. 여기까지제대로되었다면설치는성공한것입니다. 이밖에 pop 프로그램으로많이사용하는 qpopper 의설치에대해알아보자. pop 데몬으로 qpopper 를사용할것이기때문에최신소스를다운받는다. 다운받은소스를풀고그디렉토리로이동한다음... #./configure --enable-specialauth --enable-servermode --enable-shy # make # cp popper/popper /usr/local/lib inetd.conf 파일을 redhat 7.1 부터는쓰지않으므로 xinetd 방식으로전환한다. 먼저 inetd.conf 파일을 /etc 밑에만들고 pop 설정부분을적어준다. # vi inetd.conf --------------------------------------------------------------------------- pop-3 stream tcp nowait root /usr/local/lib/popper --------------------------------------------------------------------------- # inetdconvert -d /etc/xinetd.d pop-3 # /etc/rc.d/init.d/xinetd restart 확인하자. 73/401 페이지
# telnet 0 110 Trying 0.0.0.0... Connected to 0. Escape character is '^]'. +OK ready 이것으로센드메일에관련되어 smtp, pop 모든셋팅을마쳤다. Sendmail 설정하기 ------------------------------------------------------------------------------------------- Sendmail에서가장중요하고도어려운부분이 sendmail.cf 파일의설정입니다. O Reilly사에서 Sendmail에대한전문서적이나올정도로방대하고다양한기능을가지고있으며사용법도매우다양합니다. Sendmail을사용하기위해기본적으로알아야할설정파일들에대해살펴보겠습니다. /etc/sendmail.cf Sendmail의가장중요한설정파일로 /etc 또는 /etc/mail 디렉토리에자동으로설치되어있습니다. Sendmail.cf에대한자세한내용은 Bryan Costales 와 Eric Allman이집필한 O Reilly의 Sendmail을참고하시거나이상로님의홈페이지 http://trade.chonbuk.ac.kr/~leesl/mail/ 을참고하시기바랍니다. 여기서는간단히메일서버를관리하기위한몇가지설정에대해서만다루겠습니다. Fw/etc/mail/local-host-names 메일을수신할호스트이름을명시한파일의위치를설정합니다. FR-o /etc/mail/relay-domains relay-domains파일에는 Relay를허용할호스트의이름을설정합니다. 주석으로처리하면모든 IP에대해서 Relay가허용되므로스팸메일과같은문제가발생할수도있으므로주의하시기바랍니다. DnMAILER-DAEMON Sendmail 서버가에러메시지를보내야할경우보낸사람의이름을결정합니다. 잘못된메일이되돌아온경우 FROM : Mail Delivery Subsystem 74/401 페이지
<mailer-daemon> 과같은메시지를보신적이있을것입니다. Kaccess hash /etc/mail/access Relay를허용하거나거부할특정 IP와도메인을설정하는파일입니다. relay-domains보다사용이편리하므로많이사용됩니다. O ForwardPath=$z/.forward.$w:$z/.forward 여러개의메일을가진경우, 특정메일계정으로들어온메일을다른메일로곧바로보내주는포워딩파일을설정합니다. 사용자의홈디렉토리에.forward라는파일을만들고포워딩시킬메일주소를입력하면됩니다. # O MaxMessageSize=1000000 메일의최대크기를결정합니다. 주석을제거하면설정한크기 (Byte단위) 보다큰메일은전송할수없게됩니다. 지금써준 1000000은 1메가로제한한메일용량입니다. O QueueDirectory=/var/spool/mqueue 큐디렉토리를설정합니다. O Timeout.queuereturn=5d 메일을보내려는호스트에문제가생기면메일은큐디렉토리에저장됩니다. Sendmail 서버는쌓인메일을상대방호스트에보내기위해주기적으로접속을시도하며, 일정한기간이지나면메일을다시발송한사람에게되돌려보냅니다. Sendmail이메일을보내려고시도하는기간을설정하는옵션으로 5d는 5일을의미합니다. O Timeout.queuewarn=4h 큐디렉토리에쌓인메일이지정한시간안에전송되지못할경우메일을보낸사람에게경고메일을보냅니다. 기본값은 4h로 4시간안에전송되지못하면보낸사람에게경고의메일을보냅니다. Mlocal, P=/usr/bin/procmail, F=lsDFMAw5u:/ @qspfhn9, S=EnvFromL/HdrFromL, R=EnvToL/HdrToL, T=DNS/RFC822/X-Unix, 75/401 페이지
A=procmail -Y -a $h -d $u 사용자계정에대문자가있는경우에도메일을받을수있도록설정하려면 Mlocal로시작하는부분을찾아 F= 부분에 'u' 를추가합니다. /etc/mail/access 스팸메일을방지하기위해 Relay를허용할호스트의 IP와도메인을설정하는매우중요한파일입니다. Relay에대한자세한내용은 [Relay에대하여 ] 를참고하시기바랍니다. 먼저 vi에디터나 emacs를사용해 /etc/mail/access파일을열고릴레이를허용하거나거부할 IP 주소를아래와같이입력합니다. [root@zzang911 /root]# cat /etc/mail/access # Check the /usr/share/doc/sendmail-8.11.2/readme.cf file for a description # of the format of this file. (search for access_db in that file) # The /usr/share/doc/sendmail-8.11.2/readme.cf is part of the sendmail-doc # package. # # by default we allow relaying from localhost... localhost.localdomain RELAY localhost RELAY 127.0.0.1 RELAY xxx.xxx.xxx.xxx RELAY spam.com REJECT 위는 localhost 나 xxx.xxx.xxx.xxx 의특정 IP 에서는릴레이를허용하나 spam.com 에서는오는모든메일은릴레이를거부한다는뜻이다. 이와같이허용이나거부대역을지정후 access.db 파일을갱신시켜주면바로적용이된다. [root@zzang911 /root]# makemap hash /etc/mail/access < /etc/mail/access [Relay 에대하여 ] 76/401 페이지
그럼간단하게 Relay에대한개념을알아보겠습니다. 예를들어 A라는사람은 IP주소가 203.243.88.21이라는컴퓨터에서 aroma@mail.linuxul.com이라는메일을사용한다고가정하고, B라는사람은 IP주소가 168.211.106.34인컴퓨터에서 nea@yahoo.co.kr이라는메일을사용한다고가정합니다. B가 A에게메일을보내면메일은 203.249.88.21로가는것이아니라 mail.linuxul.com서버의 /var/mail 디렉토리밑에 aroma라는파일로복사가됩니다. 그러면 A는 MUA 프로그램을사용해메일을확인할수있지요. 그런데여기서중대한문제점이생겨나게됩니다. 아무나주소를맞게보내면그냥 /var/mail에쌓이게되는것이죠. 그래서하드디스크가메일로꽉차버리거나, 네트워크전송량의증가로네트워크가마비되는경우가생겨나게됩니다. 이문제를막기위해서고안된방법이바로 Relay라는방법입니다. Relay에는두가지방식이있습니다. o 첫번째는메일을보내는 [ 송신 ] 컴퓨터의제한 o 두번째는메일을받는 [ 수신 ] 컴퓨터의제한 Relay로주로쓰이는방법은메일을확인하는컴퓨터는제한하지않고메일을보내는것을제한하는것입니다. 즉, 위의그림과같이 /etc/mail/access파일에 203.243.88의 C클래스를허용가능하게해주면 203.243.88.21처럼허용그룹에들어있는컴퓨터에서는메일을보내고 / 받을수가있지만, 그룹에들지않은 168.211.106.34라는컴퓨터에서는메일을확인할수만있습니다. 또한 spam.com이라는도메인에속한호스트에서오는메일은보내기와받기가모두거부됩니다. /etc/mail/relay-domains을사용해도됩니다. 하지만, 차이점은 relay-domains을사용하면sendmail데몬을다시실행시켜주어야하지만 /etc/mail/access파일을사용하면다시실행할필요없이 makemap hash /etc/mail/access < /etc/mail/access라고실행만시켜주면됩니다. /etc/mail/local-host-names 메일을수신할호스트의이름을입력하는파일로, Sendmail 8.9.x 버전이하에서사용되었던 sendmail.cw 파일의명칭이 Sendmail 8.10.x 버전부터는 local-host-names로변경되었습니다. Sendmail 서버는이곳에적힌호스트의이름으로메일이들어오면더이상다른서버로메일을보내지않고자신의메일박스에저장합니다. 아래와같이메일서버의호스트이름을입력하거나여러개의가상호스트를사용한다면모두입력해야합니다. etc/aliases 77/401 페이지
특정사용자에게온메일을다른사람에게보내주거나, 메일링리스트를작성해야하는경우에사용되는파일로보안에주의하여사용해야합니다. aliases 파일을열어보면시스템계정들이아래와같이 root로 alias되어있습니다. 또한특정사용자를다른사용자로 alias 시킬수도있습니다. 메일링리스트작성하기 ------------------------------------------------------------------------------------------ 메일링리스트란동일한메일을여러사람에게보내야할경우사용되며, 그룹을지정해구성원들의목록을써주거나특정파일을지정하는방법등으로사용됩니다. 예를들어 aroma, bulpeng, bibi와같은사용자들을 test1라는그룹으로지정해보겠습니다. vi편집기로 /etc/aliases 파일을열고아래의라인을추가한후저장합니다. 앞으로 test1에게메일을보내면지정된모든사용자들에게메일이도착하게됩니다. test1: aroma, bulpeng, bibi 다른하나는특정파일을지정해주는방법으로 include 지시자를사용한후에파일의경로와파일이름을입력합니다. test2: :include:/etc/maillist/test2 # cat /etc/maillist/test2 aroma bulpeng bibi 파일을수정한후에는 newaliases 명령으로 aliases.db를만들어줍니다. # newaliases /etc/aliases: 40 aliases, longest 28 bytes, 434 bytes total 이제 test1 또는 test2로메일을보내면지정된사용자들 (aroma, bulpeng, bibi) 이모두메일을받아볼수있습니다. 78/401 페이지
sendmail 기본보안 ---------------------------------------------------------------------------------------- 설정파일속성변경하기 # chattr +i /etc/mail/sendmail.cf or /etc/sendmail.cf # chattr +i /etc/mail/local-host-nameds # chattr +i /etc/mail/aliases or /etc/aliases # chattr +i /etc/mail/access Sendmail deamon을실행하는쉘을바꾸어주기 Sendmail의보안을위해서는보통프로그램의 /bin/sh을 smrsh program으로바꾸어주어야합니다. /bin/sh로실행이되었을경우에해킹의우려가있으므로, 이를제한하기위해서 Sendmail 프로그램의실행을제한할필요가있기때문입니다. 하지만, 레드햇의 RPM으로설치했을경우에는 Default로설정이되어있습니다. /etc/mail/sendmail.cf 또는 /etc/sendmail.cf 파일에서 Mprog, P=/bin/sh, F=lsDFMoqeu9, S=EnvFromL/HdrFromL, R=EnvToL/H drtol, D=$z:/, T=X-Unix/X-Unix/X-Unix, A=sh -c $u 의굵게쓴파일을아래와같이바꾸어주고 Mprog, P=/usr/sbin/smrsh, F=lsDFMoqeu9, S=EnvFromL/HdrFromL, R=EnvToL/H drtol, D=$z:/, T=X-Unix/X-Unix/X-Unix, A=smrsh -c $u sendmail.cf 파일을저장하고아래와같이 sendmail deamon을재시작합니다. # /etc/rc.d/init.d/sendmail restart 79/401 페이지
인증되지않은사용자의 Sendmail Deamon사용을제한하기 Sendmail에는 Anti-Spam Feature를포함하고있습니다. 이기능을제대로사용하기위해서는 /etc/mail/sendmail.cf 또는 /etc/sendmail.cf파일에서옵션을바꾸어주어야합니다. # privacy flags O PrivacyOptions=authwarnings, goaway Sendmail에서 goaway 옵션을사용할경우에 SMTP의 EXPN, VRFY명령어를제한하게됩니다. 이로인해서 VERB명령어도더불어제한하게됩니다. 처음 SMTP에접하시는분들은이명령어에대해서생소할수있으므로약간의설명을덧붙이겠습니다. STMP에접속하여서 MAIL을전달하기위해서는여러가지명령어를사용하게되어있습니다. 아래와같이접속후 HELP 명령어를타이핑하면 HELO, EHLO, MAIL, RCPT, DATA, RSET, NOOP, QUIT, HELP, VRFY, EXPN, VERB ETRN, DSN, AUTH, STARTTLS등의사용가능한명령어를보실수있습니다. 자세한사용법과내용은 HELP <command> 하시면알수있습니다. HELP AUTH <- 입력 214-2.0.0 AUTH mechanism [initial-response] 214-2.0.0 Start authentication. 214 2.0.0 End of HELP info EXPN aroma <- 입력 (Mail list의관계된메일계정을보여줄수있는명령어입니다.) 250 2.1.5 <sweetness@linux.co.kr> VRFY aroma <- 입력 (Alias에관계된메일계정을보여줄수있는명령어입니다.) 250 2.1.5 <aroma@mail.linuxul.com> 보안설정후에는아래와같은메시지가나타납니다. EXPN aroma <- 입력 502 5.7.0 Sorry, we do not allow this operation 80/401 페이지
mailq command의제한하기 /usr/bin/mailq 명령어를제한하기위해서는 /etc/mail/sendmail.cf or /etc/sendmail.cf파일에서옵션을바꾸어주어야합니다. # privacy flags O PrivacyOptions=authwarnings, goaway, restrictmailq 또한, queue디렉토리를 root권한으로막아주고재시작합니다. #chmod 0700 /var/spool/mqueue #/etc/rc.d/init.d/sendmail restart mailq명령어를실행시키면아래와같은메시지가나타납니다. aroma$ mailq You are not permited to see the queue Queue 프로세스를 root권한으로제한하기 Queue프로세스를 root권한으로제한하기위해서는 /etc/mail/sendmail.cf 또는 /etc/sendmail.cf파일에서아래와같이옵션을바꾸어줍니다. # privacy flags O PrivacyOptions=authwarnings, goaway, restrictmailq, restrictqrun 파일을저장후재시작합니다. #/etc/rc.d/init.d/sendmail restart SMTP Greeting Message를수정하기 Sendmail의 Version 정보라든지여러가지이유로 Connected중에보여주는아래와같은메시지들을바꾸어주므로, 불필요한정보를숨길수있습니다. [root@mail /root]# telnet mail.linuxul.com 25 81/401 페이지
Trying 211.106.100.89... Connected to mail.linuxul.com. Escape character is '^]'. 220 mail.linuxul.com ESMTP Sendmail 8.11.0/8.11.0; Wed, 21 Feb 2001 22:50:51 +0900 /etc/mail/sendmail.cf 또는 /etc/sendmail.cf파일에서옵션을바꾸어주어야합니다. # SMTP initial login message (old $e macro) O SmtpGreetingMessage=$j Sendmail $v/$z; $b 를아래와같이수정합니다. # SMTP initial login message (old $e macro) O SmtpGreetingMessage=$j 파일을저장후 Sendmail을재시작합니다. #/etc/rc.d/init.d/sendmail restart 수정후에는아래와같은메시지가출력됩니다. # telnet mail.linuxul.com 25 220 localhost.localdomain ESMTP Sendmail 모니터링 [Sendmail의프로세스상태보기 ] # ps aux grep sendmail root 21094 0.0 0.3 3244 1504? S 08:43 0:00 sendmail: accepti [Sendmail 의 mail 상태를모니터링하기 ] [root@ns /root]# mailstats 82/401 페이지
Statistics from Wed Jan 23 04:02:04 1980 M msgsfr bytes_from msgsto bytes_to msgsrej msgsdis Mailer 5 361145 14357435K 89312 3671483K 16983 0 esmtp 8 236772 11571389K 661786 20775066K 8687 0 local ============================================================= T 597917 25928824K 751098 24446549K 25670 0 [ 메일큐값모니터링하기 ] [root@ns /root]# mailq Mail Queue (5 requests) --Q-ID-- --Size-- -----Q-Time----- ------------Sender/Recipient------------ LAA21970 2375 Sat Jul 21 11:40 MAILER-DAEMON 8BITMIME (Deferred: Connection refused by web.kdlp.org.) QAA29807 11059 Fri Jul 20 16:58 MAILER-DAEMON 8BITMIME (Deferred: Connection refused by tmail.simmani.com.) OAA05202 3153 Wed Jul 18 14:43 MAILER-DAEMON 8BITMIME (Deferred: Connection refused by web.kdlp.org.) PAA19364* (no control file) praliases명령은현재메일시스템의 Aliases상태를보여줍니다. # praliases 3. Proftpd Server 구축하기 ftp://ftp.oops.org 에서 proftpd 를다운받는다 # rpm -Uvh proftpd-1.2.9-xkr.ixx.rpm --force # rpm -Uvh proftpd-doc-1.2.9-xkr.ixx.rpm --force [root@ns root]# vi /etc/proftpd/proftpd.conf ---------------------------------------------------------------------------- ServerName "ALANG1 FTP Server For CLUNIX" 83/401 페이지
# ServerType #ServerType DefaultServer ServerAdmin standalone inetd on root@localhost # 요즘에는 inverse domain 이거의지원되지않으니, 이설정은필수라고생각 # 하고수정하지않는다. # UseReverseDNS off IdentLookups off # Server 에접속했을경우보내주는 Defualt 메세지를설정한다. Off 로지정 # 하였을경우 Proftpd Server Ready ServerName 이출력된다. # ServerIdent On "ProFTPd Account Server ready.. " # User login 을했을시에 user 들이자신의홈상위디렉토리들을마음대로돌 # 아다니지못하게 chroot() 를설정한다. group 별로설정을하게되며 "!" 는 # 제외하라는의미를가지게된다. # DefaultRoot ~!wheel # ServerType이 standalone이면이항목의주석을풀어줘야한다. inetd로작 # 동을시킬시에는 /etc/services에서 port를지정한다. # Port 21 # root login 을허락할지의여부를지정한다. PAM modules를사용한다면먼저 # /etc/proftpd/ftpusers에서 root를삭제해야한다. # http://www.oops.org/service/jsboard/read.php?table=proftpdtip&no=10 참조 # RootLogin off # Global section은 proftpd의전체적인설정에모두적용시킨다. <Global> # group 과 world writable 로부터새로운 dir 과 file 들을생성하는것을 84/401 페이지
# 막기위하여기본적으로 umask는 022로설정을한다. Umask 022 # ftpusers file을이용하여 PAM 인증을하기를원하면이지시자의값을 on # 으로한다. default 값은 off 이다. AuthPAMAuthoritative on # service를시작하고마칠시간을 24시간표기법으로지정을한다. 이설정 # 은 Korea User Group 의 time limit 패치가적용이되어있어야사용이가 # 능하다. # # UpTime 10 # DownTime 23 # Server 의 Ftpd 시간을지역시간으로고정한다. on 으로했을경우 GMT 시 # 간을표시하기때문에한국의경우 9시간의오차가발생한다. TimesGMT off # 1.2.1 이하버젼에서의버그를위한설정 DenyFilter \*.*/ </Global> # 회선의 Bandwidth를특정속도로제한을한다. 단위는 Byte per Sec 이다. # 다운로드와업로드를 16KB/s (128Kb/s) 로제한 TransferRate RETR,STOR 102400 # 최대접속인원수를지정한다. MaxClients 10 # 하나의호스트로부터동시에접근할수있는수를지정한다. 아래의기본 # 설정으로는하나의호스트에서한번의접근만허용한다. MaxClientsPerHost 3 "Sorry, %m connection allow per one host" # 하나의계정 ID 로동시에접근할수있는호스트수를지정한다. 아래의 # 기본설정으로는하나의계정하나호스트에서만접근만허용한다. 하나의 # 계정에하나의접근만을허락하려면위의 MaxClientsPerHost의값과 # MaxHostsPerUser의값이둘다 1이면된다. #MaxHostsPerUser 1 "Sorry, %m hosts allow per one user" 85/401 페이지
# 접속대기시간을설정한다. user 가접속후아무작동도안할때일정시간후 # 에접속이종료되게한다 TimeoutIdle 900 TimeoutNoTransfer 900 TimeoutLogin 300 # DeferWelcome 는 client가인증을하기전에 servername을 display하는것을 # 방지한다. DeferWelcome off # 'welcome.msg 는 login 시에보여지고, 'message' 는각하위디렉토리에접 # 속했을때보여지게된다. DisplayLogin /etc/proftpd/welcome.msg DisplayFirstChdir.message # DoS(Denial Of Service) 공격을막기위해, 자식 process 의 maximun number # 를 30 으로설정한다. 만약 30이상의접속을허락할필요가있다면간단하게 # 이치수를증가시키도록한다. 이것은오직 standalone mode 에서만가능하 # 다. inetd mode 에서는 service 당 maximun number를제한하는것을허락하 # 는 inetd server에서설정을해야한다.(xinetd 역시마찬가지이다 ) # MaxInstances 30 User Group nobody nobody # 일반적으로 file들을 overwrite를가능하게한다. <Directory /*> AllowOverwrite on </Directory> # ls 명령어의 -a option으로 hidden file을볼수있게한다. # LsDefaultOptions "-a" <Anonymous ~ftp> User ftp Group ftp # /etc/shells 에등록되어있는 shell 이지정되어있는유저들만로그인이 86/401 페이지
# 가능하게한다. ftp user 의 shell 이보통 /bin/false 로지정이되어있 # 으므로이값을 off 로해준다. RequireValidShell off # 익명접근시의패스워드체크정도여부를결정을한다. AnonPassType 지시 # 자는 Korean User Group 의독자적인패치이다. # none -> 아무런체크를하지않는다. # trivial -> 패스워드에 @ 문자가존재하는지만체크한다. # complete-email -> 패스워드가완전한형태의이메일주소형식을가지는지 # 체크한다. AnonPassType none # 익명접근시사용하지못하게할패스워드를정규표현식으로설정한다. 이 # 지시자는 Korean User Group 의독자적인패치이다. # #AnonRejectPasswords ^(IEUser mozilla username test)@? # 익명접근을할때특정 password를지정할수있다. 단위의 User 지시자의 # name이 passwd file에등록이되어져있어야한다. 이지시자가 on일경우 # 이메일주소로 login을할수없다. # # 이지시자가설정되면, AnonPassType 이무시된다. # # AnonRequirePassword on # 링크된실경로출력여부 # ShowSymlinks off # User name "ftp" 로 anonymous login을할수있도록한다 UserAlias anonymous ftp <Limit LOGIN> Order allow,deny Allow from 211.238.41. Allow from 192.168.123. Deny from all </Limit> 87/401 페이지
DisplayLogin welcome.msg DisplayFirstChdir.message # 최대접속인원수를지정한다. MaxClients 10 # 하나의호스트로부터동시에접근할수있는수를지정한다. 아래의기본 # 설정으로는하나의호스트에서한번의접근만허용한다. MaxClientsPerHost 3 "Sorry, %m connection allow per one host" # 소유권이 root인 file이나 directory들을보여주지않는다 #HideUser root # 그룹권한이 root인 file이나 directory들을보여주지않는다 #HideGroup root # upload/download 비율을지원한다. # http://www.oops.org/service/jsboard/read.php?table=proftpdtip&no=9 참조 # # Ratios on # HostRatio foobar.net 100 10 5 100000 # 서버를시간대로운영하는것을지정한다. 아래의예는오후 3 시부터오 # 후 6시까지만서버의접속을가능하게한다. # # Korean User Group 의 time limit 패치가적용이되어있어야한다. # # UpTime 15 # DownTime 18 <Limit WRITE> DenyAll </Limit> <Limit READ> DenyALL </Limit> 88/401 페이지
# anonymous 계정으로접근할수있는디렉토리별로의허가권설정.. # 일단은모든디렉토리에쓰기권한은주지않는설정이다. <Directory *> <Limit WRITE> DenyAll </Limit> </Directory> # incoming 디렉토리에읽기권한을주기않고..upload 권한만부여. <Directory upload> <Limit READ> DenyAll </Limit> <Limit STOR MKD> AllowAll </Limit> </Directory> <Directory pub> <Limit READ> AllowALL </Limit> <Limit STOR MKD> Order allow,deny Allow from 211.238.41. Allow from 192.168.123. Deny from all </Limit> </Directory> </Anonymous> ------------------------------------------------------------------------------ [root@ns root]# ncftp -u alang syszone.co.kr Connecting to 211.238.41.180... ProFTPd Account Server ready.. Logging in... 89/401 페이지
Password requested by 211.238.41.180 for user "alang". Password required for alang. Password: ################################################################# # # # ProFTPD Korea User Groups # # http://proftpd.oops.org # # # # This file is printed when account ftp user login # # from /etc/proftpd/welcome.msg # # # ################################################################# User alang logged in. Logged in to syszone.co.kr. ncftp /home/alang > 4. Real Server 셋팅법 먼저일정한디렉토리에 realserver 프로그램을옮겨놓는다. 그런뒤실행파일인 g2p3-linux-c6.bin 에실행퍼미션을준다. [root@alang realserver]# chmod 755 g2p3-linux-c6.bin 실행시킨다. [root@alang realserver]#./g2p3-linux-c6.bin Welcome to the realserver Setup for UNIX Setup will help you get realserver running on your computer. Setup will step you through the installation process by displaying informational screens. Please follow the navigational controls below: 90/401 페이지
Key Behavior === ======== N Next P Previous X Exit F Finish (Express Installation) Each input requires the execution of the key above followed by the [ENTER] key. Enter [N]ext to continue:( 그냥엔터친다.) If a realserver license key file has been sent to you, please enter its directory path below. If you have not received a realserver license key file, then this server will default to a Basic RealServer. /usr/local/src/apmj/realplayserver/license.txt ( 여기는라이센스키가있는위치를적어준다. ) Installation and use of realserver requires acceptance of the following terms and conditions: Press [Enter] to display the license text... ( 엔터친다.) 그럼라이센스정보가나온다. REALNETWORKS, INC. END USER LICENSE AGREEMENT REALNETWORKS BASIC SERVER VERSION G2 REDISTRIBUTION NOT PERMITTED Software License for RealNetworks Basic Server Version G2 IMPORTANT -- READ CAREFULLY: This RealNetworks License Agreement ("License Agreement") is a legal agreement between you (either an individual or an entity) and RealNetworks, Inc. and its suppliers and licensors (collectively "RN") for RN's Basic Server Version G2 software ("Software"). You may install only ONE copy of the Software. By clicking on the "I Accept" button, installing, copying or otherwise using the Software, you agree to be bound by the terms of this License 91/401 페이지
Agreement. If you do not agree to the terms of this License Agreement, click on the "I Do Not Accept" button and/or do not install the Software. ANY THIRD PARTY SOFTWARE, INCLUDING ANY NON-RN PLUG-IN, THAT MAY BE PROVIDED WITH THE SOFTWARE IS INCLUDED FOR USE AT YOUR OPTION. IF YOU CHOOSE TO USE SUCH SOFTWARE, THEN SUCH USE SHALL BE GOVERNED BY SUCH THIRD PARTY'S LICENSE AGREEMENT, AN ELECTRONIC COPY OF WHICH WILL BE INSTALLED IN THE "realserver" DIRECTORY ON YOUR COMPUTER, UPON INSTALLATION OF THE SOFTWARE. 1. SOFTWARE OWNERSHIP. This is a license agreement and NOT an agreement for sale. This Software and the Documentation is proprietary to RN, and is protected by the copyright and other intellectual property laws of the United States and international treaties. The Software is licensed, not sold. RN continues to own the Software, and other content provided or --More--(13%) 중간생략... rbitration Association. The arbitrator's award shall be binding and may be entered as a judgment in any court of competent jurisdiction. This License Agreement will not be governed by the United Nations Convention of Contracts for the International Sale of Goods, the application of which is hereby expressly excluded. Copyright (c) 1995-1998 RealNetworks, Inc. and/or its suppliers. 1111 Third Avenue, Suite 2900, Seattle, Washington 98101 U.S.A. All rights reserved. RealNetworks, RealSystem, RealAudio, RealVideo, and RealPlayer, are trademarks or registered trademarks of RealNetworks. Basic Server Gold EULA 11-17-981 92/401 페이지
1 Choose "Accept" to accept the terms of this license agreement and continue with realserver setup. If you do not accept these terms, enter "No" and installation of realserver will be cancelled. ( 라이센스동의을묻는곳이다... 그냥엔터 ) Enter the complete path to the directory where you want to be installed. You must specify the full pathname of the directory and have write privileges to the chosen directory: /usr/local/real ( 리얼서버가인스톨되는디렉토리를적어준다.) Please enter a username and password that you will use to access the web-based RealSystem Administrator, the RealSystem monitors, and RealSystem live encoders: Username: admin ( 설치후웹상에서관리할수있는데사용할관리자아이디를적는다.) Password: ( 패스워드 ) Please enter a port on which realserver will listen for PNA connections. These connections have URLs that begin with "pnm://": (Default: 7070) (PNA 접속에 port를적어준다. - 디폴트권장 ) Please enter a port on which realserver will listen for RTSP connections. These connections have URLs that begin with "rtsp://": (Default: 554) ( RTSP 접속에사용할 port - 디폴트권장 ) Please enter a port on which realserver will listen for HTTP connections. These connections have URLs that begin with "http://": (Default: 8080) ( HTTP 접속에사용할 port - 디폴트권장 -> 만일 tomcat 설치시에는다른포트를사용한다. 8880) 93/401 페이지
realserver will listen for RealSystem Administrator requests on the port shown. This port has been initialized to a random value for security. Please verify now that this pre-assigned port will not interfere with ports already in use on your system; you can change it if necessary. (Default: 1278) 1975 ( 웹상에서관리자페이지로접속할때사용할포트번호 ) You have selected the following realserver configuration: Admin Username: admin Admin Password: muchun Monitor Password: muchun Encoder Username: admin Encoder Password: muchun PNA Port: 7070 RTSP Port: 554 HTTP Port: 8080 Admin Port: 1975 Enter [F]inish to begin copying files, or [P]revious to go back to the previous prompts: F ( 환경설정사항을확인한다. F 를눌려서계속진행 ) Copying RealNetworks program files... realserver installation is complete. The RealSystem Administrator allows you to configure and maintain realserver through an intuitive web-based interface. Please note that realserver must be running in order to use the Administrator. Would you like to start realserver now and launch the RealSystem Administrator? (Default: Yes) ( 리얼서버설치완료. 서버를실행하고관리자모드를실행하겠냐는메세지입니다. - 엔터 ) 94/401 페이지
설치가완료되었습니다. 웹에서 http:// 도메인 : 관리자포트번호 /admin/index.html 으로접속하면관리도구가나옵니다. 여기서서비스를관리하시면됩니다. 부팅시실행방법은 /etc/rc.d/rc.local 파일안에다음을추가 /usr/local/real/bin/rmserver /usr/local/real/rmserver.cfg -m 64 & 설정추가는웹에서도할수있고바로설정파일을수정할수도있다. # vi /usr/local/real/rmserver.cfg.. </List> <List Name="syszone"> <Var MountPoint="/syszone/"/> <Var ShortName="pn-local"/> <Var BasePath="/home/www/www"/> </List>.. # cd /home/www/www # vi rmtest.html <html> <body> <a href=./realtest.ram> 테스트 </a> </body> </html> # vi realtest.ram rtsp://211.238.41.180/syszone/realdb/yesterday.rm pnm://211.238.41.180/syszone/realdb/yesterday.rm http://211.238.41.180/rmtest.html 로접속해서확인할수있습니다. 95/401 페이지
5. Mysql + Apache + PHP + JSP + Library 5.1. mysql setting cd /usr/local/src/apmj tar xzvf mysql-4.0.20.tar.gz cd mysql-4.0.20./configure --prefix=/usr/local/mysql --localstatedir=/usr/local/mysql/data --with-mysqld-user=mysql -- with-charset=euc_kr make make install /usr/local/mysql/bin/mysql_install_db userdel -r mysql groupdel mysql groupadd mysql adduser -g mysql -d /usr/local/mysql/data -s /bin/false mysql chown -R mysql. /usr/local/mysql/data cp /usr/local/src/apmj/mysql-4.0.20/support-files/my-medium.cnf /etc/my.cnf vi /usr/local/mysql/share/mysql/mysql.server -------------------------------------------------------------------- $bindir/safe_mysqld --datadir=$datadir --pid-file=$pid_file 위행을찾아서뒤에아래옵션을추가로붙여준다. --language=korean --safe-show-database & -------------------------------------------------------------------- cp /usr/local/mysql/share/mysql/mysql.server /etc/rc.d/init.d/mysqld ln -s /etc/rc.d/init.d/mysqld /etc/rc.d/rc3.d/s90mysqld /etc/rc.d/init.d/mysqld start 5.2. lib setting 96/401 페이지
- zlib # rpm 으로 zlib 가설치되었다면삭제 rpm -e --nodeps zlib rpm -e --nodeps zlib-devel http://www.gzip.org/zlib/ 에서 zlib 을다운받습니다. cd /usr/local/src/apmj tar zxvf zlib-1.2.1.tar.gz cd zlib-1.2.1./configure -s // libz.so 생성 make./configure && make test && make install //libz.a 생성 cp libz.so* /usr/local/lib cd /usr/local/lib rm -rf libz.so rm -rf libz.so.1 ln -s libz.so.1.2.1 libz.so ln -s libz.so.1.2.1 libz.so.1 vi /etc/ld.so.conf -------------------------------------------------- /usr/local/lib /usr/lib... 97/401 페이지
-------------------------------------------------- 추가함 ldconfig // 추가된 LIB 환경설정을적용함 - tiff cd /usr/local/src/apmj tar xzvf tiff-v3.5.7.tar.gz cd tiff-v3.5.7./configure && make && make install - libpng rpm -e --nodeps libpng rpm -e --nodeps libpng-devel http://www.libpng.org/pub/png/libpng.html 에서다운.. tar zxvf libpng-1.2.5.tar.gz cd libpng-1.2.5 cp scripts/makefile.linux Makefile make test && make install - clibpdf http://www.fastio.com 에서다운.. cd /usr/local/src/apmj mv clibpds202r1.tar.tar clibpds202r1.tar.gz tar zxvf clibpds202r1.tar.gz cd ClibPDF/source mv Makefile Makefile.orig cp Makefile.Linux Makefile make lib && make install 98/401 페이지
- pdflib http://www.pdflib.com 에서다운.. tar zxvf pdflib-4.0.3.tar.gz cd pdflib-4.0.3./configure make && make install cd /usr/local/src/apmj - swf ftp://ftp.sgi.com/sgi/graphics/grafica/flash 에서다운.. cd /usr/local/src/apmj tar zxvf dist.99.linux.tar.z mkdir /usr/local/swf cd dist mkdir /usr/local/swf/include mkdir /usr/local/swf/lib mkdir /usr/local/swf/fonts mkdir /usr/local/swf/psfonts mkdir /usr/local/swf/bin cp swf.h /usr/local/swf/include cp libswf.a /usr/local/swf/lib cp bin/* /usr/local/swf/bin cp fonts/* /usr/local/swf/fonts cp psfonts/* /usr/local/swf/psfonts - freetype http://freetype.sourceforge.net cd /usr/local/src/apmj tar xzvf freetype-2.1.3.tar.gz cd freetype-2.1.3 99/401 페이지
./configure && make && make install - jpeg cd /usr/local/src/apmj tar xzvf jpegsrc.v6b.tar.gz cd jpeg-6b./configure --enable-shared --enable-static make && make test && make install - libungif rpm -e --nodeps libungif rpm -e --nodeps libungif-devel ftp://sunsite.unc.edu/pub/linux/libs/graphics 에서다운.. cd /usr/local/src/apmj tar zxvf libungif-4.1.0.tar.gz cd libungif-4.1.0./configure && make && make install - gd rpm -e --nodeps gd rpm -e --nodeps gd-devel http://www.boutell.com/gd/http/ 에서다운.. cd /usr/local/src/apmj tar zxvf gd-2.0.21.tar.gz cd gd-2.0.21./configure make && make install 100/401 페이지
- imap rpm -qa grep imap 설치확인후설치되있다면삭제... ftp://ftp.cac.washington.edu 에서다운.. cd /usr/local/apmj tar xzvf imap-2004.tar.z mv imap-2004 /usr/local/imap make slx //ssltype 관련 error 발생시.. Makefile 의 SSLTYPE을 nopwd 에서 none 으로변경한다. vi Makefile vi src/osdep/unix/makefile 컴파일이무사히끝났다면... cp imapd/imapd /usr/sbin cp ipopd/ipop3d /usr/sbin vi /etc/xinetd.d/imapd <= 아래의내용을새로적던지.. 복사붙여넣기한다.. service imap { disable = no socket_type = stream wait = no user = root server = /usr/sbin/imapd log_on_success += DURATION USERID log_on_failure += USERID } 저장후빠져나옴 101/401 페이지
vi /etc/xinetd.d/ipop3d <= 아래의내용을추가.. service pop3 { disable = no socket_type = stream wait = no user = root server = /usr/sbin/ipop3d log_on_success += USERID log_on_failure += USERID } cp c-client/c-client.a /usr/lib cp c-client/mail.h /usr/local/include cp c-client/rfc822.h /usr/local/include cp c-client/linkage.h /usr/local/include /etc/rc.d/init.d/xinetd restart // test // telnet localhost 110 telnet localhost 143 5.3 J2SDK 설치 cd /usr/local/src/apmj rpm -Uvh j2sdk-1_4_1_01-fcs-linux-i586.rpm cd /usr/java ln -s j2re1.4.2_03 jre ln -s j2sdk1.4.1_01 java vi /etc/profile ----------------------------------------------------.. # j2sdk config PATH="$PATH:/usr/java/java/bin" 102/401 페이지
export JAVA_HOME="/usr/java/java" ---------------------------------------------------- source /etc/profile // 확인 // # java -version java version "1.4.1_01" Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.1_01-b01) Java HotSpot(TM) Client VM (build 1.4.1_01-b01, mixed mode) 5.4 apache 1 차설치 cd /usr/local/src/apmj tar xzvf apache_1.3.31.tar.gz cd apache_1.3.31./configure --prefix=/usr/local/apache 5.5 jakarta-tomcat 설치 cd /usr/local/src/apmj tar xzvf jakarta-tomcat-4.1.30.tar.gz mv jakarta-tomcat-4.1.30 /usr/local/tomcat tar xzvf jakarta-tomcat-connectors-4.1.30-src.tar.gz cd jakarta-tomcat-connectors-4.1.30-src/jk/native./buildconf.sh./configure --with-apache=/usr/local/src/apmj/apache_1.3.31 make && make install // 확인 // ls -al /usr/local/src/apmj/apache_1.3.31/src/modules drwxr-xr-x 3 root root 4096 5월 31 21:35 jk 103/401 페이지
5.6 PHP 설치하기 cd /usr/local/src/apmj tar xzvf php-4.3.7.tar.gz cd php-4.3.7./configure --with-apache=/usr/local/src/apmj/apache_1.3.31 --with-mysql=/usr/local/mysql --withimap=/usr/local/imap --with-jpeg-dir=/usr/local/lib --with-png-dir=/usr/local/lib --with-gif-dir=/usr/lib -- with-zlib-dir=/usr/local/lib --with-gd --with-freetype-dir=/usr/include/freetype2 --with-zlib --with-tiffdir=/usr/local/lib --with-pdflib --with-cpdflib --with-gettext --with-swf=/usr/local/swf --withmod_charset --with-language=korean --with-charset=euc_kr --with-xml --enable-ftp --enable-sockets -- disable-debug --enable-system --enable-track-vars --enable-calendar --enable-magic-quotes make && make install cp libs/libphp4.a /usr/local/src/apmj/apache_1.3.31/src/modules/php4/ cp php.ini-dist /usr/local/lib/php.ini 5.7 apache 2 차셋팅 cd /usr/local/src/apmj/apache_1.3.31./configure --prefix=/usr/local/apache --activate-module=src/modules/php4/libphp4.a --activatemodule=src/modules/jk/lib/jk.a --enable-module=so --enable-rule=shared_core --enable-shared=max make && make install vi /usr/local/apache/conf/httpd.conf ------------------------------------------------------------------------------- 간단히 ServerName 의주석을풀고현시스테의도메인이나 IP 를적어준다. 800 줄근처에 AddType allplcation/x-httpd-php 로시작하는부분을찾아서.. AddType application/x-httpd-php.html.php3.php4.inc.phtml.php.ph <= 요렇게바꿉니다. ------------------------------------------------------------------------------- /usr/local/apache/bin/apachectl restart 5.8 Zend 설치하기 104/401 페이지
cd /usr/local/src/apmj tar xzvf ZendOptimizer-2\[1\].5.2-Linux_glibc21-i386.tar.gz cd ZendOptimizer-2.5.2-Linux_glibc21-i386./install 5.9 Apache httpd.conf 설정 ServerType standalone ServerRoot "/usr/local/apache" #LockFile /usr/local/apache/logs/httpd.lock PidFile /usr/local/apache/logs/httpd.pid ScoreBoardFile /usr/local/apache/logs/httpd.scoreboard #ResourceConfig /usr/local/apache/conf/srm.conf #AccessConfig /usr/local/apache/conf/access.conf Timeout 300 KeepAlive On MaxKeepAliveRequests 100 KeepAliveTimeout 15 MinSpareServers 20 MaxSpareServers 40 StartServers 20 MaxClients 150 MaxRequestsPerChild 0 #Listen 3000 #Listen 12.34.56.78:80 #BindAddress * 105/401 페이지
# Dynamic Shared Object (DSO) Support # LoadModule foo_module libexec/mod_foo.so LoadModule env_module libexec/mod_env.so LoadModule config_log_module libexec/mod_log_config.so LoadModule mime_module libexec/mod_mime.so LoadModule negotiation_module libexec/mod_negotiation.so LoadModule status_module libexec/mod_status.so LoadModule includes_module libexec/mod_include.so LoadModule autoindex_module libexec/mod_autoindex.so LoadModule dir_module libexec/mod_dir.so LoadModule cgi_module libexec/mod_cgi.so LoadModule asis_module libexec/mod_asis.so LoadModule imap_module libexec/mod_imap.so LoadModule action_module libexec/mod_actions.so LoadModule userdir_module libexec/mod_userdir.so LoadModule alias_module libexec/mod_alias.so LoadModule access_module libexec/mod_access.so LoadModule auth_module libexec/mod_auth.so LoadModule setenvif_module libexec/mod_setenvif.so #LoadModule php4_module libexec/libphp4.so #LoadModule jk_module libexec/libjk.so ClearModuleList AddModule mod_env.c AddModule mod_log_config.c AddModule mod_mime.c AddModule mod_negotiation.c AddModule mod_status.c AddModule mod_include.c AddModule mod_autoindex.c AddModule mod_dir.c AddModule mod_cgi.c AddModule mod_asis.c AddModule mod_imap.c AddModule mod_actions.c AddModule mod_userdir.c AddModule mod_alias.c 106/401 페이지
AddModule mod_access.c AddModule mod_auth.c AddModule mod_so.c AddModule mod_setenvif.c AddModule mod_php4.c #ExtendedStatus On Port 80 User nobody Group nobody ServerAdmin alang@syszone.co.kr ServerName 211.238.41.180 DocumentRoot "/usr/local/apache/htdocs" <Directory /> Options FollowSymLinks AllowOverride None </Directory> <Directory "/usr/local/apache/htdocs"> Options Indexes FollowSymLinks MultiViews AllowOverride None Order allow,deny Allow from all </Directory> <Directory "/home"> Options FollowSymLinks ExecCGI AllowOverride All Order allow,deny Allow from all Deny from env=go_out 107/401 페이지
Deny from export=go_out </Directory> <IfModule mod_userdir.c> UserDir www </IfModule> #<Directory /home/*/public_html> # AllowOverride FileInfo AuthConfig Limit # Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec # <Limit GET POST OPTIONS PROPFIND> # Order allow,deny # Allow from all # </Limit> # <LimitExcept GET POST OPTIONS PROPFIND> # Order deny,allow # Deny from all # </LimitExcept> #</Directory> <IfModule mod_dir.c> DirectoryIndex index.html index.htm index.php index.phtml index.php3 index.jsp </IfModule> AccessFileName.htaccess <Files ~ "^\.ht"> Order allow,deny Deny from all Satisfy All </Files> <Files ~ "^\.ht"> Order allow,deny Deny from all </Files> <Files ~ "*Chat*"> Order allow,deny 108/401 페이지
Deny from all </Files> <Files ~ "*CHAT*"> Order allow,deny Deny from all </Files> #CacheNegotiatedDocs UseCanonicalName On <IfModule mod_mime.c> TypesConfig /usr/local/apache/conf/mime.types </IfModule> DefaultType text/plain <IfModule mod_mime_magic.c> MIMEMagicFile /usr/local/apache/conf/magic </IfModule> HostnameLookups Off ErrorLog /usr/local/apache/logs/error_log LogLevel warn LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined LogFormat "%h %l %u %t \"%r\" %>s %b" common LogFormat "%{Referer}i -> %U" referer LogFormat "%{User-agent}i" agent CustomLog /usr/local/apache/logs/access_log common ServerSignature On # > AddType text/html.ahtml # > EBCDICConvert Off=InOut.ahtml # # EBCDICConvertByType On=InOut text/* message/* multipart/* # EBCDICConvertByType On=In application/x-www-form-urlencoded 109/401 페이지
# EBCDICConvertByType On=InOut application/postscript model/vrml # EBCDICConvertByType Off=InOut */* <IfModule mod_alias.c> Alias /icons/ "/usr/local/apache/icons/" <Directory "/usr/local/apache/icons"> Options Indexes MultiViews AllowOverride None Order allow,deny Allow from all </Directory> Alias /manual/ "/usr/local/apache/htdocs/manual/" <Directory "/usr/local/apache/htdocs/manual"> Options Indexes FollowSymlinks MultiViews AllowOverride None Order allow,deny Allow from all </Directory> ScriptAlias /cgi-bin/ "/usr/local/apache/cgi-bin/" <Directory "/usr/local/apache/cgi-bin"> AllowOverride None Options None Order allow,deny Allow from all </Directory> </IfModule> <IfModule mod_autoindex.c> IndexOptions FancyIndexing AddIconByEncoding (CMP,/icons/compressed.gif) x-compress x-gzip 110/401 페이지
AddIconByType (TXT,/icons/text.gif) text/* AddIconByType (IMG,/icons/image2.gif) image/* AddIconByType (SND,/icons/sound2.gif) audio/* AddIconByType (VID,/icons/movie.gif) video/* AddIcon /icons/binary.gif.bin.exe AddIcon /icons/binhex.gif.hqx AddIcon /icons/tar.gif.tar AddIcon /icons/world2.gif.wrl.wrl.gz.vrml.vrm.iv AddIcon /icons/compressed.gif.z.z.tgz.gz.zip AddIcon /icons/a.gif.ps.ai.eps AddIcon /icons/layout.gif.html.shtml.htm.pdf AddIcon /icons/text.gif.txt AddIcon /icons/c.gif.c AddIcon /icons/p.gif.pl.py AddIcon /icons/f.gif.for AddIcon /icons/dvi.gif.dvi AddIcon /icons/uuencoded.gif.uu AddIcon /icons/script.gif.conf.sh.shar.csh.ksh.tcl AddIcon /icons/tex.gif.tex AddIcon /icons/bomb.gif core AddIcon /icons/back.gif.. AddIcon /icons/hand.right.gif README AddIcon /icons/folder.gif ^^DIRECTORY^^ AddIcon /icons/blank.gif ^^BLANKICON^^ DefaultIcon /icons/unknown.gif #AddDescription "GZIP compressed document".gz #AddDescription "tar archive".tar #AddDescription "GZIP compressed tar archive".tgz ReadmeName README HeaderName HEADER IndexIgnore.??* *~ *# HEADER* README* RCS CVS *,v *,t 111/401 페이지
</IfModule> <IfModule mod_mime.c> AddLanguage da.dk AddLanguage nl.nl AddLanguage en.en AddLanguage et.ee AddLanguage fr.fr AddLanguage de.de AddLanguage el.el AddLanguage he.he AddCharset ISO-8859-8.iso8859-8 AddLanguage it.it AddLanguage ja.ja AddCharset ISO-2022-JP.jis AddLanguage kr.kr AddCharset ISO-2022-KR.iso-kr AddLanguage nn.nn AddLanguage no.no AddLanguage pl.po AddCharset ISO-8859-2.iso-pl AddLanguage pt.pt AddLanguage pt-br.pt-br AddLanguage ltz.lu AddLanguage ca.ca AddLanguage es.es AddLanguage sv.sv AddLanguage cs.cz.cs AddLanguage ru.ru AddLanguage zh-tw.zh-tw AddCharset Big5.Big5.big5 AddCharset WINDOWS-1251.cp-1251 AddCharset CP866.cp866 AddCharset ISO-8859-5.iso-ru AddCharset KOI8-R.koi8-r AddCharset UCS-2.ucs2 112/401 페이지
AddCharset UCS-4.ucs4 AddCharset UTF-8.utf8 <IfModule mod_negotiation.c> LanguagePriority kr en da nl et fr de el it ja no pl pt pt-br ru ltz ca es sv tw </IfModule> AddType application/x-tar.tgz AddEncoding x-compress.z AddEncoding x-gzip.gz.tgz #AddType application/x-compress.z #AddType application/x-gzip.gz.tgz AddType application/x-httpd-php.html.php3.php4.inc.phtml.php.ph.jsp.xtm AddType application/x-httpd-php-source.phps AddHandler cgi-script.cgi #AddType text/html.shtml #AddHandler server-parsed.shtml #AddHandler send-as-is asis #AddHandler imap-file map #AddHandler type-map var </IfModule> #MetaDir.web #MetaSuffix.meta # Customizable error response (Apache style) # these come in three flavors # # 1) plain text #ErrorDocument 500 "The server made a boo boo. # n.b. the single leading (") marks it as text, it does not get output # # 2) local redirects 113/401 페이지
#ErrorDocument 404 /missing.html # to redirect to local URL /missing.html #ErrorDocument 404 /cgi-bin/missing_handler.pl # N.B.: You can redirect to a script or a document using server-side-includes. # # 3) external redirects #ErrorDocument 402 http://www.example.com/subscription_info.html # N.B.: Many of the environment variables associated with the original # request will *not* be available to such a script. # # Customize behaviour based on the browser # <IfModule mod_setenvif.c> BrowserMatch "Mozilla/2" nokeepalive BrowserMatch "MSIE 4\.0b2;" nokeepalive downgrade-1.0 force-response-1.0 BrowserMatch "RealPlayer 4\.0" force-response-1.0 BrowserMatch "Java/1\.0" force-response-1.0 BrowserMatch "JDK/1\.0" force-response-1.0 BrowserMatch "Webzip" go_out BrowserMatch "WebZip" go_out BrowserMatch "Teleport" go_out BrowserMatch "GetRight" go_out BrowserMatch "Wget" go_out </IfModule> #<Location /server-status> # SetHandler server-status # Order deny,allow # Deny from all # Allow from.example.com #</Location> # Allow remote server configuration reports, with the URL of # http://servername/server-info (requires that mod_info.c be loaded). # Change the ".example.com" to match your domain to enable. # 114/401 페이지
#<Location /server-info> # SetHandler server-info # Order deny,allow # Deny from all # Allow from.example.com #</Location> # MOD_JK Config <IfModule mod_jk.c> JkWorkersFile /usr/local/tomcat/conf/workers.properies JkLogFile /usr/local/tomcat/logs/jk.log JkLogLevel info </IfModule> NameVirtualHost 211.238.41.180 <VirtualHost 211.238.41.180> ServerAdmin alang@syszone.co.kr DocumentRoot /home/syszone/www ServerName syszone.co.kr ServerAlias syszone.co.kr www.syszone.co.kr JkMount /*.jsp ajp13 JkMount /webapps/* ajp13 JkMount /ROOT/* ajp13 </VirtualHost> 5.10 Tomcat 설정 vi /usr/local/tomcat/conf/workers.properies workers.tomcat_home=/usr/local/tomcat workers.java_home=/usr/java/java worker.list=ajp12, ajp13 worker.ajp13.port=8009 worker.ajp13.host=localhost worker.ajp13.type=ajp13 115/401 페이지
5.11 Tomcat 과 Apache 연동및가상호스트설정 vi /usr/local/tomcat/conf/server.xml.. </Host> <Host name="syszone.co.kr"> <Context path="" docbase="/home/www/www" reloadable="true"/> <Alias>www.syszone.co.kr</Alias> </Host> </Engine> </Service> </Server> /usr/local/apache/bin/apachectl restart /usr/local/tomcat/bin/strtup.sh // 확인 // vi /home/syszone/www/phpinfo.php <? phpinfo ();?> vi /home/syszone/www/hello.jsp <% out.println("hello, JSP"); %> http://www.syszone.co.kr/phpinfo.php http://www.syszone.co.kr/hello.jsp http://211.238.41.180:8080 116/401 페이지
Introduction to Load Balance Clustering Using Linux ( 부하분산클러스터구성 ) 클루닉스기술부 3 차기술세미나자료 117/401 페이지
목 차 1. 시스템구축준비하기 1.1. 리눅스부한분산클러스터개론 1.2. 시스템구축환경 2. Open Source 를이용한리눅스부하분산클러스터구축 2.1. 리눅스클러스터커널환경구축 2.2. ipvsadm 설치및사용방법 2.3. LB 서버와 Real 서버의네크워크구성 2.4. Direct Routing 방식에서의 ARP 문제해결 2.5. 부하분산테스트 2.6. Mon 을이용한 Load Balance 에 Fail Over 기능추가하기 2.7. LB 서버간의이중화구축하기 ( Heartbeat ) 3. Encluster 를이용한리눅스부하분산클러스터구축 3.1. Encluster 1.6 을이용한리눅스부하분산클러스터구축 3.2. Encluster 2.0 을이용한리눅스부하분산클러스터구축 4. Data 동기화 ( Data Sync or Data Mirroring ) 4.1. rsync 를이용한 data sync 4.2. dutils 를이용한 data sync 4.3. NFS + Automount 를이용한 data sync 4.4. Intermezzo 를이용한 data sync 4.5. Pvfs 를이용한 data sync 5. Benchmark Tool 로시스템성능체크하기 118/401 페이지
5.1. 웹서버벤치마크개론 5.2. 웹서버벤치마크퉆과사용방법 5.3. 벤치마크시나리오수립및분석하기 5.4. 웹시스템튜닝하기 6. 리눅스클러스터를이용한대용량웹클러스터시스템구성하기 ( 시스템컨설팅 ) 6.1. 인터넷웹클러스터개론 6.2. 대규모인터넷사이트구축설계 1. 시스템구축준비하기 1.1. 리눅스부하분산클러스터개론 1.1.1 소개인터넷의발달과더불어생활의정보전달매체로웹이란수단을선택하기시작한지 10 년에다되어가면서매년인터넷의사용증가는 100% 를넘고있다. 뿐만아니라근래에들어인터넷초기시절의단순한정보공유매개체로서의역할에서사업상의중요한업무시스템구성의중요한요소까지차지하게되었다. 인터넷의발달과더불어하드웨어와소프트웨어그리고네트워크의발달속도역시빠른추세로증가하고있지만기하급수적으로늘어난서비스사용량을처리하기에보편적인시스템의성능과시스템환경의부족함이많이존재하고있다. 이에보다높은가용성 ( Availability ) 과확장성 ( scalable ) 을가진서버의요구가절실히높아지고있다. 이에고성능 SMP 서버를이용하는경우도있지만비경제적인가격문제와실제시스템병목원인이꼭 서버의성능에만있는것이아니기때문에고성능 SMP 서버만이진정한해결방법은아니다. 빠른네트워크의발달과함께분산된서버의자원을하나의작업에이용하는클러스링기술이발달하게 되고인터넷서비스역시클러스터링기술이부각되기시작하였다. 클러스터란여러대의컴퓨터를네트워크를통해연결하여하나의단일컴퓨터처럼작동하게하는기술을말한다. 클러스터는사용목적에따라구현방법및소프트웨어가달라지며, 클러스터의기능과운영이달라진다. 따라서클러스터는그사용목적에따라베어울프와같은과학계산용클러스터와인터넷서비스에서사용되는부하분산클러스터로나눌수있다. 이런클러스터시스템의장점으로추가확장성과높은가용성그리고비용 - 효율성을두루갖추고있어 인터넷서비스에사용되는시스템의요구조건을충족시켜줄수있다. 119/401 페이지
부하분산클러스터는이전부터 L4 Switch 란하드웨어를이용하여시스템구축을해왔지만워낙고가의시스템이여서일반사이트에서는적용이힘든방식으로알려져있었다. 하지만 Linux 의커널에서 L4 Switch 의기능과동일하고더월등한성능의 LVS(Linux virtual server) 기능을지원함에 따라일반사이트에서도손쉽게클러스터기술을이용하여고성능의서버를이용할수있게되었다. 리눅스의 LVS 커널은커널 2.0.x 때부터지원되었고, 사용된지도 7~8 년에이르고있다. 이에지속적인안정성과성능이개선되어져리눅스의수많은기능중가장선호하는기능으로손꼽고 있다. 이런리눅스부하분산클러스터도여러가지방식이있고리눅스 LVS 커널과다른리눅스응용 프로그램을조합하여고성능뿐만아니라고가용성의기능까지탑재하게된다. 본문에서는네트워크구성에따른부하분산방식과작업활당방식그리고고가용성을구현하는 방법에대해자세히알아보도록하겠다. 1.1.2 네트워크구성에따른부하분산클러스터종류부하분산클러스터를생각하면대부분 Load Balancer 을앞단에두고 backend 의 Real Server 에작업을분산하는서버측면의부하분산방식을알고있다. 하지만클라이언트에부하분산모듈을넣어서버의상황을클라이언트가서버로부터얻어내어클라이언트가직접서버로분산해서들어가는클라이언트측면의부하분산방식도있다. ( 예 : Clunix 의 LB Less, 버클리의스마트클라이언트, 보스턴대학의클라이언트 ) 서버측면의부하분산방식으로는 DNS 의호스트를이용한 Round-Robin DNS 방법과 Reverse-Proxy 와같은응용프로그램계층의부하분산그리고 L4 Switch 와같은 IP 계층의부하분산방식이있다. 리눅스가상서버역시 IP 계층의부하분산방식에속한다. 리눅스가상서버에서도네트워크구성에따라주소변환방식 (NAT) 과 IP tunneling 에의한방식 그리고 Direct Rounting dispatching 기술을이용한방식등이있다. 1.1.2.1 Network address translation 부하분산방식 ( 네트워크주소변환방식 ) IPv4 에서 IP 주소가부족하고보안상에몇가지문제가있어서인터넷에서사용할수없는사설 IP ( 10.0.0.0/255.0.0.0, 172.16.0.0/255.240.0.0, 192.168.0.0 /255.255.0.0 ) 를사용하는경우가많아지고있다. 이때인터넷망에서사설망의호스트에접근하기위해서네트워크주소변한 (NAT) 기능이필요하게된다. 이런리눅스에서의 NAT 방식의부하분산방식은초기의리눅스 IP 마스커레이딩코드와 Steven Clarke 의포트포워딩코드를재사용하여구현하고있다. 120/401 페이지
사용자가 LVS 에서가지고있는 VIP 를향해서비스요청을하면 LVS 에서는그서비스요청된 IP 와 Port 가가상서버정책에있는지를확인하고있다면이정책에정해진스케줄에따라실제작업서버로패킷을포워딩시키게된다. 이때 LVS 서버는사용자가요청한패킷의네트워크주소부분을공인 IP 에서사설 IP 로주소를변환시켜같은사설망에존재하는작업서버로보내게된다. 작업서버는 LVS 서버로부터패킷을전달받고이에대한요청처리된내용을다시 LVS 에보내게된다. 그럼 LVS 가사설 IP 로된패킷을다시받아다시공인 IP 로주소를변환시켜서사용자에게돌려보내는방식이다. 1.1.2.2 Direct Routing 부하분산방식 실제서버와부하분산서버사이에서가상 IP 를공유하는방식으로부하분산서버와실제작업서버에모두동일한가상 IP 를가지도록네트워크구성해야한다. 가상 IP 가설정된인터페이스를통해사용자의요청을받아들여이요청이가상서버정책에적용되는요청인지를확인후적용되는패킷이면정책에따라실제작업서버로패킷을포워딩하게된다. 이때실제서버역시별도의 Arp 캐싱을남기지않는 Alias 인터페이스를통해부하분산서버로부터포워딩되는패킷을받아들이게된다. 만일가상 IP 가설정된인터페이스에 arp caching 이남는다고하면사용자가부하분산서버를통해초기에연결된실제작업와연결되면그이후부터는초기접속한작업서버와만통신이이루어지게된다. 그렇기때문에반드시커널차원에서의 arp hidden patch 를시켜줘야한다. 121/401 페이지
DR 방식은패킷의데이터프레임부분의 MAC 주소만을변경하여패킷을포워딩하기때문에물리적인 세크먼트 ( 같은 subnet ) 안에서만동작이가능하다. DR 방식의 arp 문제해결방법에대해서는실제 DR 구축문서를참조하길바란다. 1.1.2.3 IP Tunneling 에의한부하분산방식 IP 터너링은 IP 화된정보 (IP datagram) 안에 IP 화된정보를감싸넣는 (encapsulate) 기술이다. 리눅스 커널에서지원하고이를이용하여보다 WAN 을대상으로작업서버노드를구성할수있게된다. 실제가상 IP 주소로향하는요구패키이부하분산서버로전달되면부하분산서버에서패킷의목적지주소와포트를검사하여가상서버정책과일치하면스케줄링에따라실제작업서버로전달하게된다. 이때패킷을일반적인스트링방식으로전달하는것이아닌캣슐형식으로싸서전달하게된다. 이리전달되면작업서버에서는감싸진패킷을다시풀고요청을처리한다음실제서버의라우팅테이블에따라사용자에게직접결과를돌려주는방식이다. IP 터너링방식은 DR 방식의물리적인세그먼트의영향을받지않고어디든지작업을분산할수있는 장점이있다. 그래서거의무한한확장성을가지게된다. 하지만모든서버가 IP 터널링전송규약을 지원해야하기에지원하지못하는 OS 에서는문제가발생하게된다.. 1.1.3 작업활당방식 ( Scheduling Algorithms ) 클러스터로부터서버를선택하기위한네개의작업할당방식들 (scheduling algorithms) 이준비되어있다 : Round-Robin, 가중치가있는 (weighted) Round-Robin, 최소 - 접속 (Least-Connection) 그리고가중치가있는 최소 - 접속의방식들이다. 처음의두방식들은서버에대한어떠한부하정보 (load information) 도가지고 122/401 페이지
있지않기때문에자명 (self-explanatory) 하다. 뒤의두방식들은각서버에대한활동접속수 (active connection number) 를세어이러한접속수에의해그들의부하를추정한다. 1.1.3.1 Round-Robin Scheduling ( 라운드로빈스케쥴링 ) 말그대로라운드-로빈방식을이용해네트웍연결을서로다른서버에연결하는것을말한다. 이경우실제서버의연결갯수나반응시간등은고려를하지않는다. 그렇지만약간의차이가있다. 라운드로빈 DNS 는단일한도메인을서로다른 IP 로해석을하지만, 스케쥴링의기초는호스트기반이며캐싱때문에알고리즘을효율적으로사용하기힘들다. 그래서실제서버사이에동적인부하불균형이심각해질수있다. 가상서버의스케쥴링기초는네트웍기반이며라운드로빈 DNS 에비해훨씬더훌륭하다. 1.1.3.2 Weighted Round-Robin Scheduling ( 가중치기반라운드로빈스케쥴링 ) 가중치기반라운드로빈스케쥴링은실제서버에서로다른처리용량을지정할수있다. 각서버에가중치를부여할수있으며, 여기서지정한정수값을통해처리용량을정한다. 기본가중치는 1 이다. 예를들어실제서버가 A,B,C 이고각각의가중치가 4,3,2 일경우스케쥴링순서는 ABCABCABA 가된다. 가중치가있는라운드로빈스케쥴링을사용하면실제서버에서네트웍접속을셀필요가없고동적스케쥴링알고리즘보다스케쥴링의과부하가적으므로더많은실제서버를운영할수있다. 그러나요청에대한부하가매우많을경우실제서버사이에동적인부하불균형상태가생길수있다. 라운드로빈스케쥴링은가중치기반라운드로빈스케쥴링의특별한한종류이며모든가중치가동일한경우이다. 가상서버의규칙을변경하고나서스케쥴링순서를생성하는데는거의과부하가걸리지않으며실제스케쥴링에어떠한과부하도추가하지않는다. 그러므로라운드로빈스케쥴링만단독으로실행하는것은불필요한일이다. 123/401 페이지
1.1.3.3 Least-Connection Scheduling ( 최소접속스케쥴링 ) 최소접속스케쥴링은가장접속이적은서버로요청을직접연결하는방식을말한다. 각서버에서동적으로실제접속한숫자를세어야하므로동적인스케쥴링알고리즘중의하나이다. 비슷한성능의서버로구성된가상서버는아주큰요구가한서버로만집중되지않기때문에, 접속부하가매우큰경우에도아주효과적으로분산을한다. 가장빠른서버에서더많은네트웍접속을처리할수있다. 그러므로다양한처리용랑을지닌서버로구성했을경우에도훌륭하게작동한다는것을한눈에알수있을것이다. 그렇지만실제로는 TCP 의 TIME_WAIT 상태때문에아주좋은성능을낼수는없다. TCP 의 TIME_WAIT 는보통 2 분이다. 그런데접속자가아주많은웹사이트는 2 분동안에몇천개의접속을처리해야할경우가있다. 서버 A 는서버 B 보다처리용량이두배일경우서버 A 는수천개의요청을처리하고 TCP 의 TIME_WAIT 상황에직면하게된다. 그렇지만서버 B 는몇천개의요청이처리되기만을기다리게된다. 그래서최소접속스케쥴링을이용할경우다양한처리용량을지난서버로구성되었을경우부하분산이효율적으로되지못할수있는것이다. 1.1.3.4 Weighted Least-Connection Scheduling ( 가중치기반최소접속스케쥴링 ) 가중치기반최소접속스케쥴링은최소접속스케쥴링의한부분으로서각각의실제서버에성능가중치를부여할수있다. 언제라도가중치가높은서버에서더많은요청을받을수있다. 가상서버의관리자는각각의실제서버에가중치를부여할수있다. 가중치의비율인실제접속자수에따라네트웍접속이할당된다. 기본가중치는 1 이다. 가중치가있는최소접속스케쥴링은다음과같이작동한다 : n 개의실제서버가있는경우각서버 i 는가중치 Wi (i = 1,..., n) 를가진다고가정하자. 서버 i 의활동접속 (active connection) 은 Ci (i = 1,..., n) 이고모든 _ 접속은 Ci (i = 1,..., n) 의합이다. 서버 j 로가는넷트웍접속은아래와같다. (Cj/ALL_CONNECTIONS)/Wj = min { (Ci/ALL_CONNECTIONS)/Wi } (i=1,..,n) 124/401 페이지
이비교에서 ALL_CONNECTIONS 는상수이므로 Ci 를모든 _ 접속으로나눠줄필요가없다. 그러면다음과 갈이최적화될것이다. Cj/Wj = min { Ci/Wi } (i=1,..,n) 가중치가있는최소접속스케쥴링알고리즘은최소접속스케쥴링알고리즘에비해부가적인배분작업이 필요하다. 서버들이같은처리용량을가졌을때는작업할당의간접비용을최소화하기위해최소접속 스케쥴링과가중치가있는최소접속스케쥴링알고리즘둘다사용할수있다. 1.1.4 고가용성 ( High Availability ) 중요한상업적응용분야가인터넷으로점점더많이옮아옴에따라가용성이높은서버들을제공하는것이점점더중요해지고있다. 클러스터화된시스템의장점중하나는하드웨어와소프트웨어의여유분이있다는것이다. 높은가용성은노드 (node) 나데몬 (deamon) 의장애들 (failures) 이나시스템의재구성 (reconfiguring) 을적절히감지해클러스터에남아있는노드로작업부하 (workload) 를이전하는것으로이룰수있다. 가상서버의높은가용성을현재 "mon" 과 "fake" 소프트웨어를사용해제공한다. "mon" 은넷트웍서비스가용성과서버노드를모니터할수있는범용자원모니터링시스템 (generalpurpose resource monitoring system) 이다. "fake" 는 ARP 속이기 (spoofing) 를사용해 IP 를이전하는소프트웨어다. 서버의장애극복 (failover) 은다음과같이제어한다 : 부하분산기 (load balancer) 에클러스터의서비스데몬들과서버노드들을모니터하기위한 "mon" 데몬이운영된다. 매 t 초마다서버노드들이살아있는지감지하도록 fping.monitor 를구성하고매 m 분마다모든노드의서비스데몬들을감지하기위해연관된모니터프로그램역시구성한다. 예를들어 http 서비스를점검하기위해 http.monitor 를, ftp 서비스를위해 ftp.monitor 를또, 기타다른모니터프로그램을사용할수있다. 서버노드나데몬이새로사용불능상태 (down) 가되거나사용가능상태 (up) 가되면가상서버테이블에규칙을제거하거나 125/401 페이지