Linux WEB

ModSecurity 설치 해보기

2008.09.11 01:04

sylee 조회 수:37908

[ModSecurity 설치]

- ModSecurity 프로그램 다운로드

설치하고자 하는 안정화 버전인 1.9.2는 다음 사이트에서 다운로드 받을 수 있다.
http://www.modsecurity.org/download/modsecurity-apache-1.9.2.tar.gz

다운로드 받은 후 다음의 명령으로 압축 및 패키징을 해제한다.
# cd /usr/local/src/
# wget http://www.modsecurity.org/download/modsecurity-apache-1.9.2.tar.gz
# tar xvfz modsecurity-apache-1.9.2.tar.gz
# cd modsecurity-apache-1.9.2

여기서는 DSO 방식으로 설치를 한다.

DSO 방식은 아파치 웹서버의 재설치 과정없이 기존에 운영되고 있는 아파치 웹서버에 모듈을
동적으로 추가하는 방식이므로 기존에 아파치 웹서버를 이미 운영 중인 경우 DSO 방식을
선택하는 것을 권장한다.
DSO 방식으로 설치하는 것은 아파치 버전에 상관없이 다음과 같이 설치 할 수 있다.

(1) apxs를 이용하여 ModSecurity 모듈을 컴파일 및 설치하고, 설정을 자동으로 변경한다.

  # cd /usr/local/src/modsecurity-apache-1.9.2
  # /usr/local/apache2/bin/apxs -cia apache2/mod_security.c

  위의 명령은 mod_security.c를 컴파일 하고, 공유객체를 웹서버 modules 디렉토리에
  설치하고, 아파치 httpd.conf 설정파일에 적절한 LoadModule 줄을 추가한다.

  참고로 apxs는 아파치 웹서버의 확장모듈을 컴파일하고 설치하는 도구로써, 여러 소스와 오브
  젝트파일을 LoadModule 지시어로 실행 중인 아파치 서버로 읽어 들일 수 있는 동적공유객체(DSO)를 만든다.
  위의 결과로 modules 디렉토리에 mod_security.so가 생성되고 httpd.conf 파일에
  LoadModule security_module modules/mod_security.so  라인이 추가된다.

(2) 위의 과정으로 모듈이 정상적으로 설치되었는지 확인한다.
  [root:/usr/local/apache2]# ls -al modules
  -rwxr-xr-x    1 root     root       308333 Jul 19 11:28 mod_security.so


(3) 아파치 웹서버를 재구동한다.
  # /usr/local/apache2/bin/apachectl stop
  # /usr/local/apache2/bin/apachectl start


만약 /usr/local/apache2/conf/modsecurity.conf 라는 이름으로 ModSecurity 웹방화벽을 위한 환경
설정 파일을 별도로 만들었을 경우 httpd.conf 파일에 다음과 같이 이 파일을 포함시켜 줄 수 있다.

Include conf/modsecurity.conf


ModSecurity는 다양한 기능의 설정을 위해서 상당히 많은 지시자들이 존재하는데 이를 일일이 직접
 작성하여 적용하기는 쉽지 않을 것이다.
따라서 아래 ModSecurity 홈페이지에서 제공하는 Ruletemplate을 자신의 웹 환경에 맞게 커스트마이징 하는 것이
 보다 용이할 것이다.
http://www.modsecurity.org/projects/rules/index.html

이 사이트에는 기본적인 Rule과 함께 PHP 환경, 출력 필터 등 몇 가지 Rule template가 있으므로
이들을 참고해 보자.
 또는 본 고의 부록에 기본적인 Apache+PHP+MySQL 환경에 적합한 Rule 예를
제시하고 있으므로 이를 참고해 보기 바란다.
그리고 www.krcert.or.kr 사이트에서 웹방화벽 부분을 참고 바랍니다.


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 #####
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$)"

번호 제목 글쓴이 날짜 조회 수
43 PHP 업로드 파일 용량 제한 설정 호스트웨이 2012.07.06 10044
42 [Apache] Image 관련 Log 남기지 않기 호스트웨이 2012.07.13 9705
41 PHP 컴파일시 /usr/bin/ld: cannot find -lltdl 오류 호스트웨이 2012.07.13 12562
40 PHP 사용 시 특정함수 사용제한 하는 방법 호스트웨이 2012.08.03 11514
39 CentOS 6.3 에 apache, php, mysql, phpmyAdmin(LAMP) 설치하기 #1 호스트웨이 2012.08.07 17343
38 CentOS 6.3 에 apache, php, mysql, phpmyadmin(LAMP) 설치하기 #2 호스트웨이 2012.08.07 14204
37 nginx - redirect 설정 호스트웨이 2012.08.24 17883
36 Nginx 설치 호스트웨이 2012.08.31 14900
35 Apache Max Client 값 수정 호스트웨이 2012.08.31 19644
34 SSL 패스워드 삭제 하기 호스트웨이 2012.09.05 20692
33 apache internal dummy connection 로그 생성 방지하기 호스트웨이 2012.09.06 18706
32 아파치 실행시 libphp5.so 에러 호스트웨이 2012.09.14 13525
31 httpd-2.4 설치하기 호스트웨이 2012.09.27 14436
30 failed to open stream: Too many open files in 에러메시지 출력 시 해결방법 호스트웨이 2012.10.03 7628
29 apache 구동시 "파일 크기 제한을 초과함 $HTTPD -DSSL" 에러메시지 출력에 대한 해결방법 호스트웨이 2012.10.11 9408
28 Apache 재시작시 세션 끊어짐 현상 호스트웨이 2012.10.12 12767
27 [php] 세션 유지시간 설정하기 호스트웨이 2012.10.25 17807
26 CentOS6 64bit openssl 설치시 에러 조치사항 호스트웨이 2012.11.02 7610
25 Symbolic link not allowed or link target not accessible 에러 발생 시 호스트웨이 2012.11.16 10571
24 Ubuntu 아파치 웹서버에서 index.php 다운로드 창이 뜰 경우 호스트웨이 2012.12.13 8256