본문 바로가기

해봐야 안다.OTL/Linux

[리눅스] WEB_SERVER 보안 구축(APM+modsecurity+modevasive+modssl)

Web2 SERVER 보안에 입각한 APM 설치]] 작성자: 조정현

<Contents>

 

<-작업 설명-> 

1 <-apache 설치->
1.1 기존 httpd 설치 여부 확인
1.2 httpd 다운로드 및 압축해제
1.3 httpd banner 정보 변조
1.4 httpd 설치
1.4.1 httpd.conf 수정: httpd(데몬)을 돌릴 계정 바꾸기
1.4.2 httpd 시작
1.4.3 서버의 배너그랩 확인
1.4.4 httpd 실행데몬 서비스 올리기
1.4.5 웹서버 기본 디렉토리 바꾸기
1.4.6 index.html 생성
1.4.7 방화벽 80포트 열기
1.4.8 httpd 시작
1.4.9 web test
1.5 log설정 변경
1.6 rotatelog
1.6.1 에러로그
1.6.2 액세스로그
1.7 SetEnvIf를 이용한 필터링 기능 이용
1.8 디렉토리 지시자


2 <-Mysql 설치->
2.1 기존 mysql 설치 여부 확인
2.2 Mysql 다운로드 및 압축해제
2.3 Mysql을 운영할 User생성
2.4 Mysql 설치
2.4.1 디렉토리 소유권 및 권한 변경
2.4.2 PATH 추가
2.4.3 mysql db생성
2.4.4 mysql 서비스 올리기
2.4.5 mysql secure install
2.5 Mysql 설정
2.5.1 mysql 관리자 계정 변경
2.6 히스토리 지우기


3 <-PHP 설치->
3.1 라이브러리 설치
3.1.1 iconv설치
3.2 php 다운로드 및 압축해제
3.3 php 설치
3.3.1 php환경파일 복사 및 php.ini수정
3.3.2 Httpd.conf 수정
3.3.3 php모듈 selinux관련 에러
3.3.4 httpd 서비스 재시작
3.3.5 phpinfo 테스트


4 아파치 보안 모듈1
4.1 ModSecurity
4.1.1 modsecurity 다운로드 및 압축해제
4.1.2 라이브러리 설치
4.1.3 mod_unique_id.so 모듈확인
4.1.4 mod_unique_id 설치
4.2 modsecurity 설치
4.2.1 mod_security2.so 모듈 httpd.conf에 등록
4.2.2 kisa 제공 룰 받아 적용
4.2.2.1 다운로드
4.2.2.2 압축풀기
4.2.2.3 내용 복사
4.2.2.4 modsecurity/SMB.conf : 다운로드 받은 룰을 인클루드 시키기
4.2.2.5 아파치 서비스 재시작
4.2.3 로그파일 위치
4.2.4 룰 지시자 설명


5 제로보드 설치
5.1 제로보드 설치 파일 확인
5.2 압축 해제
5.3 “xe/ 디렉토리 ”소유자 변경
5.4 제로보드에 쓰일 DB생성 및 권한 이임
5.5 웹브라우저->내 서버주소/xe/
5.6 php.ini수정


6 modsecurity 테스트
6.1 아파치 서비스 재시작
6.2 modsecurity Log보기
6.3 웹 테스트
6.4 modsecurityLog


7 아파치 보안 모듈2
7.1 Mod_evasive
7.1.1 Mod_evasive 다운로드
7.1.2 압축해제
7.1.3 Mod_evasive 모듈 설치
7.1.3.1 설치된 모듈 확인
7.1.3.2 httpd.conf mod_evasive 모듈 올라온 것 확인
7.1.3.3 적용 전 테스트
7.1.3.4 아파치 서비스 재시작
7.1.3.5 적용 후 테스트


8 SSL이용 HTTPS 보안 웹서버구축
8.1 openssl 업데이트
8.2 공개키와 개인키 만들기 (.pem은 공개키, .key는 개인키)
8.2.1 키 생성된 것 확인
8.3 root CA 만들기(최상위 인증기관)
8.3.1 생성된 ca.key 확인
8.3.2 ca.key와 websrv.key를 root만 읽을 수 있도록 권한 설정
8.4 root 인증서 만들기
8.4.1 생성한 root 인증서 확인
8.4.2 인증서 인증받기
8.5 httpd.conf 에 ssl 모듈 확인
8.5.1 ssl_module설치하기
8.5.2 확인
8.5.3 httpd.conf 수정
8.5.4 extra/httpd-ssl.conf 수정
8.5.5 테스트


9 제로보드 재 설치 후 SSL 적용

 

 

<-작업 설명->

Apche 설치시 배너 그랩에 대한 대비해 .httpd.h 혹은 ap_release.h 파일을 수정 후 설치한다. 그 다음 apache 보안 설정을 하고 apache 로그는 rotatelog 를 쓸 것이다. 

 

