강좌
클라우드/리눅스에 관한 강좌입니다.
보안 분류

아파치웹서버보안 #6: 아파치 보안모듈 mod_dosevasive 설정

작성자 정보

  • 구돌 작성
  • 작성일

컨텐츠 정보

본문

mod_dosevasive 설정

 

mod_security와 더불어 mod_dosevasive 모듈을 이용할 수 있는데, 이는 HTTP를 이용한 서비스거부 공격 또는 Brute force 공격을 탐지하고 차단하는 기능을 제공한다.

 

이를테면

 

일정시간에 같은 페이지를 연속적으로 요청하거나

일정 시간에 전체 히트수가 일정수치 이상일 경우

 

공격이라 판단하고 차단하는 기능을 제공한다.

 

차단 후에는 관련 정보를 로그에 남기거나 관리자에게 메일로 통보를 하도록 할 수 있는데, 짧은 시간에 연속적으로 많은 접속을 시도하는 사이버 시위 등을 차단하는데 효과적일 것이다.

 

. 이 기능을 이용하려면 다음과 같은 지시자를 설정하면 된다.

 

 

<IfModule mod_dosevasive.c>

DOSHashTableSize 3097

DOSPageCount 2

DOSSiteCount 50

DOSPageInterval 1

DOSSiteInterval 1

DOSBlockingPeriod 10

DOSEmailNotify master@server.com

</IfModule>

 

위 설정 지시자들에 대하여 간단히 설명하면 다음과 같다.

 

DOSHashTableSize 3097

 

클라이언트의 접속을 받아들이고 정상적인 접속인지 여부를 계산하기 위한 테이블로서 접속이 많은 사이트에서는 이 값을 크게 늘려주면 된다.

 

그러나 너무 크게 늘려주었을 경우에는 많은 메모리를 소모하게 되므로 각자의 상황에 맞게 적당한 값을 입력하면 된 다.

 

DOSPageCount 2

DOSPageInterval 1

 

지정한 시간(DOSPageInterval)동안 같은 페이지를 2(DOSPageCount ) 요청하였을 경우 해당 클라이언트에게 403 에러로 응답한다.

 

 

 

DOSSiteCount 50

DOSSiteInterval 1

 

지정한 시간(DOSSiteInterval)동안 총 히트수(HTML과 이미지를 포함한 모든 요청)50을 초과할 경우 해당 클라이언트에게 403 에러로 응답한다.

 

이미지가 많은 사이트의 경우 이 값을 적당히 조절하여야 한다.

 

 

 

DOSBlockingPeriod 10

 

서비스거부 공격등으로 필터링된 ip는 이후 10(DOSBlockingPeriod)동안 접속이 중

지 되어 접속 시도시 403 에러가 나며 10초안에 재접속을 하면 수치는 10초로 다시 reset된다.

 

 

 

DOSEmailNotify master@server.com

 

만약 앞에서 지정한 값을 초과하여 차단된 ip가 있을 경우 해당 정보가 지정한 관리 자인 master@server.com에게 통보된다.

 

소스 파일에서는 메일 발송시 “"/bin/mail -t %s"”와 같이 되어 있는데, 리눅스에서는 “-t %s“부분을 삭제하여야 메일 발송 기 능을 이용할 수 있다.

 

.

아울러 공격을 당하였을 경우 syslog에 다음과 같은 로그가 남기도 한다.

 

 

Sep 29 15:32:33 server mod_dosevasive[6888]: Blacklisting address 211.47.xx.xx: possible DoS attack.

 

db65df2e51e6fbf0db717e7c616c97f2_1655798358_0362.png
 

[그림] 공격을 받았을 때 서버의 403 응답화면

 

실제 적용이 되는지 여부는 소스와 함께 제공하는 test.pl을 아래와 같이 실행해 보면 일정접속 이후부터는 200 OK 대신 403 Forbidden 에러가 나는 것을 알 수 있다.

 

.

 

# ./test.pl

000.HTTP/1.1 200 OK

001.HTTP/1.1 200 OK

002.HTTP/1.1 200 OK

003.HTTP/1.1 200 OK

004.HTTP/1.1 200 OK

005.HTTP/1.1 200 OK

006.HTTP/1.1 200 OK

007.HTTP/1.1 200 OK

008.HTTP/1.1 200 OK

009.HTTP/1.1 403 Forbidden

010.HTTP/1.1 403 Forbidden

011.HTTP/1.1 403 Forbidden

012.HTTP/1.1 403 Forbidden

013.HTTP/1.1 403 Forbidden

 

그러나 이보다는 iptables에서 제공하는 기능을 활용하면 한 ip에서 과도한 접속을 간단하게 차단할 수 있는데 이를테면 아래의 경우 한 ip에서 동시에 30개의 connection을 초과할 경우 초과한 connection은 커널 레벨에서 차단하게 된다.

 

 

iptables -A INPUT -p tcp --dport 80 -m connlimit --connlimit-above 30 -j DROP

 

또는 다음과 같은 설정도 가능한데 아래의 경우 동시에 30개의 connection을 초과할 경우 해당 ipdynamic하게 5분동안(300)만 차단하게 된다.

 

차단되는 정보는 실시간으로

# cat /proc/net/ipt_recent/badguy을 보면 확인 가능하다.

 

 

iptables -A INPUT -m recent --name badguy --rcheck --seconds 300 -j DROP

iptables -A INPUT -p tcp --dport 80 -m connlimit --connlimit-above 30 -m recent --name badguy --set -j DROP

iptables -A INPUT -p tcp --dport 80 -m connlimit --connlimit-above 30 -j DROP

 

관련자료

댓글 0
등록된 댓글이 없습니다.

공지사항


뉴스광장


  • 전체 회원수 59,444 명
  • 전체 게시물 30,916 개
  • 전체 댓글수 11,873 개