2009. 1. 8. 14:59

아파치 모듈 DoS 공격 대비 (mod_evasive)

* 공식 홈페이지 : http://www.nuclearelephant.com/projects/dosevasive/

* 설치

특정 URL이나 IP일 경우나 특정한 브라우저를 이용하여 DoS(Denial of Service, 서비스거부)
공격이 들어온다면 httpd.conf 에서 SetEnvIf, SetEnvIfNoCase 등과 Allow, Deny 설정으로
간단히 막을 수 있다.

그러나 일정한 유형이 없다면 Apache용 mod_dosevasive 모듈로 DoS 공격을 막을 수 있다..

1) mod_dosevasive.1.8.tar.gz 파일을 다운받아서 업로드한후 압축을푼다.
    /usr/local/src/mod_dosevasive.1.8.tar.gz에 파일이존재한다고 가정하고
 
#tar xvfz mod_dosevasive.1.8.tar.gz
#cd /usr/local/src/mod_dosevasive/
#ll
---------------------------------------------------------------------------
-rw-r--r--  1 mysql mysql 18103  8¿ù 31  2003 LICENSE
-rw-r--r--  1 mysql mysql   476  8¿ù 31  2003 Makefile.tmpl
-rw-r--r--  1 mysql mysql 11267  9¿ù  2  2003 README
-rw-r--r--  1 mysql mysql 19306  9¿ù  2  2003 mod_dosevasive.c    ==> 아파치 1.3.x 버전용
-rw-r--r--  1 mysql mysql 17777  9¿ù  2  2003
mod_dosevasive20.c  ==> 아파치 2.x 버전용
-rw-r--r--  1 root  root  61369 12¿ù 13  2005 mod_dosevasive20.so
-rw-r--r--  1 mysql mysql   406  8¿ù 31  2003 test.pl
--------------------------------------------------------------------------
#/usr/local/apache2/bin/apachectl stop                     ===> 아파치 정지
#/usr/local/apache2/bin/apxs -cia /usr/local/src/mod_dosevasive/mod_dosevasive20.c
 
모듈 설치가 끝나면 아파치에 httpd.conf 파일안에 아래 내용이 추가된다. 그럼 설치완료.
---------------------------------------------------------------------------------------
LoadModule dosevasive20_module modules/mod_dosevasive20.so     ==> 아파치 1.3.x 버전용
                           -----------------------------------
LoadModule dosevasive_module libexec/mod_dosevasive.so           ==> 아파치 2.x 버전용
...
AddModule mod_dosevasive.c
----------------------------------------------------------------------------

2) httpd.conf에는 다음과 같이 설정을 추가한다.
----------------------------------------------
<IfModule mod_dosevasive20.c>     ===>  아파치 2.x 버전용, 아파치 1.3.x 버전용 IfModule mod_dosevasive.c
  DOSHashTableSize  3097    ==> 접속을 받아들임 정상 접속인지 계산을위한 공간 접속이 많은 사이트는 늘린다.
  DOSPageCount    2   
      DOSPageInterval   1           ==> 지정한 시간(1)동안 같은페이지를 (2번)요청할 경우 403에러.    

  DOSSiteCount    50      ==> 지정한 시간(1)동안 총히트수(html,이미지포함)가 총 (50)을 초과할경우 403에러.    
  DOSSiteInterval   1                  이미지가 많은 사이트는 적절히 조절이 필요함.

  DOSBlockingPeriod  10     ==>서비스 거부공격등으로 필터링된 ip는 이후 (10)초동안 접속이 중지되어 403에러.
                                                   (10)초안에 재접속 하면 다시 (10)초로 리셋됨.
 
      DOSEmailNotify       nforce@nforce6.com           ==>앞에서 지정한 값을 초과할 경우 차단된 ip를 이메일로 통보.
</IfModule>
---------------------------------------------- 
 
#/usr/local/apache2/bin/apachectl stop                     ===> 아파치 재시작
 
3) 실행확인.
로그파일은 기본적으로 /tmp/dos-211.xxx.xxx.xxx 이런 dos-아이피 이름으로 저장된다.
테스트 할려면 웹페이지를 오픈하고 [F5]를 오지게 한번 눌러보자.그럼.. Forbidden 403에러가 웹에 뜨면서
/tmp/폴더에 위에 형식의 파일이름이 생긴다.  

* 아파치 httpd.conf  사용 예)

<IfModule mod_dosevasive.c>
    DOSHashTableSize    3097 
    DOSPageCount          2
    DOSPageInterval        1

    DOSSiteCount            50
    DOSSiteInterval          1
    DOSBlockingPeriod    10