나머지 /var/log/* 로그들은 원격 로그 서버로 넘긴다.

 

이 모든 작업이 끝난 후 상단의 방화벽 서버에서 NAT로 연결하기 위한 작업을 한 다음 테스트를 진행한다.

APM 설치 순서는 apache --> mysql --> php --> 제로보드까지 설치한다.

그 다음 오픈 소스를 이용해 modsecurity, mod_evasive를 이용하여 아파치 보안 설정을 한다.

apache 와 mysql의 설치 순서는 상관없지만 php는 맨 마지막에 설치하여야 한다.

왜냐하면 apache와 mysql을 연동시켜줘야 하는데 각각 설치 디렉토리 등 php설치시 ./configure 옵션에 명시시켜줘야 제대로 설치되기 때문이다.

--

 

 

1 apache 설치

1.1 기존 httpd 설치 여부 확인

#rpm -qa |grep httpd

--> 기존에 설치된 httpd 가 있는지 확인한다.

만약 존재하면 rpm –e --nodeps [package name] 의존성 여부 상관없이 삭제하는 명령 


1.2 httpd 다운로드 및 압축해제 

#mkdir /usr/local/src/apm 

#cd /usr/local/src/apm 

 

[root@web2:/usr/local/src/apm] 

#wget http://mirror.korea.ac.kr/apache/httpd/httpd-2.2.14.tar.gz 

#tar xvfz httpd-2.2.14.tar.gz 


1.3 httpd banner 정보 변조 

* .httpd.h 혹은 ap_release.h 파일을 수정해서 banner grabbing을 통한 web server version 정보가  

노출되는 것을 막는다. 

마치 윈도우 IIS 서버 인 것처럼 보이게 할 것이다. 

[root@web2:/usr/local/src/apm/httpd-2.2.14/include] 

#vi ap_release.h 

27 #define AP_SERVER_COPYRIGHT \ 

28         "ⓒ 2008 Microsoft Corporation. All rights reserved." 

41 #define AP_SERVER_BASEVENDOR "Microsoft Corporation" 

42 #define AP_SERVER_BASEPROJECT "Microsoft IIS Web Server" 

43 #define AP_SERVER_BASEPRODUCT "Microsoft IIS/6.0" 

44  

45 #define AP_SERVER_MAJORVERSION_NUMBER 6 

46 #define AP_SERVER_MINORVERSION_NUMBER 0 

47 #define AP_SERVER_PATCHLEVEL_NUMBER   15 

48 #define AP_SERVER_DEVBUILD_BOOLEAN    0


1.4 httpd 설치 
[root@web2:/usr/local/src/apm/httpd-2.2.14] 
#./configure --prefix=/usr/local/http --enable-mods-shared=all --enable-so --enable-rewrite --enable-ssl --with-mpm=worker && make && make install 


1.4.1 httpd.conf 수정: httpd(데몬)을 돌릴 계정 바꾸기 
[root@web2:/usr/local/http/conf] 
#vi httpd.conf 
65 User webuser 
66 Group webuser 
-- 

#useradd -M -s /bin/false webuser 
--> 데몬 돌릴 계정 생성 


1.4.2 httpd 시작 
[root@web2:/usr/local/http/bin] 
#./apachectl -k start 
#ps -ef |grep httpd 
root 23266 1 2 00:48 ? 00:00:00 /usr/local/http/bin/httpd -k start 
webuser 23283 23266 0 00:48 ? 00:00:00 /usr/local/http/bin/httpd -k start 
webuser 23284 23266 0 00:48 ? 00:00:00 /usr/local/http/bin/httpd -k start 
webuser 23285 23266 0 00:48 ? 00:00:00 /usr/local/http/bin/httpd -k start 
webuser 23286 23266 0 00:48 ? 00:00:00 /usr/local/http/bin/httpd -k start 
root 24030 3197 0 00:48 pts/0 00:00:00 grep --color httpd 



1.4.3 서버의 배너그랩 확인 
#wget -S --spider http://localhost 
--00:49:28-- http://localhost/ 
Resolving localhost... 127.0.0.1 
Connecting to localhost|127.0.0.1|:80... connected. 
HTTP request sent, awaiting response...  
HTTP/1.1 200 OK 
Date: Mon, 30 Nov 2009 15:49:28 GMT 
Server: Microsoft IIS/6.0/6.0.15 (Unix) mod_ssl/6.0.15 OpenSSL/0.9.8e-fips-rhel5 
Last-Modified: Sat, 20 Nov 2004 20:16:24 GMT 
ETag: "1982a3-2c-3e9564c23b600" 
Accept-Ranges: bytes 
Content-Length: 44 
Keep-Alive: timeout=5, max=100 
Connection: Keep-Alive 
Content-Type: text/html 
Length: 44 [text/html] 
200 OK 
뒤쪽에 (Unix) mod_ssl/6.0.15 OpenSSL/0.9.8e-fips-rhel5 DAV/2 
이렇게 나오는데 이걸 없애는 것을 하겠다 
[서버 시그니쳐] - 보여 줄지 안 보여 줄지 확연하게 결정(딱딱함) 
[서버 토큰] - 어느 정도 보여줄지 결정 (유연함) 






[root@web2:/usr/local/http/conf/extra] 
#vi httpd-default.conf  
52 # Set to one of:  Full | OS | Minor | Minimal | Major | Prod 
선택  
…………………………………………………………………………………………………………………………………………// 
55 ServerTokens Full <-- 이렇게 되어있어 정보가 다나온다. 밑에 처럼 
Server: Microsoft IIS/6.0/6.0.15 (Unix) mod_ssl/6.0.15 OpenSSL/0.9.8e-fips-rhel5 
…………………………………………………………………………..……………………………………………………………..// 
55 ServerTokens Minimal <-- 미니멀로 바꾸었다. 그럼 OS정보가 최소화 되서 나올것이다. 
…………………………………………………………………………..……………………………………………………………..//

--
[root@web2:/usr/local/http/conf] 
#vi httpd.conf <-- httpd-default.conf에 대한 주석을 풀어준다 
472 Include conf/extra/httpd-default.conf

-- 
#pkill -9 httpd 
[root@web2:/usr/local/http/bin] 
#./apachectl -k start 
#wget -S --spider http://localhost 
--01:53:10-- http://localhost/ 
Resolving localhost... 127.0.0.1 
Connecting to localhost|127.0.0.1|:80... connected. 
HTTP request sent, awaiting response...  
HTTP/1.1 200 OK 
Date: Mon, 30 Nov 2009 16:53:10 GMT 
Server: Microsoft IIS/6.0/6.0.15
Last-Modified: Mon, 30 Nov 2009 16:02:04 GMT 
ETag: "1986f3-c-47998c3371700" 
Accept-Ranges: bytes 
Content-Length: 12 
Keep-Alive: timeout=5, max=100 
Connection: Keep-Alive 
Content-Type: text/html 
Length: 12 [text/html] 
200 OK 
--> 서버에 대한 버전 정보가 IIS 서버인 것처럼 변조되어 나온다. 


1.4.4 httpd 실행데몬 서비스 올리기 

[root@web2:/usr/local/http/bin] 
#cp ./apachectl /etc/init.d/httpd 
#vi /etc/init.d/httpd 
--> 맨 위에부터 삽입 
1 #!/bin/sh 
2 #chkconfig:2345 90 90 
3 #description:init file for Apache Server daemon 
4 #processname:/usr/local/http/bin/apachectl 
5 #config:/usr/local/http/conf/httpd.conf 
6 #pidfile:/usr/local/http/logs/httpd.pid 
-- 
#chkconfig --add httpd 
#chkconfig --level 3 httpd on 
#service httpd stop 


1.4.5 웹서버 기본 디렉토리 바꾸기 

[root@web2:/usr/local/http] 
#mkdir web 
#chown -R webuser:webuser web 
#vi conf/httpd.conf 
104 DocumentRoot "/usr/local/http/web" --> 경로를 위에서 만든 web 디렉토리로 변경
182 <Directory "/usr/local/http/web"> --> 경로를 위에서 만든 web 디렉토리로 변경

-- 


1.4.6 index.html 생성 

[root@web2:/usr/local/http/web] 
#touch index.html 
#echo hello world > index.html 


1.4.7 방화벽 80포트 열기 
#iptables -I INPUT -p tcp --dport 80 -j ACCEPT 
#iptables -I OUTPUT -p tcp --sport 80 -j ACCEPT 
일단 테스트하기 위해 방화벽 80번 포트를 열어놓는다. 


1.4.8 httpd 시작 
#service httpd start 



1.4.9 web test 


1.5 log설정 변경 

[root@web2:/usr/local/http/conf] 
#vi httpd.conf  
186 ErrorLog "logs/error_log" --> 에러 로그가 쌓이면 문제가 된다.
187  
188 # 
189 # LogLevel: Control the number of messages logged to the error_log. 
190 # Possible values include: debug, info, notice, warn, error, crit, 
191 # alert, emerg. 
192 # 
193 LogLevel warn 

--
 
LogLevel  
--> 상황에 맞게 끔 로그가 쌓이게된다. 그것을 결정해주는 게 LogLevel 이다. 

쌓이는 순서

debug, >>info, >>notice, >>warn, >>error, >>crit, >> alert, >>emerg.

info, >>notice, >>warn, >>error, >>crit, >> alert, >>emerg

notice, >>warn, >>error, >>crit, >> alert, >>emerg

warn, >>error, >>crit, >> alert, >>emerg

error, >>crit, >> alert, >>emerg


241 # Possible values include: debug, info, notice, warn, error, crit, 

242 # alert, emerg.  

-- 
<로그파일 포맷 정의> 
--> 로그남기는 형식 설정하는 부분이다.

 

로그파일 포맷 정의

200 LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined 

201 LogFormat "%h %l %u %t \"%r\" %>s %b" common 


-- 

정의한 포맷을 적용

215 CustomLog "logs/access_log" common 




1.6 rotatelog 
--> 로그파일이 커지면 속도와 성능에 적지 않은 영향을 준다 
"rotatelog"를 사용하여 로그파일을 시간 또는 날짜 별로 묶는다. 

로그파일이 저장될 디렉토리와 파일을 만든다. 
[root@web2:/usr/local/http/conf] 
#mkdir /weblogs 
#touch /weblogs/error_log 
#touch /weblogs/access_log 
#chown -R webuser:webuser /weblogs 




1.6.1 에러로그 

[root@web2:/usr/local/http/conf] 

#vi httpd.conf

186 #ErrorLog "logs/error_log" --> 주석처리 

187 # ErrorLog Rotate every 60's!! 

188 ErrorLog "|/usr/local/http/bin/rotatelogs /weblogs/error_log 60" 

--> 로그를 로테이션 시키는데 로그를 60초 단위로 남긴다는 뜻

-- 



1.6.2 액세스로그 
217 #CustomLog "logs/access_log" common 
218 CustomLog "|/usr/local/http/bin/rotatelogs /weblogs/access_log 60" common 
-- 

#service httpd restart

 
--> 익스플로러로 웹서버에 접속한 뒤 로그를 보자.

#ls -l /weblogs/

total 24

-rw-r--r-- 1 webuser webuser 0 Dec 1 01:28 access_log

-rw-r--r-- 1 root root 71 Dec 1 01:35 access_log.1259598900

-rw-r--r-- 1 webuser webuser 0 Dec 1 01:28 error_log

-rw-r--r-- 1 root root 150 Dec 1 01:35 error_log.1259598900



--> 제대로 로그가 생성되는 것을 볼 수 있다.

 

<날짜대로 로그 쌓이게 바꾸기>

--> 이번에는 로그파일 관리를 쉽게 하기 위해 년/월/일이 나오고 24시간(86400초) 단위로 설정

[root@web2:/usr/local/http/conf]#vi httpd.conf

………………………………………………………………………………………………………………………………………………………………… 

188 ErrorLog "|/usr/local/http/bin/rotatelogs /weblogs/error_log.%Y%m%d 86400"

218 CustomLog "|/usr/local/http/bin/rotatelogs /weblogs/access_log.%Y%m%d 86400" common

………………………………………………………………………………………………………………………………………………………………… 

 

[root@web2:/usr/local/http/conf]#service httpd restart

[root@web2:/usr/local/http/conf]#ps -ef |grep http

root 1815 1 0 01:02 ? 00:00:00 /usr/local/http/bin/httpd -k start

root 2156 1815 0 01:44 ? 00:00:00 /usr/local/http/bin/rotatelogs /weblogs/error_log.%Y%m%d 86400

root 2157 1815 0 01:44 ? 00:00:00 /usr/local/http/bin/rotatelogs /weblogs/access_log.%Y%m%d 86400

webuser 2158 1815 0 01:44 ? 00:00:00 /usr/local/http/bin/httpd -k start

webuser 2159 1815 0 01:44 ? 00:00:00 /usr/local/http/bin/httpd -k start

webuser 2160 1815 0 01:44 ? 00:00:00 /usr/local/http/bin/httpd -k start

webuser 2162 1815 0 01:44 ? 00:00:00 /usr/local/http/bin/httpd -k start

root 2244 3965 0 01:45 pts/0 00:00:00 grep --color http

--> 서비스 재시작하고 프로세스를 확인하면 아래와 같이 rotatelogs 프로세스가 2개가 뜬다

 

[root@web2:/usr/local/http/conf]#ls -l /weblogs/

-rw-r--r-- 1 root root 150 Dec 1 01:44 error_log.20091130

-rw-r--r-- 1 root root 71 Dec 1 01:47 access_log.20091130

--> 이런 식으로 로그 파일이 생성된다.

 

 

1.7 SetEnvIf를 이용한 필터링 기능 이용

 

images 로그와 warm로그는 별도로 저장 

웹서버 튜닝 중에 이미지 파일만 별도의 웹서버로 분리하는 방법이 잇다. 이 방법은 Request와 I/O출력, 트래픽을 분산하는 효과가 있을 것이다. 이런 튜닝방법과는 다르지만 images 로그만 별개로 파일에 저장한다.  

다음은 이미지 파일은 images_log에, Codered나 Nimda등의 warm은 warm_log에 저장하는 설정이다. 

예) 

SetEnvIf Request_URI ".gif$"        except=images 

SetEnvIf Request_URI ".jpe?g$"        except=images 

SetEnvIf Request_URI ".png$"        except=images 

SetEnvIf Request_URI "^/default.ida"    except=warm    # Codered 

SetEnvIf Request_URI "^/root.exe?"        except=warm    # Nimda 

SetEnvIf Request_URI "/cmd.exe?"        except=warm



-- 
[root@web2:/usr/local/http/conf]#vi httpd.conf 
새로 삽입한 부분
………………………………………………………………………………………………………………………………………………………………… 
218 # Use SetEnvIf Log Filtering
219 SetEnvIf Request_URI ".gif$" except=images
220 SetEnvIf Request_URI ".jpe?g$" except=images
221 SetEnvIf Request_URI ".png$" except=images
222  
223 SetEnvIf Request_URI "^/default.ida" except=warm # Codered
224 SetEnvIf Request_URI "^/root.exe?" except=warm # Nimda
225 SetEnvIf Request_URI "/cmd.exe?" except=warm
226 SetEnvIf Request _URI "^/NULLprinter" except=warm
227 SetEnvIf Request _URI "^/NULLIDA?" except=warm
228 SetEnvIf Request _URI "^/NULL.ida?" except=warm
229 SetEnvIf Request _URI "^/NULL.idq?" except=warm
230  
231  
232 SetEnvIf except images images
233 SetEnvIf except warm warm
234  
235  
236 #CustomLog "logs/access_log" common 
237 CustomLog "|/usr/local/http/bin/rotatelogs /weblogs/access_log.%Y%m%d 86400" common env=!except
238  CustomLog "/weblogs/images_log" common env=images
239  CustomLog "/weblogs/warm_log" combined env=warm
………………………………………………………………………………………………………………………………………………………………… 


[root@web2:/usr/local/http/conf]#../bin/httpd -t 
Syntax OK 
--> 문법 검사 

[root@web2:/usr/local/http/conf]#service httpd restart 

-- 
[root@web2:/usr/local/http/conf]#ls -l /weblogs/ 
total 68 
-rw-r--r-- 1 webuser webuser 0 Dec 1 01:28 access_log 
-rw-r--r-- 1 root root 71 Dec 1 01:35 access_log.1259598900 
-rw-r--r-- 1 root root 71 Dec 1 01:47 access_log.20091130 
-rw-r--r-- 1 webuser webuser 0 Dec 1 01:28 error_log 
-rw-r--r-- 1 root root 150 Dec 1 01:35 error_log.1259598900 
-rw-r--r-- 1 root root 76 Dec 1 01:44 error_log.1259599440 
-rw-r--r-- 1 root root 150 Dec 1 01:44 error_log.20091130 
-rw-r--r-- 1 root root 333 Dec 1 15:02 error_log.20091201 
-rw-r--r-- 1 root root 0 Dec 1 15:02 images_log 
-rw-r--r-- 1 root root 283 Dec 1 15:02 warm_log --> 생겼다.


"warm_log" 를 보면 
[root@web2:/usr/local/http/conf]#cat /weblogs/warm_log  
192.168.10.26 - - [01/Dec/2009:15:02:58 +0900] "GET /cmd.exe HTTP/1.1" 404 287 "-" "Mozilla/4.0  
(compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; Mozilla/4.0 (compatible; MSIE 6.0; Windows  
NT 5.1; SV1) ; InfoPath.2; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)" 




1.8 디렉토리 지시자 

None

모든 접근 거부

All

모든 접근 허용

Indexes

디렉토리 인덱스 파일이 없을경우 파일목록의 출력

Includes

서버측의 추가적인 포함기능 활성화(SSI)

IncludesNOEXEC

서버측의 포함기능은 사용, #exec #include등의 CGI스크립트는 X

FollowSymLinks

서버측 심볼링 링크 사용

ExecCGI

CGI 스크립트의 실행 가능

MultiViews

컨텐트 협상 활성화

AllowOverride

사용자 인증에 관한 지시자

-- 

--> 루트 디렉토리를 test.html 에 링크 검. 
[root@web2:/usr/local/http/web]#ln -s / ./test.html 
[root@web2:/usr/local/http/web]#ll 
total 36 
drwxr-xr-x 2 webuser webuser 4096 Dec 1 23:04 . 
drwxr-xr-x 16 root root 4096 Dec 1 01:01 .. 
-rw-r--r-- 1 root root 12 Dec 1 01:02 index.html 
-rw-r--r-- 1 root root 20 Dec 1 20:25 phpinfo.php 
lrwxrwxrwx 1 root root 1 Dec 1 23:04 test.html -> / 
--> test.html 파일을 통해 링크 걸려있는 루트 디렉토리 내용이 웹 페이지에 출력된다. 
이 것을 막기 위해 "<Directory />" 지시자. , "Option FollowSymLinks", "AllowOverride None"을  
주석 처리 해줘야 한다. 

 [root@web2:/usr/local/http/conf]#vi httpd.conf 
………………………………………………………………………………………………………………………………………………………………… 
115 <Directory /> 
116 #Options FollowSymLinks 
117 #AllowOverride None 
118 Order deny,allow 
119 Deny from all 
120 </Directory> 
 
145 #Options Indexes FollowSymLinks --> 주석 처리
146 Options –Indexes  --> 새로 삽입
………………………………………………………………………………………………………………………………………………………………… 

[root@web2:/usr/local/http/conf]#service httpd restart 
 
[웹 접속 테스트 -->http://192.168.10.185/test.html]


2 Mysql 설치 

보안의 강도를 가장 높게 하려면 Mysql 은 다음의 원칙 아래 설치/설정되어야 한다.

- Mysql 데이터 베이스는 chroot 환경에서 실행한다.
- Mysql 프로세스는 다른 시스템 프로세스가 사용하지 않는 유일한 UID/GID 로 실행한다.
-로컬 액세스만 허용한다.
-Mysql 루트 계정은 추정하기 어려운 패스워드를 설정한다.
-관리자가 어카운트 명을 변경한다.
-데이터베이스로의 익명 접속(nobody 계정 사용)을 금지한다.
-간단한 데이터베이스와 테이블을 모두 삭제한다.

--

2.1 기존 mysql 설치 여부 확인

[root@web2:~]#rpm -qa |grep mysql

--> 기존에 설치된 mysql 가 있는지 확인한다. 

만약 존재하면 rpm –e --nodeps [package name] 의존성 여부 상관없이 삭제하는 명령 



2.2 Mysql 다운로드 및 압축해제 

[root@web2:/usr/local/http/conf]#cd /usr/local/src/apm 

[root@web2:/usr/local/src/apm]#wget http://203.237.211.230/named_scripts/mysql-5.1.38.tar.gz 

[root@web2:/usr/local/src/apm]#tar xvfz mysql-5.1.38.tar.gz 



2.3 Mysql을 운영할 User생성 

[root@web2:/usr/local/src/apm]# useradd -c "Mysql Server" -M -s /bin/false mysql 



2.4 Mysql 설치 

[root@web2:/usr/local/src/apm]#./configure --prefix=/usr/local/mysql --localstatedir=/var/lib/mysql --with-charset=utf8 --sysconfdir=/etc --with-mysqld-user=mysql --with-unix-socket-path=/tmp/mysql.sock --with-mysqld-

ldflags=-all-static && make && make install 


[root@web2:/usr/local/src/apm/mysql-5.1.38]#cd /usr/local/mysql 

[root@web2:/usr/local/mysql]#cp share/mysql/my-medium.cnf /etc/my.cnf 

[root@web2:/usr/local/mysql]#chown mysql.mysql /etc/my.cnf 


[root@web2:/usr/local/mysql]#vi /etc/my.cnf 

…………………………………………………………………………… 

27 user = mysql --> 추가 삽입 

46 skip-networking --> 주석제거 함으로써 로컬에서만 사용할 수 있다.

…………………………………………………………………………… 



2.4.1 디렉토리 소유권 및 권한 변경 

[root@web2:/usr/local/mysql]#chown -R root.mysql /usr/local/mysql/  

[root@web2:/usr/local/mysql]#mkdir /var/lib/mysql/ 

[root@web2:/usr/local/mysql]#chown -R mysql:mysql /var/lib/mysql/ 

[root@web2:/usr/local/mysql]#chmod 700 /var/lib/mysql 




2.4.2 PATH 추가 

[root@web2:/usr/local/mysql]#vi /etc/profile 

…………………………………………………………………………… 

13: PATH=/usr/local/mysql/bin:$PATH -->삽입

…………………………………………………………………………… 

 

[root@web2:/usr/local/mysql]#source /etc/profile 

[root@web2:/usr/local/mysql]#echo $PATH 

/usr/local/mysql/bin:/usr/local/mysql/bin:/usr/local/mysql/bin:/usr/kerberos/sbin:/usr/kerberos/bin:

/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin 

--> 경로 추가 됐다. 




2.4.3 mysql db생성 

[root@web2:/var/lib/mysql]#mysql_install_db --user=mysql 

Installing MySQL system tables... 

OK 

Filling help tables... 

OK 

.. 

.. 



2.4.4 mysql 서비스 올리기 

[root@web2:/var/lib/mysql]#cd /usr/local/mysql 

[root@web2:/usr/local/mysql]#cp share/mysql/mysql.server /etc/init.d/mysqld 

[root@web2:/usr/local/mysql]#chkconfig --add mysqld 

[root@web2:/usr/local/mysql]#chkconfig --level 3 mysqld on 

[root@web2:/usr/local/mysql]#service mysqld start 

Starting MySQL. [ OK ] 

[root@web2:/usr/local/mysql]#netstat -nlp |grep :3306 

[root@web2:/usr/local/mysql]#netstat -nlp |grep mysql 

--> /etc/my.cnf 에서 46 skip-networking 때문에 포트가 안 열려 로컬에서만 접속 가능하게 된다. 

설치 후 skip-networking을 주석처리 해준다. 




2.4.5 mysql secure install 

[root@web2:/usr/local/mysql]#mysql_secure_installation //enter All "y" 

 

[root@web2:/usr/local/mysql]#mysql -u root -p

Enter password:

Welcome to the MySQL monitor. Commands end with ; or \g.

Your MySQL connection id is 9

Server version: 5.1.38-log Source distribution

 

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

 

mysql> use mysql

Database changed

mysql> select * from user;




2.5 Mysql 설정 

관리자 어카운트 변경

디폴트로 설정되는 관리자 어카운트(root)를 무차별 대입 공격

이나 딕셔너리 공격 등으로 추측해 내기 어려운 이름으로 변경한다.

변경해 두면 설사 공격을 당하더라도 공격자는 패스워드 뿐아니라

어카운트도 추측해 내야하기 때문에 공격은 더 어려워진다.

--

2.5.1 mysql 관리자 계정 변경

mysql> update user set user="mydbadmin" where user="root";

mysql> flush privileges;

mysql> quit

 

2.6 히스토리 지우기

실행되는 모든 SQL 커맨드가 남겨지므로 삭제

[root@web2:/usr/local/mysql]#cat /dev/null > ~/.mysql_history

 

 

 

 

3 PHP 설치

3.1 라이브러리 설치

[root@web2:~]#yum install libjpeg-devel libpng-devel freetype-devel gd-devel libxml2-devel –y

 

3.1.1 iconv설치

[root@web2:/usr/local/src/apm]#wget http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.13.1.tar.gz

[root@web2:/usr/local/src/apm]#tar xvfz libiconv-1.13.1.tar.gz

[root@web2:/usr/local/src/apm]#cd libiconv-1.13.1

[root@web2:/usr/local/src/apm/libiconv-1.13.1]#./configure --prefix=/usr && make && make install

 

3.2 php 다운로드 및 압축해제

[root@web2:/usr/local/src/apm]#wget http://kr.php.net/get/php-5.3.0.tar.gz/from/this/mirror

[root@web2:/usr/local/src/apm]#tar xvfz php-5.3.0.tar.gz

 

3.3 php 설치

[root@web2:/usr/local/src/apm/php-5.3.0]#./configure --prefix=/usr/local/php --with-apxs2=/usr/local/http/bin/apxs --with-mysql=/usr/local/mysql --with-config-file-path=/usr/local/http/conf/ --enable-gd-native-ttf --enable-calendar --enable-mbstring --enable-zend-multibyte --enable-sockets --enable-mod-charset=utf8 --disable-debug --with-libxml-dir=/usr --with-libexpat-dir=/usr --with-jpeg-dir=/usr --with-png-dir=/usr --with-xpm-dir=/usr --with-zlib-dir=/usr --with-freetype-dir=/usr --with-gd --with-iconv=/usr/local && make && make install

 

3.3.1 php환경파일 복사 및 php.ini수정

파일 설치가 끝났다면 설정 파일을 apche 디렉터리로 복사 후 httpd.conf 를 설정을 해주도록 하겠다.

Safe_mode on 일 경우 파일을 이 디렉토리 및 그 하위로부터 include 하는 경우는 UID/GID 의 체크가 스킵된다.
이러한 디렉터리는 nclude_path에 포함되도록 하거나 또는 include 시에 절대 경로를 사용해야 한다.
Ecec관련의 함수를 통해 실행할 수 있는 권한을 safe_mode_include_dir에 있는 실행파일만으로 설정한다.
이 값을 on으로 설정하면 시스템 중요파일(/etc/passwd)접근을 제한 할 수 있으나 이 때문에 웹 프로그램이 정상 작동하지 않을 수 있다.

--

 

[root@web2:/usr/local/src/apm/php-5.3.0]#cp php.ini-production /usr/local/http/conf/php.ini

[root@web2:/usr/local/src/apm/php-5.3.0]#cd /usr/local/http/conf

[root@web2:/usr/local/http/conf]#vi php.ini

……………………………………………………………………………………………………………

338 safe_mode = On

531 display_errors = Off

695 register_globals = Off

344 safe_mode_gid = Off

431 expose_php = Off

874 file_uploads = Off

891 allow_url_fopen = Off

748 magic_quotes_gpc = On

379 ;open_basedir =

356 safe_mode_exec_dir =

552 log_errors = On

636 ;error_log = php_errors.log

--> 637 error_log = /weblogs/php_error.log (위에서 만들었던 아파치 로그 디렉토리 위치)

……………………………………………………………………………………………………………

이렇게 되어있는지 확인하고 안되어있다면 바꾸어준다.

 

3.3.2 Httpd.conf 수정

[root@web2:/usr/local/http/conf]#vi httpd.conf

……………………………………………………………………………………………………………

166 <IfModule dir_module>

167 DirectoryIndex index.html index.php

168 </IfModule>

 

332 AddType application/x-compress .Z

333 AddType application/x-gzip .gz .tgz

334 AddType application/x-httpd-php .php

335 AddType application/x-httpd-php-source .phps

……………………………………………………………………………………………………………

 

3.3.3 php모듈 selinux관련 에러

[root@web2:/usr/local/http/conf]#service httpd restart

httpd: Syntax error on line 53 of /usr/local/http/conf/httpd.conf: Cannot load /usr/local/http/modules/libphp5.so into server: /usr/local/http/modules/libphp5.so: cannot restore segment prot after reloc: Permission denied

 

--> libphp5.so 가 selinux 때문에 load 되지 않는다.

[root@web2:/usr/local/http/conf]#chcon -t textrel_shlib_t '/usr/local/http/modules/libphp5.so'

--> 꼭 해준다.

 

3.3.4 httpd 서비스 재시작

[root@web2:/usr/local/http/conf]#service httpd restart

[root@web2:/usr/local/http/conf]#ps -ef |grep http

root 1815 1 0 13:16 ? 00:00:01 /usr/local/http/bin/httpd -k start

root 10663 1815 0 20:22 ? 00:00:00 /usr/local/http/bin/rotatelogs /weblogs/error_log.%Y%m%d 86400

root 10664 1815 0 20:22 ? 00:00:00 /usr/local/http/bin/rotatelogs /weblogs/access_log.%Y%m%d 86400

webuser 10665 1815 0 20:22 ? 00:00:00 /usr/local/http/bin/httpd -k start

webuser 10666 1815 0 20:22 ? 00:00:00 /usr/local/http/bin/httpd -k start

webuser 10667 1815 0 20:22 ? 00:00:00 /usr/local/http/bin/httpd -k start

webuser 10685 1815 0 20:22 ? 00:00:00 /usr/local/http/bin/httpd -k start

root 10751 10413 0 20:22 pts/2 00:00:00 grep --color http

 

3.3.5 phpinfo 테스트

[root@web2:/usr/local/http/conf]#cd ../web/

[root@web2:/usr/local/http/web]#echo "<?php phpinfo(); ?>" > phpinfo.php

 

[root@web2:/usr/local/http/web]#cat ../conf/httpd.conf |grep libphp5.so

LoadModule php5_module modules/libphp5.so

--> php모듈이 올라와 있는지 확인

 

[root@web2:/usr/local/http/web]#service httpd restart

--> httpd 서비스 재시작

[phpinfo페이지 확인]

--

 

4 아파치 보안 모듈1

4.1 ModSecurity

Open Source Web Applivation Firewall 로서 공개된 프로그램이다. Apache 웹서버위에서 동작하는 형태로 되어있다.

ModSecurity는 O'Reilly에서 출간한 "Apache Security"라는 책을 쓴 Ivan Ristic가 개발한 툴로써, 설치 및 차단 Rule 설정 인터페이스가 CLI기반이어서 다소 불편하다는 단점은 있지만 그만큼 유연한 정책 설정이 가능하고 입력 값 검증기능이 매우 우수하다.

.

1. 웹서버로 들어오는 요청은 서버에 전달되기 전에 Mod_security에게 전달되어 정상적인 트래픽인지 여부에 대한 유효성 체크를 하게 된다.

 

2. 여러가지 IDS우회(evasion) 기법을 인식할 수 있는 기능을 제공한다.

경로와 파라미터를 분석하기 전에 정규화시켜 우회 공격을 차단한다. 즉, "//", "\/". ".". "%00" 등 우회 공격용 스트링을 제거하고, 인코딩된 URL을 디코딩한다.

 

3. Mod_security는 HTTPS뿐만 아니라 HTTP프로토콜을 정확히 이해하고 있으므로 정확도가 높고 상세한 설정도 가능하다.

.

4. POST Method로 작동하는 데이터에 대해서도 작동한다.

GET방식 뿐만 아니라 POST 메소드를 사용해서 전송되는 컨텐츠도 분석 가능하다.

.

5. 모든 요청에 대해 사후 분석을 위해 로그에 남길 수 있다.

POST를 포함하여 모든 요청의 모든 상세한 부분들까지 추후 분석을 위해서 로깅될 수 있다.

Modsecurity에서 차단 기능을 비활성화 시킨 후, 강력한 로깅 기능만으로 침입탐지 시스템 역할을 수행할 수 있도록 한다.

--

 

4.1.1 modsecurity 다운로드 및 압축해제

[root@web2:/usr/local/src/apm]#wget http://www.modsecurity.org/download/modsecurity-apache_2.5.10.tar.gz

 

[root@web2:/usr/local/src/apm]#tar xvfz modsecurity-apache_2.5.10.tar.gz

 

4.1.2 라이브러리 설치

"libxml2"는 설치 했으므로 넘어가고 "pcre:를 설치해야 한다.

[root@web2:/usr/local/src/apm]#yum install pcre-devel –y

 

 

 

 

4.1.3 mod_unique_id.so 모듈확인

modsecurity 2.5.x 버전을 설치하려면 unique_id가 반드시 설치되어 있어야 한다.

확인해보자.

[root@web2:/usr/local/http/conf]#cat httpd.conf |grep uni

# socket used to communicate with the CGI daemon of mod_cgid.

아파치 설치시 --enable-mods-shared=all 옵션을 주엇다면 있을 것인데 만약 모듈이 안 올라와 있다. 설치한다.

 

4.1.4 mod_unique_id 설치

[root@web2:/usr/local/http/conf]#cd /usr/local/src/apm/httpd-2.2.14

[root@web2:/usr/local/src/apm/httpd-2.2.14]#cd modules/metadata/

 

[root@web2:/usr/local/src/apm/httpd-2.2.14/modules/metadata]#/usr/local/http/bin/apxs -cia ./mod_unique_id.c

--> 아파치 소스파일 위치경로에서 "modules/metadata/mod_unique_id.c"를 설치한다.

그 다음 "httpd.conf" 에서 모듈이 올라왔는지 확인

 

[root@web2:/usr/local/http/conf]#cat httpd.conf |grep uni

LoadModule unique_id_module modules/mod_unique_id.so

# socket used to communicate with the CGI daemon of mod_cgid.

 

4.2 modsecurity 설치

[root@web2:/usr/local/http/conf]#cd /usr/local/src/apm/modsecurity-apache_2.5.10

[root@web2:/usr/local/src/apm/modsecurity-apache_2.5.10]#cd apache2/

 

[root@web2:/usr/local/src/apm/modsecurity-apache_2.5.10/apache2]#./configure --with-apxs=/usr/local/http/bin/apxs --with-pcre=/usr/bin --with-apr=/usr/local/http/bin/apr-1-config --with-apu=/usr/local/http/bin/apu-1-config &&make && make install

 

4.2.1 mod_security2.so 모듈 httpd.conf에 등록

………………………………………………………………………………………………………………………………………………………………….

[root@web2:/usr/local/http/conf]#vi httpd.conf

56 ####### mod security module ########################

57 LoadFile /usr/lib/libxml2.so

58 LoadModule security2_module modules/mod_security2.so

59 ####################################################

………………………………………………………………………………………………………………………………………………………………….

아파치 서비스 재시작

[root@web2:/usr/local/http/conf]#service httpd restart

 

4.2.2 kisa 제공 룰 받아 적용

http://www.securenet.or.kr/main.jsp?menuSeq=501

 

4.2.2.1 다운로드

 

 

4.2.2.2 압축풀기

 

4.2.2.3 내용 복사

 

[root@web2:/usr/local/http/conf]#mkdir modsecurity

[root@web2:/usr/local/http/conf]#cd modsecurity/

[root@web2:/usr/local/http/conf/modsecurity]#vi SMB.conf --> 붙여넣기, 저장.

 

4.2.2.4 modsecurity/SMB.conf : 다운로드 받은 룰을 인클루드 시키기

[root@web2:/usr/local/http/conf/modsecurity]#cd ..

[root@web2:/usr/local/http/conf]#vi httpd.conf

………………………………………………………………………………………………………………………………………………………………….

56 ####### mod security module ########################

57 LoadFile /usr/lib/libxml2.so

58 LoadModule security2_module modules/mod_security2.so

59 include conf/modsecurity/SMB.conf -->추가 삽입

60 ####################################################

………………………………………………………………………………………………………………………………………………………………….

 

4.2.2.5 아파치 서비스 재시작

[root@web2:/usr/local/http/conf]#service httpd restart

 

 

4.2.3 로그파일 위치

[root@web2:/usr/local/http/conf]#ll ../logs/modsec_audit.log

-rw-r----- 1 root root 0 Dec 2 03:45 ../logs/modsec_audit.log

 

4.2.4 룰 지시자 설명

[root@web2:/usr/local/http/conf]#cd modsecurity/

[root@web2:/usr/local/http/conf/modsecurity]#vi SMB.conf

………………………………………………………………………………………………………………………………………………………………….

26 SecRuleEngine On

39 SecDefaultAction "pass,log,auditlog,phase:2,t:urlDecodeUni,t:htmlEntityDec ode,t:lowercase"

………………………………………………………………………………………………………………………………………………………………….

 

SecDefaultAction 지시자의 추가적인 Action에 대해 알아보자. 먼저, 다음과 같은 5가지 종류로 분류 할 수 있다.

Disruptive actions : ModSecurity가 데이터를 중간에서 가로챌 때 일어나는 행위이다. 하나의 체인에 첫 번째 룰에만 나타낼 수 있다. allow, deny, drop 등이 있다.

Non-Disruptive actions : 어디에나 나타낼 수 있다. capture, ctl, exec, initcol 등이 있다.

Flow actions : 하나의 체인에 첫 번째 룰에만 나타낼 수 있다. chain 이 있다.

Meta-data actions : 하나의 체인에 첫 번째 룰에만 나타낼 수 있다. id, rev, severity, msg가 있다.

Data actions : 전면적으로 수동적이고 다른 행위에서 사용된 데이터를 운반하는 역할뿐이다.

--

 

 

5 제로보드 설치

다운로드 링크

--> 다운로드 받은 제로보드 xe.1.3.0.tgz 파일을 "/usr/local/http/web"에 업로드 시킨다.

 

5.1 제로보드 설치 파일 확인

[root@web2:/usr/local/http/web]#ls

index.html phpinfo.php test.html xe.1.3.0.tgz

 

5.2 압축 해제

[root@web2:/usr/local/http/web]#tar xvfz xe.1.3.0.tgz

 

5.3 "xe/ 디렉토리 "소유자 변경

[root@web2:/usr/local/http/web]#chown -R webuser:webuser xe/

 

 

5.4 제로보드에 쓰일 DB생성 및 권한 이임

[root@web2:/usr/local/http/web]#mysql -u mydbadmin -p

Enter password:

 

mysql> create database web;

Query OK, 1 row affected (0.00 sec)

.

mysql> grant all privileges on web.* to mydbadmin@"localhost";

Query OK, 0 rows affected (0.03 sec)

.

mysql> set password for mydbadmin@localhost=password('pass1234');

Query OK, 0 rows affected (0.00 sec)

.

mysql> quit 

--

 

5.5 웹브라우저->내 서버주소/xe/

 

 

5.6 php.ini수정

[root@web2:/usr/local/http/web]#vi ../conf/php.ini
………………………………………………………………………………………………………
338 safe_mode = Off
………………………………………………………………………………………………………



[root@web2:/usr/local/http/web]#service httpd restart

 

 

ssl 연동 세팅(링크)

 

 

6 modsecurity 테스트

[root@web2:/usr/local/http/conf]#cd ../logs/
[root@web2:/usr/local/http/logs]#tail -f modsec_audit.log

 --55192b3b-A--
[02/Dec/2009:04:50:42 +0900] SxVzkX8AAAEAAEkRDPMAAAAM 192.168.10.26 5648 192.168.10.185 80

--55192b3b-B--
GET /xe/index.php?module=admin&<script></script> HTTP/1.1
Accept: image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/x-ms-application, application/x-ms-xbap, application/vnd.ms-xpsdocument, application/xaml+xml, */*

