* 공식 홈페이지 : http://www.nuclearelephant.com/projects/dosevasive/
* 설치
공격이 들어온다면 httpd.conf 에서 SetEnvIf, SetEnvIfNoCase 등과 Allow, Deny 설정으로
간단히 막을 수 있다.
-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
AddModule mod_dosevasive.c
2) httpd.conf에는 다음과 같이 설정을 추가한다.
----------------------------------------------
<IfModule mod_dosevasive20.c> ===> 아파치 2.x 버전용, 아파치 1.3.x 버전용 IfModule mod_dosevasive.c
DOSSiteCount 50 ==> 지정한 시간(1)동안 총히트수(html,이미지포함)가 총 (50)을 초과할경우 403에러.
DOSSiteInterval 1 이미지가 많은 사이트는 적절히 조절이 필요함.
DOSBlockingPeriod 10 ==>서비스 거부공격등으로 필터링된 ip는 이후 (10)초동안 접속이 중지되어 403에러.
----------------------------------------------
* 아파치 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. 각 지시자에 대한 설명
각 자식 해쉬테이블 마다 탑레벨 노드의 수를 지정한다.
수치가 높으면 높을수록 더 많은 퍼포먼스가 나타나지만 테이블스페이스에 메모리를 남기게 된다
접속량이 많으면 이 수치를 높혀도 된다.
- 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. 테스트하기
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 패키지를 설치하면 된다.
# 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개이다.
LoadModule evasive20_module /usr/lib/apache2/modules/mod_evasive20.so
<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.conf ./
# /etc/init.d/apache2 restart
설정 파일을 제대로 설정하고 나서, 아파치를 재기동하면 이제부터 DoS 공격과 무분별한 접속에서 어느 정도 벗어날 수 있을 것이다.
이제 나중에 로그 파일을 보면 이런 내용을 볼 수 있다.
Jan 21 12:08:59 server mod_evasive[5874]: Blacklisting address 61.42.xxx.66: possible DoS attack.
댓글