리눅스 APM서버설치및기초보안설정 (ver.1.0_beta) 작성날짜 : 2008.03.30 작성자 : 영남대학교 @Xpert 허환석이메일 : eits1st@nate.com 목 차 1. 들어가며 2. Fedora 4 설치이후일반적인초기설정및점검사항 2-1. 사용하지않는서비스중지 2-2. 네트워크설정 3. 커널업데이트 4. APM 서버설치및기본세팅 4-1. APM 서버설치를위한준비 4-2. 라이브러리설치 4-3. 어플리케이션설치 4-4. APM 기본설정 5. 6. 웹서버보안설정 5-1. /usr/local/apache/conf/httpd.conf 5-2. /usr/local/zend/etc/php.ini 참고문헌
1. 들어가며 영남대학교정보보호연구학회 @Xpert - 이문서는리눅스를이용하여처음서버를구축해보는사람을대상으로쓰여졌으며기 본적으로영남대학교정보보호연구학회 @Xpert의멤버교육용으로작성되었다. 이문서에서는리눅스중에서 Fedora 4 를이용하여서버구축및활용에대하여설명한다. Fedora 4 의설치과정에대해서는설명하지않으며, Fedora 4에대해필요한최소한의구성요소만설치한후라고가정하고문서를진행하도록한다. 2. Fedora 4 설치이후일반적인초기설정및점검사항 2-1. 초기점검사항 - 리눅스서버를설치하면기본적으로설정되어야하는기본보안설정이있다. 이는서버관리자가서버설치후가장먼저해야할일중하나이며이것은적은노력에비해서버보안의절반이상을차지하기도한다. 1) 사용하지않는서비스중지 - 아무리최소한의설치를하더라도처음서버가동에있어서불필요한서비스혹은데몬이실행되기마련이다. 이것은 Fedora 버전에따라다르며버전이높은것일수록많이실행이되어있다. 이러한사용하지않는서비스는중지하는것이좋다. 왜냐하면이러한서비스로인하여서버의보안을위협하는요소가될수있으며또한서버시스템의자원을차지하기때문에정작필요한서비스에대해서자원할당이어려워질수도있기때문이다. 먼저 setup 을실행하여 "System services 를선택후서버가동후자동으로시작되기원하는서비스를선택하거나혹은원하지않는서비스에대해서는선택을해제하면된다. [root@localhost]setup #################################################################### ############ 혹시 setup 을실행하여영어가깨져서화면에출력될경우 ########### [root@localhost]vi.bashrc ( 생략) LANG=C // 맨마지막에추가 #### 이와같이 LANG=C를마지막줄에추가하여 source.bashrc 를입력하면된다 #### ####################################################################
2) /etc/rc.d/init.d/ 와 /etc/xinetd.d/ - 설치후 /etcrc.d/init.d/ 와 /etc/xinetd.d/ 디렉토리에서서비스에불필요한서비스스크립트파일을삭제하는것이좋다. 특히 /etcrc.d/init.d/ 이디렉토리는시스템이부팅되면서자동으로실행되는스크립트파일들이있으며그중취약점이존재하는스크립트를이용하여공격자의공격을당할수도있기때문이다. 3) ssh의 root의원격접속금지 - 원격지에서서버로쉘접속을할때암호화통신을하는 ssh 를많이사용한다. 하지만꼭필요한경우외에는 root 의접속을막아두는것이좋다. root의권한이필요한경우일반사용자로접속하여 su 명령어를이용하여 root 의권한을획득하여사용하면된다. /etc/ssh/sshd_config 내에 PermitRootLoing no 로설정한다. 4) 파일퍼미션재조정 - 서버관리에있어서시스템에중요한파일들은반드시퍼미션과속성을재설정해주어야한다. 이는공격자가침입후파일변조를막는가장기초적인방법이며가장강력한방법이기도하다. 5) SetUID, SetGID 파일재설정 - 특정파일에 SetUID가설정이되어있다면이파일이실행되는동안 root의권한사용이가능하다. 공격자는이러한파일들의버퍼오버플로우취약점을이용하여 root권한을획득하기도한다. find 명령어를사용하여 SetUID 파일을검색하여그가운데불필요한파일에게서 SetUID 설정을제거하도록한다. [root@localhost ~]# find / -user root -perm -4000 -print /usr/sbin/userhelper /bin/traceroute /bin/ping [root@localhost ~]# 출력되는파일중 ping명령어에 SetUID 가설정된걸알수가있다. ping이란명령은굳이 SetUID 가설정될이유가없다. ping 파일에대해서 SetUID 퍼미션을제거하여 ping 명령어에대한기본퍼미션 4755를 755 로변경하였다. [root@localhost ~]# ls -al /bin/ping -rwsr-xr-x 1 root root 35616 Apr 7 2005 /bin/ping [root@localhost ~]# chmod 755 /bin/ping [root@localhost ~]# ls -al /bin/ping -rwxr-xr-x 1 root root 35616 Apr 7 2005 /bin/ping
6) 서버시간설정 - 서버는항상정확한 Time Server 에서시간을맞춰어져있어야한다. 그렇지않으면로그파일이나시스템기록상에시간이엉키게될수가있으며후에포렌식을행해야할때나서버점검을할때정확한분석이불가능하게될수있기때문이다. rdate -s time.bora.net 을 /etc/rc.d/rc.local 파일에등록해두면서버가부팅이될때마다시간을맞추게된다. 2-2. 네트워크설정 - Fedora 4 를필요구성요소에맞게설치한후에서버설치및커널업데이트, 보안설정등을하기위해먼저네트워크가정상작동되어야한다. DHCP를이용한네트워크설정이되어있지않다면수동으로네트워크를설정을해주어야한다. 다음과같은명령으로이더넷인터페이스에대한설정을할수있다. [root@localhost]vi /etc/sysconfig/network-scripts/ifcfg-eth0 ifcfg-eth0 의파일형식은다음과같다. DEVICE 이더넷인터페이스종류 (eth0) BOOTPROTO IP 할당방식, static ( 고정)/dhcp ( 동적)/bootp/none BROADCAST 할당 IP 주소가속하는브로드캐스트주소설정 IPADDR 할당 IP 주소 NETMASK 할당 IP 주소가속하는넷마스크값 NETWORK할당 IP 주소가속하는네트워크주소 ONBOOT 부팅시자동활성여부 yes/no PEERDNS DHCP 서버의 DNS 정보를 /etc/resolv.conf 저장여부 HWADDR 이더넷카드의하드웨어주소 (ifconfig 명령으로확인) 파일형식에맞게다음과같이추가하여네트워크를설정해주면된다. BOOTPROTO static IPADDR 210.98.xxx.xxx NETMASK 255.255.255.0 NETWORK 210.98.xxx.0 BROADCAST 21.98.xxx.xxx ONBOOT yes 그다음게이트웨이를설정한다. 게이트웨이를설정하는파일은 /etc/sysconfig/network 이며호스트네임또한설정할수있다. [root@localhost]vi /etc/sysconfig/network GATEWAY=210.98.xxx.1 // 추가한다.
이젠사용할 DNS 서버의주소를설정해야한다. 자체적으로네임서버를운영할경우에는루프백주소(127.0.0.1) 을설정하여사용해도되지만그것이아니라면해당 DNS 서버의주소를입력해야한다. resolv.conf 파일의내용을모두지우고 DNS 서버의주소를적어주면된다. 기본적으로설정이안된 resolv.conf의파일에는 search domain 만적혀있다. [root@localhost]vi /etc/resolv.conf nameserver 164.124.101.x nameserver 211.171.203.x 네트워크에대한설정이끝났으면다음과같은명령으로 [root@localhost]service network restart 네트워크설정을시스템에바로적용시킬수있다. 물론지금까지설명한것을다음명령어로쉽고간단하게추가하여적용할수있으나어차피위에언급한파일들에대하여적용이되는것이기에위에상황과동일하다. [root@localhost]system-config-network 3. 커널업데이트 리눅스커널업데이트는리눅스를서버로사용하는것에있어서서버의시스템성능향상과안정성, 효율성을높이기위한가장우선시되는준비운동이라고할수가있으며또한서버보안과직접적으로연결되어있기도한다. 서버관리자는안정적이며효율적, 그리고보안성이뛰어난서버를운영해야할책임이있으므로이에맞게커널은업데이트하여야한다. 커널의버전을확인하면다음과같다. [root@localhost] uname -r 2.6.11-1.1369_FC4 구버전의커널이다. 일단우리는 2.6.11.9에서 2.6.24.3 로업데이트를하기로해보자. 커널업데이트를하기전에우선서버의시간을동기화시켜놓는다. [root@localhost] rdate -s time.bora.net
커널의최신버전은다음과같이확인할수있다. [root@localhost ~]# finger @ftp.kernel.org The latest stable version of the Linux kernel is: 2.6.24.3 The latest prepatch for the stable Linux kernel tree is: 2.6.25-rc6 The latest snapshot for the stable Linux kernel tree is: 2.6.25-rc6-git1 The latest 2.4 version of the Linux kernel is: 2.4.36.2 The latest 2.2 version of the Linux kernel is: 2.2.26 The latest prepatch for the 2.2 Linux kernel tree is: 2.2.27-rc2 The latest -mm patch to the stable Linux kernels is: 2.6.25-rc5-mm1 [root@localhost ~]# 컴파일할커널을다운받는다. 약 50 메가정도된다. [root@localhost] wget ftp://ftp.kernel.org/pub/linux/kernel/v2.6/linux-2.6.24.3.tar.gz -P /usr/src 이제커널업데이트를시작해야한다. 우선 /usr/src에서압축을푼커널파일디렉토리로 들어간다. [root@localhost] make mrproper <-커널설정초기화 [root@localhost] make menuconfig <-- 콘솔모드일경우사용( 커널환경설정) 명령어 make mrproper 는커널설정초기화를하는것이며, make menuconfig 는커널환 경설정을하는명령어이다. Configuration 창모드에서설정할수있으며 x윈도우에서는 menuconfig가아닌 make xconfig 를해줘야한다. 설정을마친후후다음과같이입력한 다. [root@localhost] make dep [root@localhost] make clean <- 이전커널정보를삭제한다. 입력후마지막으로다음과같이입력한다. [root@localhost] make && make bzimage && make modules && make modules_install && make
install 순서는틀리면안되며특히 make modules 이후 make install 을해야한다. 아니면특정 디렉토리가 생성되지 않는다며 설치가 중단된다. 여기서 make 명령어는 커널 이미지 (bzimage) 를생성하며, 커널모듈을컴파일한다. make install은새로운커널이 grup 또는 lilo 에자동으로등록되게하기도한다. 시간이조금걸린후컴파일이완전히실행되면다음과같이 [root@localhost ~]# cat /boot/grub/grub.conf # grub.conf generated by anaconda # # Note that you do not have to rerun grub after making changes to this file # NOTICE: You do not have a /boot partition. This means that # all kernel and initrd paths are relative to /, eg. # root (hd0,0) # kernel /boot/vmlinuz-version ro root=/dev/hda1 # initrd /boot/initrd-version.img #boot=/dev/hda default=1 timeout=5 splashimage=(hd0,0)/boot/grub/splash.xpm.gz hiddenmenu title Fedora Core (2.6.24.3) root (hd0,0) kernel /boot/vmlinuz-2.6.24.3 ro root=label=/1 initrd /boot/initrd-2.6.24.3.img title Fedora Core (2.6.11-1.1369_FC4) root (hd0,0) kernel /boot/vmlinuz-2.6.11-1.1369_fc4 ro root=label=/1 initrd /boot/initrd-2.6.11-1.1369_fc4.img [root@localhost ~]# 커널이잘등록되었는지확인할수있으며부팅할커널에대해디폴트부팅으로세팅해주면된다. (default=0) 만약에커널컴파일이잘된거같지만 grup이나 lilo에안올라와있다면부트이미지를강제로심어줘도된다. [root@localhost] cp arch/i386/boot/bzimage /boot/vmlinuz-2.6.24.3 [root@localhost] cp System.map /boot/system.map-2.6.24.3
[root@localhost bin]# vi /boot/grub/grub.conf # grub.conf generated by anaconda # # Note that you do not have to rerun grub after making changes to this file # NOTICE: You do not have a /boot partition. This means that # all kernel and initrd paths are relative to /, eg. # root (hd0,0) # kernel /boot/vmlinuz-version ro root=/dev/hda1 # initrd /boot/initrd-version.img #boot=/dev/hda default=0 timeout=5 splashimage=(hd0,0)/boot/grub/splash.xpm.gz hiddenmenu title Fedora Core (2.6.11-1.1369_FC4) root (hd0,0) kernel /boot/vmlinuz-2.6.11-1.1369_fc4 ro root=label=/ initrd /boot/initrd-2.6.11-1.1369_fc4.img ###################################### ## 여기에강제로적어준다. ###################################### title Fedora Core (2.6.24.3) root (hd0,0) kernel /boot/vmlinuz-2.6.24.3 ro root=label=/ initrd /boot/initrd-2.6.24.3.img 이제 reboot 명령으로재부팅하여업데이트된커널의버전을확인하면된다. [root@localhost ~]# uname -a Linux localhost.localdomain 2.6.24.3 #1 Tue Mar 18 13:18:11 KST 2008 i686 i686 i386 GNU/Linux 커널업데이트가잘되었다 :)
4. APM 서버설치및기본세팅 4-1. 서버설치를위한준비 리눅스의웹서버중가장많이선호하고사용하고있는포맷은 APM(Apache + php + MySQL) 이될것이다. 지금부터 APM 을설치하기위한준비를해보자. 1) 웹서비스에필요한라이브러리 라이브러리설명 zlib libpng freetype jpeg 가장보편적으로사용하는데이터압축라이브러리 png 포맷의이미지파일을사용하기위한포터블네트워크그래픽라이브러리. 텍스트의이미지출력등을하기위한공개포트엔진 JPEG 압축/ 압축해제라이브러리소프트웨어 gd 동적이미지생성 ANSI C라이브러리 libxml2 XML C 파서 2) 웹서버서비스에필요한어플리케이션 어플리케이션설명 Mysql APACHE PHP ZendOptimizer 데이터베이스 DBMS 아파치어플리케이션 PHP 인터프린터언어 PHP 소스코드를최적화하여속도를향상시켜주는 Optimizer 3) 설치를위한파일다운로드각홈페이지에들어가서받아도무방하며구글에서파일이름으로검색하면쉽게다운받을수있다. 파일은 /usr/local/src 에받도록한다. total 9620 drwxr-xr-x 2 root root 4096 Mar 24 02:01. drwxr-xr-x 11 root root 4096 Mar 18 01:22.. -rw-r--r-- 1 root root 1775673 Jul 3 2007 freetype-2.3.5.tar.gz -rw-r--r-- 1 root root 1345700 Jun 22 2007 gd-2.0.35.tar.gz -rw-r--r-- 1 root root 6365535 Jan 7 2007 httpd-2.2.4.tar.gz -rw-r--r-- 1 root root 613261 Jun 29 2001 jpegsrc.v6b.tar.gz -rw-r--r-- 1 root root 826257 Feb 19 07:37 libpng-1.2.25.tar.gz -rw-r--r-- 1 root root 4734599 Mar 24 02:01 libxml2-2.6.31.tar.gz
-rw-r--r-- 1 root root 24388270 Jun 22 2007 mysql-5.0.44.tar.gz -rw-r--r-- 1 root root 496597 Jul 18 2005 zlib-1.2.3.tar.gz [root@localhost src]# 4-2. 라이브러리설치 1) zlib : 홈페이지 http://www.zlib.org/ zlib은 gzip 등으로압축된압축파일을읽고쓰기위해꼭필요한라이브러리이다. 압축을풀고다음과같이설치한다. [root@localhost src]# tar zxvf./zlib-1.2.3.tar.gz [root@localhost src]# cd./zlib-1.2.3 [root@localhost zlib-1.2.3]#./configure Checking for gcc Building static library libz.a version 1.2.3 with gcc. Checking for unistd.h Yes. Checking whether to use vs[n]printf() or s[n]printf() using vs[n]printf() Checking for vsnprintf() in stdio.h Yes. Checking for return value of vsnprintf() Yes. Checking for errno.h Yes. Checking for mmap support Yes. [root@localhost zlib-1.2.3]# make && make install cp zlib.3 /usr/local/share/man/man3 chmod 644 /usr/local/share/man/man3/zlib.3 [root@localhost zlib-1.2.3]# 2) libpng : 홈페이지 http://www.libpng.org/ 첫번째단계에서설치한 zlib가생성한이미지파일을 png 포맷으로변형하여사용하기위한라이브러리이다. 그러므로 libpng를설치하기위해서는반드시 zlib가설치되어있어야한다. 압축을풀고다음과같이설치한다. [root@localhost src]# tar zxvf./libpng-1.2.25.tar.gz [root@localhost src]# cd./libpng-1.2.25 [root@localhost libpng-1.2.25]#./configure [root@localhost libpng-1.2.25]# make && make install
make[2]: Leaving directory `/usr/local/src/libpng-1.2.25' make[1]: Leaving directory `/usr/local/src/libpng-1.2.25' [root@localhost libpng-1.2.25]# 3) freetype : 홈페이지 http://www.freetype.org/ freetype 은폰트엔진라이브러리로서작고, 효율적이며, 이미지출력시커스트마이징을돕 는다. 압축을풀고다음과같이설치한다. [root@localhost src]# tar zxvf freetype-2.3.5.tar.gz [root@localhost src]# cd freetype-2.3.5 [root@localhost freetype-2.3.5]#./configure make: Nothing to be done for `unix'. [root@localhost freetype-2.3.5]# make (cd /usr/local/src/freetype-2.3.5/objs/.libs && rm -f libfreetype.la && ln -s../libfreetype.la libfreetype.la) [root@localhost freetype-2.3.5]# make install /usr/bin/install -c -m 644./builds/unix/freetype2.pc /usr/local/lib/pkgconfig/freetype2.pc [root@localhost freetype-2.3.5]# 4) jpeg JPEG 압축/ 압축해제라이브러리소프트웨어로서 jpeg 해필요하다. 압축을풀고다음과같이설치한다. 이미지파일을사용하고처리하기위 [root@localhost src]# tar zxvf jpegsrc.v6b.tar.gz [root@localhost src]# cd jpeg-6b [root@localhost jpeg-6b]#./configure --enable-shared --enable-static creating jconfig.h [root@localhost jpeg-6b]# make gcc -o wrjpgcom wrjpgcom.o [root@localhost jpeg-6b]# mkdir /usr/local/man/ [root@localhost jpeg-6b]# mkdir /usr/local/man/man1 [root@localhost jpeg-6b]# make install
/usr/bin/install -c -m 644./wrjpgcom.1 /usr/local/man/man1/wrjpgcom.1 5) gd : 홈페이지 http://www.boutell.com/gd/ 동적이미지생성 ANCI C라이브러리로서 PNG, JPEG, GIF의포맷으로된이미지들을생성할수있다. 따라서 zlib, libpng, freetype, jpeg 라이브러리가필수적으로설치되어있어야한다. 압축을풀고다음과같이설치한다. [root@localhost src]# tar zxvf gd-2.0.35.tar.gz [root@localhost gd-2.0.35]#./configure ** Configuration summary for gd 2.0.34: Support for PNG library: yes Support for JPEG library: yes Support for Freetype 2.x library: yes Support for Fontconfig library: no Support for Xpm library: no Support for pthreads: yes configure: creating./config.status config.status: creating Makefile config.status: creating config/makefile config.status: creating config/gdlib-config config.status: creating test/makefile config.status: creating config.h config.status: executing depfiles commands [root@localhost gd-2.0.35]# make cd. && /bin/sh /usr/local/src/gd-2.0.35/config/missing --run aclocal-1.9 -I config aclocal:configure.ac:64: warning: macro `AM_ICONV' not found in library cd. && /bin/sh /usr/local/src/gd-2.0.35/config/missing --run automake-1.9 --foreign cd. && /bin/sh /usr/local/src/gd-2.0.35/config/missing --run autoconf configure.ac:64: error: possibly undefined macro: AM_ICONV If this token and others are legitimate, please use m4_pattern_allow. See the Autoconf documentation. make: *** [configure] Error 1 [root@localhost gd-2.0.35]# make
make[2]: Leaving directory `/usr/local/src/gd-2.0.35' make[1]: Leaving directory `/usr/local/src/gd-2.0.35' [root@localhost gd-2.0.35]# make install make[2]: Leaving directory `/usr/local/src/gd-2.0.35' make[1]: Leaving directory `/usr/local/src/gd-2.0.35' make 하는중 AM_ICONV를정의할수없다고에러가뜨지만 make를한번더해주면잘넘어간다. 6) libxml2 : 홈페이지 http://xmlsoft.org/ libxml2는 XML C 파서로서웹페이지에서 xml 라이브러리를지원한다. 압축을풀고다음과같이설치한다. [root@localhost src]# tar zxvf libxml2-2.6.31.tar.gz [root@localhost src]# cd libxml2-2.6.31 [root@localhost libxml2-2.6.31]#./configure Done configuring [root@localhost libxml2-2.6.31]# make make[1]: Leaving directory `/usr/local/src/libxml2-2.6.31' [root@localhost libxml2-2.6.31]# make install make[1]: Leaving directory `/usr/local/src/libxml2-2.6.31/python' 4-3) 어플리케이션설치 1) MySQL-5.0.44 압축을풀고다음과같이설치한다. [root@localhost src]# wget http://mirror.oss.or.kr/pub/mysql/downloads/mysql-5.0/mysql-5.0.44.tar.gz [root@localhost src]# tar zxvf mysql-5.0.44.tar.gz [root@localhost src]# cd mysql-5.0.44 [root@localhost mysql-5.0.44]# CFLAGS="-static -O2 -march=i686 -funroll-loops" [root@localhost mysql-5.0.44]# CXXFLAGS="-static -O2 -march=i686
-funroll-loops -felide-constructors -fno-exceptions -fno-rtti" [root@localhost mysql-5.0.44]#./configure --prefix=/usr/local/mysql --localstatedir=/usr/local/mysql/data --disable-shared --enable-assembler --with-thread-safe-client --with-client-ldflags=-all-static --with-mysqld-ldflags=-all-static --with-readline --without-debug --without-docs --without-bench --with-charset=euckr Thank you for choosing MySQL! [root@localhost mysql-5.0.44]# make make[1]: Leaving directory `/usr/local/src/mysql-5.0.44' ####### 약간걸림 [root@localhost mysql-5.0.44]# make install make[1]: Leaving directory `/usr/local/src/mysql-5.0.44' 2) httpd-2.2.4.tar.gz 압축을풀고다음과같이설치한다. [root@localhost src]# tar zxvf httpd-2.2.4.tar.gz [root@localhost httpd-2.2.4]#./configure --prefix=/usr/local/apache --enable-mods-shared=most --enable-modules=so --enable-so --enable-rewrite config.status: executing default commands [root@localhost httpd-2.2.4]# make make[1]: Leaving directory `/usr/local/src/httpd-2.2.4' [root@localhost httpd-2.2.4]# make install make[1]: Leaving directory `/usr/local/src/httpd-2.2.4' 3) php-5.2.3.tar.gz 압축을풀고다음과같이설치한다. [root@localhost src]# tar zxvf php-5.2.3.tar.gz [root@localhost src]# cd php-5.2.3 [root@localhost php-5.2.3]#./configure --prefix=/usr/local/php --with-mysql=/usr/local/mysql --with-apxs2=/usr/local/apache/bin/apxs
--with-config-file-path=/usr/local/apache/conf --with-zlib --with-gd --with-png --with-xml --with-jpeg-dir --with-freetype-dir --with-ssl.. [root@localhost php-5.2.3]# make Thank you for using PHP. [root@localhost php-5.2.3]# make install Wrote PEAR system config file at: /usr/local/php/etc/pear.conf You may want to add: /usr/local/php/lib/php to your php.ini include_path Installing PDO headers: /usr/local/php/include/php/ext/pdo/ 컴파일이다된후에 php 설정파일인 php.ini를생성해야하므로압축파일을해제한디렉토리에있는 php.ini-dist 파일을 php.ini 설정파일로복사하여준다. [root@localhost php-5.2.3]# cp php.ini-dist /usr/local/php/lib/php.ini [root@localhost php-5.2.3]# ls /usr/local/php/lib/ php php.ini [root@localhost php-5.2.3]# 4) ZendOptimizer ZendOptimizer는 PHP 소스코드를최적화하여실행한다. 웹서비스하는데있어서서비스의질( 속도) 을향상시킬수있다. 압축을풀고다음과같이설치한다. [root@localhost src]# wget http://mirror.trouble-free.net/sources/zendoptimizer-3.2.8-linux-glibc21-i386.tar.gz [root@localhost src]# cd ZendOptimizer-3.2.8-linux-glibc21-i386 [root@localhost ZendOptimizer-3.2.8-linux-glibc21-i386]#./install.sh./install.sh을실행하면설치화면이뜨는데라이센스와여러안내문을거치다보면 php.ini 의생성한위치를물어본다. 지체없이좀전에생성한위치 /usr/local/php/lib 를알려준다. 맨마지막에다음과같은화면이나오며 ZendOptimizer 의설치가마무리된다. x x The following configuration changes have been made: x - The php.ini file has been relocated from /usr/local/php/lib to /usr/local/zend/etc x
x - A symbolic link for the php.ini file has been created in /usr/local/php/lib. x x - The original php.ini was backed up to x /usr/local/php/lib/php.ini-zend_optimizer.bak x 해석하자면 /usr/local/lib/php.ini 파일의 /usr/local/zend/etc/ 로옮겼다.php.ini 파일을 /usr/local/php/lib 에심볼릭링크로걸어두었다. 쯤이되겠다. 이제모든설치는끝났다. 하지만아직끝난게아니다. 다음은웹서버를구동하고사용하는데앞서기본적인설정을해야한다. 4-4. APM 기본설정 1) Mysql 우선 Mysql의기본 DB 를생성해주고, mysql 을운영할사용자를생성하여야한다. [root@localhost /]# cd /usr/local/mysql/bin [root@localhost bin]#./mysql_install_db Installing MySQL system tables OK Support MySQL by buying support/licenses at http://shop.mysql.com [root@localhost bin]# [root@localhost bin]# useradd -M -s /bin/false mysql [root@localhost data]# cd.. [root@localhost mysql]# ls bin data include lib libexec man mysql-test share [root@localhost mysql]# chown -R mysql:mysql /usr/local/mysql/data -M 옵션을사용해서계정에대한홈디렉토리를생성하지않고, -s /bin/false 옵션을사 용해서유저의로그인쉘을사용할수없게한다. 즉 mysql이라는유저는 mysql 데몬을실 행하기위한유저일뿐이며서버의보안강화측면에서외부에서 mysql 유저로쉘로그인 은할필요가없다.
이제 mysql 을실행하여정상여부를확인해보자. [root@localhost bin]#./mysqld_safe & [1] 16011 [root@localhost bin]# Starting mysqld daemon with databases from /usr/local/mysql/data [root@localhost bin]# ps axf grep mysql 16011 pts/0 S 0:00 _ /bin/sh./mysqld_safe 16028 pts/0 Sl 0:00 _ /usr/local/mysql/libexec/mysqld --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --user=mysql --pid-file=/usr/local/mysql/data/localhost.localdomain.pid --skip-external-locking 16097 pts/0 S+ 0:00 _ grep mysql [root@localhost bin]# 정상적으로실행이됨을알수있다. 이제 mysql에들어가서 root의권한을 mysql로바꿔 주어야한다. [root@localhost bin]#./mysql <- 현재는그냥로그인이된다. Welcome to the MySQL monitor. Commands end with ; or g. Your MySQL connection id is 1 Server version: 5.0.44 Source distribution Type 'help;' or ' h' for help. Type ' c' to clear the buffer. mysql> show databases; +--------------------+ Database +--------------------+ information_schema mysql test +--------------------+ 3 rows in set (0.00 sec) mysql> use mysql Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Database changed mysql> show tables;
+---------------------------+ Tables_in_mysql +---------------------------+ user +---------------------------+ 17 rows in set (0.00 sec) mysql> select * from user; 생략 select * from user SQL 구문을이용하여 USER 테이블의 User 칼럼이모두 root로되어 있다는것을확인할수있다. 이제 Mysql에 root 접속이아닌좀전에생성한 mysql 계정 만으로접속을하게해야할것이다. 이는보안상중요한역할을한다. 그럼 root 를 mysql 로바꾸어보자. mysql> update user set User='mysql' where User='root'; Query OK, 3 rows affected (0.01 sec) Rows matched: 3 Changed: 3 Warnings: 0 mysql> select * from user; 생략 mysql> flush privileges; Query OK, 0 rows affected (0.00 sec) 다시확인해본결과 root는 mysql 로바뀌어져있다. mysql> quit Bye [root@localhost bin]#./mysql ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO) 이젠 root 로접근이되지않는다는것을확인할수있다. mysql 로접속해보자. [root@localhost bin]#./mysql -u mysql -p Enter password: Welcome to the MySQL monitor. Commands end with ; or g. Your MySQL connection id is 5 Server version: 5.0.44 Source distribution
Type 'help;' or ' h' for help. Type ' c' to clear the buffer. mysql> 2) 아파치 httpd.conf 설정 httpd.conf 파일은 '/usr/local/apache/conf' 경로에위치해있다. [root@localhost conf]# pwd /usr/local/apache/conf [root@localhost conf]# ls extra httpd.conf httpd.conf.bak magic mime.types original [root@localhost conf]# vi httpd.conf php 확장자혹은 php3 확장자의파일을 PHP 로파싱하게끔하기위한설정이다. 다음과같이추가하면된다. # AddType application/x-compress.z AddType application/x-gzip.gz.tgz AddType application/x-httpd-php.php.php3 AddType application/x-httpd-php-source.phps # 디렉토리초기실행파일을우선순위순서로추가한다. 먼저초기실행파일을다음과같은순서로실행한다. 해당디렉토리가로딩이되면제일 <IfModule dir_module> DirectoryIndex index.html index.htm index.php index.php3 </IfModule> 이제 /usr/local/apache/htdocs 디렉토리에 phpinfo.php 파일을만들어서웹서버가제대로동작하는지알아보자 phpinfo.php 의파일내용은 <? phpinfo();?> 해주면된다. 웹브라우저로접속하여잘실행이되는것을확인하자.
3) 웹서버자동실행설정 다음은시스템부팅후웹서버자동실행설정방법이다. 시작된다. 서버가부팅되는시점부터서비스가 [root@localhost ~]# cd /etc/rc.d/ [root@localhost rc.d]# cat rc.local #!/bin/sh # # This script will be executed *after* all the other init scripts. # You can put your own initialization stuff in here if you don't # want to do the full Sys V style init stuff. touch /var/lock/subsys/local /usr/local/mysql/bin/mysqld_safe & /usr/local/apache/bin/apachectl start [root@localhost rc.d]# 5. Apache 웹서버기본보안설정 아파치서버를운영하면서 httpd.conf 파일의설정이나, 디렉토리와파일의퍼미션과속성등을이용하여자체보안설정을할수가있다. 여기서는 /usr/local/apache/conf/ 에위치한 httpd.conf 파일을이용하여간단하지만효과가보안설정을구현해보자이번에다루게될 httpd.conf 파일은아파치웹서버의환경을설정하는파일이다. 5-1. /usr/local/apache/conf/httpd.conf 1). httpd.conf 파일의퍼미션설정 기본적으로 httpd.conf 파일은퍼미션이 644 로되어있다. 이는 root를포함한일반계정의사용자들도 httpd.conf 파일을열람할수있다는애기가된다. root 계정외에 httpd.conf 파일을열람할수없도록퍼미션을 600 으로수정하자. [root@localhost conf]# ls -al httpd.conf -rw-r--r-- 1 root root 15628 Mar 29 03:09 httpd.conf [root@localhost conf]# chmod 600 httpd.conf
[root@localhost conf]# ls -al httpd.conf -rw------- 1 root root 15628 Mar 29 03:09 httpd.conf [root@localhost conf]# 2) <Directory ~> 태그내에 Indexes 값제거 httpd.conf 파일의지시자중 Option에설정되는 Indexes의설정은 DirectoryIndex에서지정한파일이웹브라우저에없을경우그디렉토리에있는모든파일및하위디렉토리를출력해주게된다. 그러므로 Option 지시자에 Indexes 값을제거하자. ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ <Directory ~> Option Indexes <--제거 </Directory> ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ 3) <Directory ~> 태그내에 FollowSymLinks 제거 FollowSymLinks값이설정되어있다면디렉토리내용중심볼릭링크파일이있다면그파일에접근했을경우링크된파일의내용이출력되게된다. 만약 ln -s /www/symlink.txt /etc/passwd 로설정된파일이있다면우리는웹상에서 /etc/passwd 파일의내용을노출하는것이된다. 그러므로웹상에서링크파일의사용을허락해선안된다. ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ <Directory ~> Option FollowSymLinks <--제거 </Directory> ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ 4) <Directory ~> 태그접근거부설정웹을통하여접근할수있는모든디레토리에대하여다음과같이설정하면해당디렉토리에대한접근이거부되어불법적인접근을막을수있다. ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
<Directory ~> Order Deny, Allow Deny From all </Directory ~> ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ 5) 에러페이지 redirect 웹서버운영중에러페이지를공격자에게보여주게되면공격자는그페이지를통하여웹서버의중요한정보를획득할수있게된다. 이러한에러페이지들을관리자가임의로만든에러페이지들로지정하여서버정보의노출을막을수있다. ErrorDocument 402 /402_error.html ErrorDocument 403 /403_error.html ErrorDocument 404 /404_error.html ErrorDocument 500 /500_error.html 5-2. /usr/local/zend/etc/php.ini php.ini 파일은 Apache, Mysql 서버와연동되어사용되고있다. 1) register_global php.ini 환경설정중 register_global 의값을 on 으로설정할경우 php 스크립트의변수값을임의로변경할수있는취약성이있다. 그러므로다음과같이설정한다. register_global=off 2) php 스크립트오류를사용자에게보내지않도록설정 log_error=on display_errors=off
6. 참고문헌 웹사이트 - http://www.superuser.co.kr - http://www.naver.com - http://www.google.co.kr - http://kldp.org/ 참고책자 : 리눅스서버관리실무바이블, 서자룡의페도라코어리눅스그대로따라하기