Accept-Language: ko

User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) ; InfoPath.2; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)

Accept-Encoding: gzip, deflate
Host: 192.168.10.185
Connection: Keep-Alive
Cookie: PHPSESSID=olo0ut247guso9itm4e856r1l3; lang_type=ko

.
--55192b3b-F--

HTTP/1.1 200 OK
X-Powered-By: PHP/5.3.0
Expires: Mon, 26 Jul 1997 05:00:00 GMT
Cache-Control: no-store, no-cache, must-revalidate
Pragma: no-cache
Content-Encoding: gzip
Last-Modified: Tue, 01 Dec 2009 19:50:42 GMT
Cache-Control: post-check=0, pre-check=0
Vary: Accept-Encoding
Content-Length: 6230

Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: text/html; charset=UTF-8
.

--55192b3b-H--

Message: Warning. Pattern match "(<[[:space:]]*(script|about|applet|activex|chrome)*>.*(script|about|applet|activex|chrome)[[:space:]]*>|onmouseover=|javascript\:)" at REQUEST_URI. [file "/usr/local/http/conf/modsecurity/SMB.conf"] [line "285"]

Apache-Error: [file "/usr/local/src/apm/php-5.3.0/sapi/apache2handler/sapi_apache2.c"] [line 306] [level 3] PHP Warning: date(): It is not safe to rely on the system's timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected 'Asia/Seoul' for 'KST/9.0/no DST' instead in /usr/local/http/web/xe/modules/admin/admin.admin.view.php on line 139