</IfModule>

- DOSHashTableSize : 클라이언트의 요청을 해석하기 위한 테이블 공간. 크면 클수록 메모리를 많이 잡아먹지만, 해석이 빠르겠죠.
- DOSPageCount : 같은 페이지를 DOSPageInterval (단위 : 초) 동안 DOSPageCount 만큼 요청하면 블럭시킴.
- DOSPageInterval : (위 지시자와 함께 사용)
- DOSSiteCount : 같은 웹사이트에 DOSSiteInterval (단위 : 초) 동안 DOSSiteCount 만큼 요청이 있으면 블럭시킴.
                       : css, js, gif, jpg, png 등 읽혀지는 모든 파일이 Count 됨.
- DOSSiteInterval : (위 지시자와 함께 사용)
- DOSBlockingPeriod : 블럭당한 클라이언트를 접속 거부할 시간. (단위 : 초)

블럭당하게 되면 403 (Forbidden) 에러가 납니다.

* 참고 URL

http://megaz.arbuz.com/archives/2004/08/02/apache-performance/

http://www.theserverpages.com/20303/22/



mod_evasive를 이용한 웹Dos 공격을 막자.

공식 홈페이지 : http://www.zdziarski.com/projects/mod_evasive/ 

1. mod_evasive이란 무엇인가?

   이것은 HTTP Dos 또는 DDos 스택 또는 저돌적인 공격으로부터 아파치를 보호하는데 있습니다.
   이것은 ipchains, 방화벽, 라우터등으로 쉽게 구성될 수 있도록 디자인 되었습니다.

   탐지는 주소, URI의 IP 내부 동적 해쉬테이블을 생성함으로 수행되고, 각 아이피별로 거부됩니다.
   - 초당 몇번 이상의 같은 페이지를 요청하는 경우
   - 초당 같은 자식노드를 동시에 50번 이상 생성하는 경우
   - 일시적으로 블러킹되는 동안 어떠한 요청을 생성하는 경우

2.  mod_evasive의 설치

# wget http://www.zdziarski.com/projects/mod_evasive/mod_evasive_1.10.1.tar.gz

# 압축해제
# tar xvzf mod_evasive_1.10.1.tar.gz

# 디렉토리 이동
# cd mod_evasive

# 모듈 추가
# /usr/local/apache/bin/apxs -iac mod_evasive.c -> Apache.1.x
# /usr/local/apache/bin/apxs -iac mod_evasive20.c -> Apache.2.x

# 환경설정
# vi /usr/local/apache/conf/httpd.conf

# 아파치 1.X와 2.X에서의 모듈명칭이 약간 차이가 있으므로 주의할 것!
# 아래에 해당하는 내용이 존재하는지 확인 한다. 없으면 추가.
LoadModule evasive_module    modules/mod_evasive.so -> Apache.1.x
LoadModule evasive20_module    modules/mod_evasive20.so -> Apache.2.x

<IfModule mod_evasive.c>
        DOSHashTableSize        3097
        DOSPageCount              3
        DOSSiteCount                50
        DOSPageInterval            1
        DOSSiteInterval              1
        DOSBlockingPeriod        30

        DOSEmailNotify            webmaster@yoursite.com
        DOSLogDir                   "/usr/local/apache/logs/mod_evasive.log"
        DOSSystemCommand      "su - someuser -c '/sbin/... %s ...'"
</IfModule>

# 환경설정 검사
# apachectl configtest
# 재시작
# apachectl -k restart


3. 각 지시자에 대한 설명

- DOSHashTableSize 
    각 자식 해쉬테이블 마다 탑레벨 노드의 수를 지정한다.
    수치가 높으면 높을수록 더 많은 퍼포먼스가 나타나지만 테이블스페이스에 메모리를 남기게 된다
    접속량이 많으면 이 수치를 높혀도 된다.
   
- DOSPageCount
    이것은 같은 페이지 또는 URI, 인터벌당 요청수에 대한 카운트 수이다.
    지정된 값이 초과되면 클라이언트에 대한 IP 정보가 블러킹리스트에 추가된다.

- DOSSiteCount
    지정된 시간동안 같은 페이지를 지정된 수 보다 초과될경우 IP 정보가 블러킹리스트에 추가된다.

- DOSPageInterval
    페이지 카운트 시발점, 디폴트는 1초이다.

- DOSSiteInterval
    사이트 카운트 시발점, 디폴트는 역시 1초이다.

- DOSBlockingPeriod
    클라이언트가 블랙리스트에 추가되어 블러킹되는 총 시간.
    이때 클라이언트는 403 (Forbidden) 에러를 출력하게 된다.

