//blog.naver.com/dosuser에 있던 글
어제 modSecurity를 깔려는데....
기존 런닝중인 아파치가 동적 라이브러리지원을 안한다;;
OTL
작업하자 ㅡㅜ
런닝 중인 아파치 교체 작업+_+
아파치는 /usr/local/apache,/usr/local/apache2에 깔려있따 (소스 설치 하면 보통)
1.현재 상태 백업
1.1 파일 백업
/usr/local
tar cvfz apache20070112.tar.gz apache
1.2 모듈 설정 백업
/usr/local/apache/bin
httpd와 apachectl이 있다.
httpd -v => 버전확인 -> 1.3.27
httpd -l >moduleList => 컴파일 되어 런닝중인 모듈확인 -> 리스트 저장할것
1.3 아파치 설정 백업
/usr/local/apache/conf
아파치 1.3.x버전이므로 httpd.conf에 대부분의 설정들이 들어가 있다.
이곳의 설정 파일들을 모두 따로 저장해 놓을것
그리고 httpd.conf를 확인해서 동적 라이브러리를 어떤것을 쓰고있는지 확인
1.4 phpinfo
php인스톨시 사용할 configure 명령어 확인,아파치 설정들 저장
phpinfo명령은 많은 설정들을 이쁘게 보여준다.
<?php
echo phpinfo();
?>
이런걸 하나 어따 올려서 그 내역을 저장해 놓는다.
그중에 php 컴파일시 수행했던 configure 명령을 얻을 수가 있다.
'./configure' '--with-apache=../apache_1.3.28' '--with-mysql=/usr/local/mysql' '--with-gd=/usr/local/gd207' '--
with-gif-dir=/usr/lib' '--with-png-dir' '--with-zlib-dir' '--with-jpeg-dir' '--with-imap' '--with-imap-ssl' '--with-
kerberos' '--with-freetype-dir' '--enable-ftp' '--enable-socket' '--disable-debug' '--enable-track-vars'
이런 녀석을 구할수가 있다. 물론 실제 내역은 다 다를것이다(기존에 어떻게 했느냐에 따라서)
gd
mysql
일부 아파치설정
음또.. 암튼 많다.
유용하니 꼭 저장
2. 아파치 새로 깔기
2.1 다운로드 받기
apache와 www.apache.org
php를 받는다. www.php.net
둘다 받아서 한 디렉토리에 넣고
apache_1.3.37.tar.gz
php-4.4.4.tar.gz
tar xvfz apache_1.3.37.tar.gz
tar php-4.4.4.tar.gz
일단 php의 INSTALL파일을 보면 경우 별로 어떻게 설치해야하는 지 알수 있다.
php를 동적으로 설정하고 싶고 apache가 1.3인경우 어떻게 해야하는지를 해당 파일에서 볼수가 있다.
2.2 기타 라이브러리 설치
gd가 문제다
gd를 까니또 libjpeg도 문제다
둘다 www.google.com을 통해서 찾아서 받자
둘다 ./configure
make
install
하자
그럼 둘다 /usr/local/하에 있는 디렉토리 들에 적절 하게 들어간다
2.3 아파치 설치
아파치는 위에서 알아낸 모듈리스트를 가지고 configure명령에 사용할 커멘드를 만들어 놓자
apache_1.3.37디렉토리에서
./configure -help를 이용해서 어떻게 하면 되는지 볼 수있다.
내 아파치 설정은
./configure --prefix=/usr/local/apache2 \
--enable-module=env \
--enable-module=log_config \
--enable-module=mime \
--enable-module=negotiation \
--enable-module=status \
--enable-module=include \
--enable-module=autoindex \
--enable-module=dir \
--enable-module=cgi \
--enable-module=asis \
--enable-module=imap \
--enable-module=actions \
--enable-module=userdir \
--enable-module=alias \
--enable-module=access \
--enable-module=auth \
--enable-module=setenvif \
--enable-module=so \
그냥 냅다 썼다. 리스트에다가 --enable-module=을 복사해서 붙여 넣었다.
php는 원본을 좀 수정했다.
'./configure'
--with-apxs=/usr/local/apache2/bin/apxs '--with-mysql=/usr/local/mysql'
'--with-gd=/usr/local/' '--with-gif-dir=/usr/lib' '--with-png-dir'
'--with-zlib-dir' '--with-jpeg-dir' '--with-imap' '--with-imap-ssl'
'--with-kerberos' '--with-freetype-dir' '--enable-ftp'
'--enable-socket' '--disable-debug' '--enable-track-vars'
일단 모듈로 설치하기위해서--with-apxs=/usr/local/apache2/bin/apxs
gd를 설치하기 위해서 '--with-gd=/usr/local/' 로 경로를 바꿨다.
php의 INSTALL를 보고 설치를 하자
2.4 새로운 아파치 실행
설치가 다 끝났으면
물론 당연히 apache의 설정 파일들을 새로운 apache디렉토리, 여기서는 apache2에 넣는다.
설정파일들에 아파치의 경로설정이 되어 있는 것들이 있는데 이런것들을 수정해주자.
그리고!!!! httpd.conf에보면 Port 가 있다.(없으면 좀 윗단에다가 써주면 된다.)
Port 8080으로 설정해주고
새로운 아파치를 수행해주자
자 이제 새로운 아파치 포트 8080으로 접속을해서 아파치위에서 돌아가고 있는 사이트들이 원활 하게 동작하는지 확인하자
3. modSecurity를 깔자
3.1 받기, 설치
서두를 것 없이 www.modsecurity.org에서 1.9x버전을 받아서(현재 2.x버전이 나왔지만 아파치 2.x버전에서만 동작한다.) INSTALL파일을 잘 읽어보자
modSecurity소스는 1.3 , 2.x둘다 포함되어 있다. 1.3버전의 디렉토리에 가서
/usr/local/apache2/apxs -cia modsecurity.c
라고 하면
설치가 된다.
그 다음
3.2 modSecurity설정
modSecurity2를 깔았다면 그곳의 core룰 이란것도 같이 받아서 설치를 하고 아니라면
www.krcert.or.kr에 가서 modsecurity관련 안내문을 받아 보자 물론 modsecurity의 설명문에도 설정 방법과 기본 설정룰이 있지만 그래도 서트가 낳지 않을까 한다.
"modsecurity를 이용한 웹 서버 보안" 이라는 문서를 받아서 한번 보자
아크로벳리더에서 텍스트로 저장기능을 이용하여 아래의 내용을 뽑았다.
[부록] ModSecurity Rule 설정 예
##### Configuration #####
SecFilterEngine On
SecFilterScanPost On
SecFilterScanOutput Off
SecFilterOutputMimeTypes "(null) text/html text/plain"
##### Validation #####
SecFilterCheckURLEncoding On
SecUploadDir /tmp
SecUploadKeepFiles Off
SecFilterCheckUnicodeEncoding Off
SecFilterForceByteRange 1 255
SecFilterDefaultAction "log,deny,status:403"
##### Logging #####
SecFilterDebugLog logs/modsec_debug.log
SecFilterDebugLevel 1
SecAuditEngine RelevantOnly
SecAuditLog logs/modsec_audit.log
##### Hardening #####
# Body를 가진 GET 또는 HEAD 요청 차단(공격 가능성 높음)
SecFilterSelective REQUEST_METHOD "^(GET|HEAD)$" chain
SecFilterSelective HTTP_Content-Length "!^$"
SecFilterSelective SERVER_PROTOCOL "!^HTTP/(0\.9|1\.0|1\.1)$"
# Content-Length가 없는 POST 요청 차단
SecFilterSelective REQUEST_METHOD "^POST$" chain
SecFilterSelective HTTP_Content-Length "^$"
SecFilterSelective HTTP_Transfer-Encoding "!^$"
##### General #####
SecFilterSelective HTTP_Host|HTTP_User-Agent|HTTP_Accept "^$"
SecFilterSelective HTTP_User-Agent "(libwhisker|paros|wget|libwww|perl|curl|java)"
##### SQL Injection Attacks #### dosuser작성
SecFilterSignatureAction "log,deny,msg:'SQL Injection attack'"
SecFilterSelective ARGS "delete[[:space:]]+from"
SecFilterSelective ARGS "drop[[:space:]]+database"
SecFilterSelective ARGS "drop[[:space:]]+table"
SecFilterSelective ARGS "drop[[:space:]]+column"
SecFilterSelective ARGS "drop[[:space:]]+procedure"
SecFilterSelective ARGS "create[[:space:]]+table"
SecFilterSelective ARGS "update.+set.+="
SecFilterSelective ARGS "insert[[:space:]]+into.+values"
SecFilterSelective ARGS "select.+from"
SecFilterSelective ARGS "bulk[[:space:]]+insert"
SecFilterSelective ARGS "union.+select"
SecFilterSelective ARGS "or.+1[[:space:]]*=[[:space:]]1"
SecFilterSelective ARGS "alter[[:space:]]+table"
SecFilterSelective ARGS "or 1=1--'"
SecFilterSelective ARGS "'.+--"
SecFilterSelective ARGS "into[[:space:]]+outfile"
SecFilterSelective ARGS "load[[:space:]]+data
SecFilterSelective ARGS "/\*.+\*/"
##### XSS Attacks #####
SecFilterSignatureAction "log,deny,msg:'XSS attack'"
SecFilterSelective ARGS "<script"
SecFilterSelective ARGS "javascript:"
SecFilterSelective ARGS "vbscript:"
SecFilterSelective ARGS "document\.cookie"
SecFilterSelective ARGS "document\.location"
SecFilterSelective ARGS "document\.write"
##### Command Execution #####
SecFilterSignatureAction "log,deny,msg:'Command execution attack'"
SecFilterSelective ARGS_VALUES ";[[:space:]]*(ls|id|pwd|wget)"
##### PHP Attacks #####
SecFilterSignatureAction "log,deny,msg:'PHP Injection Attacks'"
SecFilterSelective ARGS_VALUES "^http:/"
SecFilterSelective ARGS_NAMES "(^globals\[|^globals$)"
이 설정을 httpd.conf에 이쁘게 넣는다.
/usr/local/apache2/bin/apachectl configtest를 수행한다.
나는
SecFilterScanOutput Off
SecFilterOutputMimeTypes "(null) text/html text/plain"
두 문장에서 에러가 났다. 회사에서 빨리하라고 해서 빼버렸다-_-
4. 기존 아파치 서버 새로 설치한 아파치서버로 교체
새로운 아파치를 재 시작하고
/usr/local/apache2/bin/apachectl restart
사이트가 원활하게 동작하는지 보자
정상적으로 작동한다면
새로운 아파치의 httpd.conf파일에서 Port 를 80으로 바꾸고
원래 아파치 서버를 죽이고 stop
새로운 아파치 서버를 죽이고 stop
새로운 아파치 서버를 시작 시킨다. start
(restart로 하면 적용이 안되었다)
자.....토요일 아침에 출근해떠니 아무도 없다....
써서 블로그에 올리고
오늘은 또다른 삽질이 나를 기다리고 있을 것이다....
대학원 준비는 언제하지-_-;;;