Apache-Error: [file "/usr/local/src/apm/php-5.3.0/sapi/apache2handler/sapi_apache2.c"] [line 306] [level 3] PHP Warning: date(): It is not safe to rely on the system's timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected 'Asia/Seoul' for 'KST/9.0/no DST' instead in /usr/local/http/web/xe/modules/admin/admin.admin.view.php on line 140

Apache-Error: [file "/usr/local/src/apm/php-5.3.0/sapi/apache2handler/sapi_apache2.c"] [line 306] [level 3] PHP Warning: date(): It is not safe to rely on the system's timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected 'Asia/Seoul' for 'KST/9.0/no DST' instead in /usr/local/http/web/xe/modules/session/session.controller.php on line 35

Stopwatch: 1259697041358353 820653 (107 5784 820121)
Producer: ModSecurity for Apache/2.5.10 (http://www.modsecurity.org/). Server: Microsoft IIS/6.0/6.0.15
.
--55192b3b-Z--

 

위에서 화면이 보인 건 아래 세팅이 pass라서.. deny로 바꾸면 접근이 거부된다.
세션 복제해서 -->
[root@web2:~]#vi /usr/local/http/conf/modsecurity/SMB.conf

………………………………………………………………………………………………………………………………………………………………... 39 SecDefaultAction "deny,log,auditlog,phase:2,t:urlDecodeUni,t:htmlEntityDec ode,t:lowercase" ………………………………………………………………………………………………………………………………………………………………...

 

6.1 아파치 서비스 재시작
[root@web2:~]#service httpd restart

 


6.2 modsecurity Log보기

[root@web2:/usr/local/http/logs]#tail -f modsec_audit.log

--c1fbf770-H--

Message: Access denied with code 403 (phase 2). Pattern match "(<[[:space:]]*(script|about|applet|activex|chrome)*>.*(script|about|applet|activex|chrome)[[:space:]]*>|onmouseover=|javascript\:)" at REQUEST_URI. [file "/usr/local/http/conf/modsecurity/SMB.conf"] [line "285"]

Action: Intercepted (phase 2)
Stopwatch: 1259697895627675 387 (12 39 -)
Producer: ModSecurity for Apache/2.5.10 (http://www.modsecurity.org/).
Server: Microsoft IIS/6.0/6.0.15

--c1fbf770-Z—

[phpinfo 페이지 보는 거 막기]

[root@web2:~]#vi /usr/local/http/conf/modsecurity/SMB.conf ………………………………………………………………………………………………………………………………………………………………... 70 # 3. PHP 인젝션 취약 공격 방지(공개 게시판 솔루션 대상 공격 포함)
71 SecRule REQUEST_URI "/phpinfo\.php" "msg:'phpinfo grabbing Attacks'" --> 추가 삽입
72 SecRule REQUEST_URI "\.php" "chain, msg:'PHP Injection Attacks'" ………………………………………………………………………………………………………………………………………………………………...

[root@web2:~]#service httpd restart 
[root@web2:/usr/local/http/web]#echo "<?php phpinfo(); ?>" > phpinfo.php
-->
 phpinfo 페이지를 만든다. 없다면.

 

6.3 웹 테스트

 

6.4 modsecurityLog
[root@web2:/usr/local/http/logs]#tail -f modsec_audit.log

--631cc10e-F--

HTTP/1.1 403 Forbidden

Content-Length: 288

Keep-Alive: timeout=5, max=99

Connection: Keep-Alive

Content-Type: text/html; charset=iso-8859-1

 

--631cc10e-H--

Message: Access denied with code 403 (phase 2). Pattern match "/phpinfo\.php" at REQUEST_URI. [file "/usr/local/http/conf/modsecurity/SMB.conf"] [line "71"] [msg "phpinfo grabbing Attacks"]

Action: Intercepted (phase 2)

Stopwatch: 1259699391095428 4193 (1433 1619 -)

Producer: ModSecurity for Apache/2.5.10 (http://www.modsecurity.org/).

Server: Microsoft IIS/6.0/6.0.15

 

--631cc10e-Z—

 

 

7 아파치 보안 모듈2

7.1 Mod_evasive

링크

 

7.1.1 Mod_evasive 다운로드

[root@web2:/usr/local/src/apm]#wget http://www.zdziarski.com/projects/mod_evasive/mod_evasive_1.10.1.tar.gz

 

7.1.2 압축해제

[root@web2:/usr/local/src/apm]#tar xvfz mod_evasive_1.10.1.tar.gz

 

7.1.3 Mod_evasive 모듈 설치

[root@web2:/usr/local/src/apm]#cd mod_evasive

[root@web2:/usr/local/src/apm/mod_evasive]#/usr/local/http/bin/apxs -cia mod_evasive20.c

 

 

7.1.3.1 설치된 모듈 확인

[root@web2:/usr/local/src/apm/mod_evasive]#ll /usr/local/http/modules/

total 20472

drwxr-xr-x 2 root root 4096 Dec 2 05:43 .

drwxr-xr-x 16 root root 4096 Dec 1 01:01 ..

-rw-r--r-- 1 root root 8997 Dec 1 00:45 httpd.exp

-rwxr-xr-x 1 root root 19897250 Dec 2 04:38 libphp5.so

-rwxr-xr-x 1 root root 38259 Dec 2 05:43 mod_evasive20.so

-rwxr-xr-x 1 root root 915367 Dec 2 02:47 mod_security2.so

-rwxr-xr-x 1 root root 26170 Dec 2 02:33 mod_unique_id.so

 

7.1.3.2 httpd.conf mod_evasive 모듈 올라온 것 확인

[root@web2:/usr/local/src/apm/mod_evasive]#cat /usr/local/http/conf/httpd.conf |grep evasive

LoadModule evasive20_module modules/mod_evasive20.so

 

 

[root@web2:/usr/local/src/apm/mod_evasive]#cd /usr/local/http/conf

[root@web2:/usr/local/http/conf]#vi httpd.conf --> 추가 삽입 

…………………………………………………………………………………………………………………………………………………………………

63 ####### mod evasive Setting ########################

64 <IfModule mod_evasive20.c>

65 DOSHashTableSize 3097

66 DOSPageCount 5

67 DOSSiteCount 100

68 DOSPageInterval 1

69 DOSSiteInterval 1

70 DOSBlockingPeriod 10

71 </IfModule>

72 ###################################################

…………………………………………………………………………………………………………………………………………………………………

 

 

7.1.3.3 적용 전 테스트

[root@web2:/usr/local/http/conf]#cd /usr/local/src/apm/mod_evasive

[root@web2:/usr/local/src/apm/mod_evasive]#chmod 700 test.pl

[root@web2:/usr/local/src/apm/mod_evasive]#./test.pl

HTTP/1.1 200 OK

HTTP/1.1 200 OK

HTTP/1.1 200 OK

HTTP/1.1 200 OK

HTTP/1.1 200 OK

HTTP/1.1 200 OK

HTTP/1.1 200 OK

HTTP/1.1 200 OK

HTTP/1.1 200 OK

HTTP/1.1 200 OK

HTTP/1.1 200 OK

HTTP/1.1 200 OK

HTTP/1.1 200 OK

HTTP/1.1 200 OK

HTTP/1.1 200 OK

HTTP/1.1 200 OK

HTTP/1.1 200 OK

HTTP/1.1 200 OK

HTTP/1.1 200 OK

HTTP/1.1 200 OK

HTTP/1.1 200 OK

 

 

7.1.3.4 아파치 서비스 재시작

[root@web2:/usr/local/src/apm/mod_evasive]#service httpd restart 
--> mod_evasive 가 적용 되기 위해 재 시작 해준다.

 

7.1.3.5 적용 후 테스트

[root@web2:/usr/local/src/apm/mod_evasive]#./test.pl

HTTP/1.1 200 OK

HTTP/1.1 200 OK

HTTP/1.1 200 OK

HTTP/1.1 200 OK

HTTP/1.1 200 OK

HTTP/1.1 200 OK

HTTP/1.1 200 OK

HTTP/1.1 200 OK

HTTP/1.1 200 OK

HTTP/1.1 200 OK

HTTP/1.1 200 OK

HTTP/1.1 200 OK

HTTP/1.1 403 Forbidden

HTTP/1.1 403 Forbidden

HTTP/1.1 403 Forbidden

HTTP/1.1 200 OK

HTTP/1.1 403 Forbidden

HTTP/1.1 403 Forbidden

HTTP/1.1 403 Forbidden

HTTP/1.1 200 OK

HTTP/1.1 403 Forbidden

HTTP/1.1 403 Forbidden

HTTP/1.1 403 Forbidden

HTTP/1.1 200 OK

HTTP/1.1 403 Forbidden

HTTP/1.1 403 Forbidden

HTTP/1.1 403 Forbidden

HTTP/1.1 200 OK

HTTP/1.1 403 Forbidden

HTTP/1.1 403 Forbidden

HTTP/1.1 403 Forbidden

HTTP/1.1 200 OK

HTTP/1.1 403 Forbidden

HTTP/1.1 403 Forbidden

HTTP/1.1 403 Forbidden

HTTP/1.1 200 OK

-->
계속 접속 시도가 있으니 일정 단위로 끊어 준다.

[root@web2:/usr/local/src/apm/mod_evasive]#vi test.pl

…………………………………………………………………………………………………………………………………………………………………

#!/usr/bin/perl

 

# test.pl: small script to test mod_dosevasive's effectiveness

 

use IO::Socket;

use strict;

 

for(0..100) {

my($response);

my($SOCKET) = new IO::Socket::INET( Proto => "tcp",

PeerAddr=> "127.0.0.1:80");

if (! defined $SOCKET) { die $!; }

print $SOCKET "GET /?$_ HTTP/1.0\n\n";

$response = <$SOCKET>;

print $response;

close($SOCKET);

}

…………………………………………………………………………………………………………………………………………………………………
-->
위 IP주소만 바꾸면 다른 서버로 테스트(또는 공격)이 가능하다. 

 

 

 

8 SSL이용 HTTPS 보안 웹서버구축

8.1 openssl 업데이트

[root@web2:~]#rpm -qa |grep openssl

openssl-0.9.8e-7.el5

openssl-devel-0.9.8e-7.el5

 

[root@web2:~]#yum update openssl* -y

 

8.2 공개키와 개인키 만들기 (.pem은 공개키, .key는 개인키)

[root@web2:~]#mkdir /usr/local/http/conf/pki

[root@web2:~]#cd /usr/local/http/conf/pki

[root@web2:/usr/local/http/conf/pki]#openssl req -newkey rsa:2048 -nodes -out websrv.pem -keyout websrv.key

 

Country Name (2 letter code) [GB]:KR

State or Province Name (full name) [Berkshire]:SEOUL

Locality Name (eg, city) [Newbury]:SEOUL

Organization Name (eg, company) [My Company Ltd]:sec

Organizational Unit Name (eg, section) []:Security

Common Name (eg, your name or your server's hostname) []:www.sec.iss

Email Address []:chojh@sec.iss

 

Please enter the following 'extra' attributes

to be sent with your certificate request

A challenge password []:

An optional company name []:

 

8.2.1 키 생성된 것 확인

[root@web2:/usr/local/http/conf/pki]#ls -l

total 16

-rw-r--r-- 1 root root 1679 Dec 2 08:02 websrv.key -->  유출되면 안 됨. 

-rw-r--r-- 1 root root 1041 Dec 2 08:02 websrv.pem

 

8.3 root CA 만들기(최상위 인증기관)

[root@web2:/usr/local/http/conf/pki]#openssl genrsa -des3 -out ca.key 2048

Enter pass phrase for ca.key: 패스워드 입력

Verifying - Enter pass phrase for ca.key: 패스워드 입력

 

8.3.1 생성된 ca.key 확인

[root@web2:/usr/local/http/conf/pki]#ls -l

total 24

-rw-r--r-- 1 root root 1751 Dec 2 08:05 ca.key

-rw-r--r-- 1 root root 1679 Dec 2 08:02 websrv.key

-rw-r--r-- 1 root root 1041 Dec 2 08:02 websrv.pem

 

8.3.2 ca.key와 websrv.key를 root만 읽을 수 있도록 권한 설정

[root@web2:/usr/local/http/conf/pki]#chmod 600 ca.key

[root@web2:/usr/local/http/conf/pki]#chmod 600 websrv.key

 

8.4 root 인증서 만들기

[root@web2:/usr/local/http/conf/pki]#openssl req -new -x509 -days 365 -key ca.key -out ca.crt

Enter pass phrase for ca.key:

You are about to be asked to enter information that will be incorporated

into your certificate request.

What you are about to enter is what is called a Distinguished Name or a DN.

There are quite a few fields but you can leave some blank

For some fields there will be a default value,

If you enter '.', the field will be left blank.

-----

Country Name (2 letter code) [GB]:KR

State or Province Name (full name) [Berkshire]:SEOUL

Locality Name (eg, city) [Newbury]:SEOUL

Organization Name (eg, company) [My Company Ltd]:sec

Organizational Unit Name (eg, section) []:Security

Common Name (eg, your name or your server's hostname) []:www.sec.iss

Email Address []:chojh@sec.iss

 

8.4.1 생성한 root 인증서 확인

[root@web2:/usr/local/http/conf/pki]#ls -l

total 32

-rw-r--r-- 1 root root 1578 Dec 2 08:11 ca.crt

-rw------- 1 root root 1751 Dec 2 08:05 ca.key

-rw------- 1 root root 1679 Dec 2 08:02 websrv.key

-rw-r--r-- 1 root root 1041 Dec 2 08:02 websrv.pem

 

 

8.4.2 인증서 인증받기

[root@web2:/usr/local/http/conf/pki]#openssl x509 -req -CA ca.crt -CAkey ca.key -in websrv.pem -out sign-websrv.pem -CAcreateserial

Signature ok

subject=/C=KR/ST=SEOUL/L=SEOUL/O=sec/OU=Security/CN=www.sec.iss/emailAddress=chojh@sec.iss

Getting CA Private Key

Enter pass phrase for ca.key:

 

[확인]

[root@web2:/usr/local/http/conf/pki]#ls -l

total 48

-rw-r--r-- 1 root root 1578 Dec 2 08:11 ca.crt

-rw------- 1 root root 1751 Dec 2 08:05 ca.key

-rw-r--r-- 1 root root 17 Dec 2 08:13 ca.srl

-rw-r--r-- 1 root root 1269 Dec 2 08:13 sign-websrv.pem

-rw------- 1 root root 1679 Dec 2 08:02 websrv.key

-rw-r--r-- 1 root root 1041 Dec 2 08:02 websrv.pem

 

8.5 httpd.conf 에 ssl 모듈 확인

[root@web2:/usr/local/http/conf]#cat httpd.conf |grep ssl

#Include conf/extra/httpd-ssl.conf

# but a statically compiled-in mod_ssl.

<IfModule ssl_module>

 

없다. (있으면 넘어간다.)

ssl 모듈 설치 해준다.

만약 아파치를 동적 모듈로 설치하지 않았다면(컴파일시 옵션: "--enable-so")

아파치 재 컴파일해야 한다.

 

8.5.1 ssl_module설치하기

[root@web2:/usr/local/src/apm/httpd-2.2.14]#cd modules/ssl/

[root@web2:/usr/local/src/apm/httpd-2.2.14/modules/ssl]#/usr/local/http/bin/apxs -cia ./mod_ssl.c

 

8.5.3 확인

[root@web2:/usr/local/http/conf]#cat httpd.conf |grep mod_ssl.so

LoadModule ssl_module modules/mod_ssl.so

 

 

8.5.4 httpd.conf 수정

[root@web2:/usr/local/http/conf]#vi httpd.conf

………………………………………………………………………………………………………………………………………………………………….

446 # Secure (SSL/TLS) connections

447 Include conf/extra/httpd-ssl.conf --> 주석 제거

………………………………………………………………………………………………………………………………………………………………….

 

8.5.5 extra/httpd-ssl.conf 수정

[root@web2:/usr/local/http/conf]#cd extra/

[root@web2:/usr/local/http/conf/extra]#vi httpd-ssl.conf

………………………………………………………………………………………………………………………………………………………………….

74 <VirtualHost _default_:443>

75

76 # General setup for the virtual host

77 DocumentRoot "/usr/local/http/web"

78 ServerName www.sec.iss:443

79 ServerAdmin chojh@sec.iss

80 ErrorLog "/weblogs/https_error_log"

81 TransferLog "/weblogs/https_access_log"

82

 

85 SSLEngine on --> 확인 

 

99 SSLCertificateFile "/usr/local/http/conf/pki/sign-websrv.pem" --> 경로 수정 

100 #SSLCertificateFile "/usr/local/http/conf/server-dsa.crt"

 

107 SSLCertificateKeyFile "/usr/local/http/conf/pki/websrv.key" --> 경로 수정

108 #SSLCertificateKeyFile "/usr/local/http/conf/server-dsa.key"

 

127 SSLCACertificateFile "/usr/local/http/conf/pki/ca.crt" --> 경로 수정

………………………………………………………………………………………………………………………………………………………………….

[root@web2:/usr/local/http/conf]#service httpd restart

 

 

 

 

 

 

 

8.5.6 테스트

[root@web2:/usr/local/http/conf]#iptables –F

 

 

9 제로보드 재 설치 후 SSL적용

[root@web2:/usr/local/http/web]#rm -rf xe

[root@web2:/usr/local/http/web]#ls

index.html phpinfo.php test.html xe.1.3.0.tgz

[root@web2:/usr/local/http/web]#tar xvfz xe.1.3.0.tgz

 

[root@web2:/usr/local/http/web]#chown -R webuser.webuser xe/

 

제로보드 설치는 위를 참조 링크

"settings" 클릭


 

<End>