- DOSEmailNotify
    이 값이 지정되면, IP가 블러킹될때마다 지정된 이메일로 발동된다.
주의 : 메일러는 mod_dosevasive.c 에 정확하게 지정되야 한다. 디폴트는 "/bin/mail -t %s" 이다.

- DOSLogDir
   로그 파일 경로

- DOSSystemCommand
    이 값이 지정되면, 시스템은 아이피가 블러킹될때마다 명령행을 실행한다.

- DOSWhitelist
   차단에서 제외될 호스트

   DOSWhitelist    127.0.0.1
   DOSWhitelist    127.0.0.* - (와일드카드는(*) 필요하다면 최대 8진수(xxx.*.*.*)까지 사용할 수 있다.)



4. 테스트하기
# perl test.pl <- 다운받은 파일 안에 포함되어 있다.
   HTTP/1.1 200 OK
   HTTP/1.1 403 Forbidden
   HTTP/1.1 200 OK
   HTTP/1.1 403 Forbidden
   HTTP/1.1 403 Forbidden


Below are tools that I use everyday that help me out a great deal. Feel free to check each of them out as well as their homepages. I have built these RPM/SRPM's with the approval of the authors.

multitail 2.9.1:
http://www.vanheusden.com/multitail/
RPM: multitail-2.9.1-0.i386.rpm SRPM: multitail-2.9.1-0.src.rpm

DNS Flood Detector 1.08: http://www.adotout.com/dnsflood.html
RPM: dnsflood-1.08-1.i386.rpm SRPM: dnsflood-1.08-1.src.rpm

mod_dosevasive 1.8: http://www.nuclearelephant.com/projects/dosevasive/
RPM: mod_dosevasive-1.8-1.i386.rpm SRPM: mod_dosevasive-1.8-1.src.rpm

iftop 0.16: http://www.ex-parrot.com/~pdw/iftop/
RPM: iftop-0.16-0.i386.rpm SRPM: iftop-0.16-0.src.rpm


DoS 공격도 문제지만, 무분별한 로봇들이나 사용자들도 문제이다. 짧은 시간 간격 사이에 많은 요청을 보내와 시스템 리소스를 잡아먹고 결국에는 홈페이지 로딩을 느려지게 만든다.

이런 문제는 apache2.x 상에 mod_evasive 모듈을 올려서 어느 정도 해결할 수 있다. 물론 웹 서비스를 국내에 한정시킬 수도 있다면, iptables 등을 이용해서 원천적으로 막아버리는 것이 속 편한 방법일 것이다.

현재 데비안에서는 apache2.x 버전에 대한 mod_evasive 패키지가 없는 것으로 알고 있다. 그래서 apache2.x 버전을 사용하는 경우에는 소스를 받아 직접 컴파일할 수 밖에 없다.

mod_evasive 모듈의 소스는 제작자 홈페이지에서 다운로드할 수 있다. 현 시점에서 안정 버전은 1.10.1 이다.

소스를 받아 압축을 푼 후에 모듈 컴파일을 해준다. 아파치 모듈 컴파일을 위해서는 apxs가 필요한데, 데비안의 경우 apache2-prefork-dev 패키지를 설치하면 된다.

# tar xvfz mod_evasive_1.10.1.tar.gz
# cd mod_evasive
# apxs2 -iac mod_evasive20.c
/usr/share/apr-1.0/build/libtool --silent --mode=compile --tag=disable-static x86_64-linux-gnu-gcc -prefer-pic -DLINUX=2 -D_GNU_SOURCE -D_REENTRANT -I/usr/include/apr-1.0 -I/usr/include/openssl -I/usr/include/postgresql -I/usr/include/xmltok -pthread     -I/usr/include/apache2  -I/usr/include/apr-1.0   -I/usr/include/apr-1.0 -I/usr/include/postgresql  -c -o mod_evasive20.lo mod_evasive20.c && touch mod_evasive20.slo
/usr/share/apr-1.0/build/libtool --silent --mode=link --tag=disable-static x86_64-linux-gnu-gcc -o mod_evasive20.la  -rpath /usr/lib/apache2/modules -module -avoid-version    mod_evasive20.lo
/usr/share/apache2/build/instdso.sh SH_LIBTOOL='/usr/share/apr-1.0/build/libtool' mod_evasive20.la /usr/lib/apache2/modules
/usr/share/apr-1.0/build/libtool --mode=install cp mod_evasive20.la /usr/lib/apache2/modules/
cp .libs/mod_evasive20.so /usr/lib/apache2/modules/mod_evasive20.so
cp .libs/mod_evasive20.lai /usr/lib/apache2/modules/mod_evasive20.la
PATH="$PATH:/sbin" ldconfig -n /usr/lib/apache2/modules
----------------------------------------------------------------------
Libraries have been installed in:
   /usr/lib/apache2/modules

If you ever happen to want to link against installed libraries
in a given directory, LIBDIR, you must either use libtool, and
specify the full pathname of the library, or use the `-LLIBDIR'
flag during linking and do at least one of the following:
   - add LIBDIR to the `LD_LIBRARY_PATH' environment variable
     during execution
   - add LIBDIR to the `LD_RUN_PATH' environment variable
     during linking
   - use the `-Wl,--rpath -Wl,LIBDIR' linker flag
   - have your system administrator add LIBDIR to `/etc/ld.so.conf'

See any operating system documentation about shared libraries for
more information, such as the ld(1) and ld.so(8) manual pages.
----------------------------------------------------------------------
chmod 644 /usr/lib/apache2/modules/mod_evasive20.so
apxs:Error: Activation failed for custom /etc/apache2/httpd.conf file..
apxs:Error: At least one `LoadModule' directive already has to exist..

한가지 주의할 것은 apache2.x 버전에 대해서는 mod_evasive20.c 파일을 컴파일 해야 한다는 것이다.

컴파일이 성공적으로 마친 후에는 아파치 설정 파일을 수정할려고 하는데, 데비안에서는 아파치 설정 파일이 /etc/apache2/apache.conf 로 되어 있기 때문에 에러가 난다. 그래서, 설정 파일은 직접 만들어줘야 한다.

설정 파일을 만들 때, /etc/apache2/apache.conf 에 저장할 수도 있겠지만, mods-avaiable 디렉토리에 개별 파일로 만들어두는 것이 더 유용할 것이다. 이때 만들어줘야 하는 파일은 설정 파일과 로드 파일 2개이다.

# file /etc/apache2/mods-available/evasive20.load
LoadModule evasive20_module /usr/lib/apache2/modules/mod_evasive20.so

# file /etc/apache2/mods-available/evasive20.conf
<IfModule mod_evasive20.c>
    DOSHashTableSize    3097
    DOSPageCount        3
    DOSPageInterval     1
    DOSSiteCount        50
    DOSSiteInterval     10
    DOSBlockingPeriod   7200
</IfModule>

위 설정 파일에서
  • DOSHashTableSize - 해쉬 테이블의 크기
  • DOSPageCount - 접속 차단할 연속적인 동일 페이지 요청
  • DOSPageInterval - 동일 페이지 요청을 계산할 시간 간격 (단위: 초)
  • DOSSiteCount - 접속 차단할 연속적인 사이트 접속 요청
  • DOSSiteInterval - 사이트 접속 요청을 계산할 시간 간격 (단위: 초)
  • DOSBlockingPeriod - 접속 차단할 시간 간격 (단위: 초)

즉, DOSPageInterval 초 이내에 DOSPageCount 회 이상의 동일 페이지 접속 요청이 있거나 DOSSiteInterval 초 이내에 DOSSiteCount 회 이상의 사이트 접속 요청이 있다면 DoS 공격으로 간주하고 DOSBlockingPeriod 초 동안 접속을 차단한다는 말이다.

이외 설정으로
  • DOSEmailNotify - 접속 차단에 대한 결과를 보낼 이메일 주소
  • DOSLogDir - 로그 파일 경로
  • DOSWhitelist - 접속 차단에서 제외할 주소

이렇게 2개의 파일은 만든 후에 mods-enabled 디렉토리 내에 소프트 링크를 걸어주자.

# ln -s ../mods-available/evasive20.load ./
# ln -s ../mods-available/evasive20.conf ./
# /etc/init.d/apache2 restart

설정 파일을 제대로 설정하고 나서, 아파치를 재기동하면 이제부터 DoS 공격과 무분별한 접속에서 어느 정도 벗어날 수 있을 것이다.

이제 나중에 로그 파일을 보면 이런 내용을 볼 수 있다.

Jan 21 12:08:52 server mod_evasive[6126]: Blacklisting address 121.157.xxx.92: possible DoS attack.
Jan 21 12:08:59 server mod_evasive[5874]: Blacklisting address 61.42.xxx.66: possible DoS attack.


Trackback 0 Comment 1
  1. Favicon of http://aerosmith.tistory.com AeroSmith™ 2012.07.04 14:05 address edit & del reply

    좋은 글을 공개해주셔서 고맙습니다. 제 블로그에 담아가겠습니다.