[Apache] mod_evasive로 DDOS 차단 하기
INFRA/Middleware

[Apache] mod_evasive로 DDOS 차단 하기

안녕하세요 Y입니다.

보통 기업에서 서버 앞 단에 IPS/IDS 장비를 두는 네트워크 IPS/IDS 방식을 사용하거나 DeepSecurity와 같이 OS에 설치하는 Host IPS/IDS를 사용하여 DDOS를 탐지 및 차단합니다.

하지만 소규모 기업이나 개인이 서비스를 운영하는 경우 보안에 대한 비용 투자나 운영에 어려움이 있을 수 있습니다. 

Apache에서 DDOS 방어를 처리할 수 있는 mod_evasive 모듈을 사용하여 DDOS 공격을 차단하는 방법을 소개하고자 합니다.

아무래도 보안 전용 제품이나 장비가 아니다 보니 모든 공격에 대해 방어를 처리할 수는 없습니다.

(CentOS 7.6, Apache 2.4 버전 기준입니다)

 

1.  mod_evasive1_1.10.1.tar 모듈 다운로드

wget https://idchowto.com/wp-content/uploads/2019/04/mod_evasive_1.10.1.tar.gz

2. 압축 풀기

tar -zxvf mod_evasive_1.10.1.tar.gz

3. 파일 확인

4. Apache 2.4 버전 mod_evasvie24.c 설치

1) mod_evasive20.c 복사

   cp mod_evasive20.c mod_evasive24.c

2) remote_ip -> client_ip 문자열 변경 작업

sed s/remote_ip/client_ip/g  -i  mod_evasive24.c 

5. apxs로  mod_evasiv컴파일

/usr/local/apache2.4/bin/apxs -iac mod_evasive24.c

(아파치 설치 경로/bin)

참고 : apxs - apache extension 도구 (apxs는 아파치의 확장 모듈을 컴파일하고 설치하는 도구)

옵션

-i  mod_evasive24.c  module 디렉터리에 복사

-a  httpd.conf 설정 파일 LoadModule에  mod_evasive20.so 활성화

-c  컴파일을 하여 mod_evasive.so를 생성하게 된다

 

6. 모듈 설치 확인 및 httpd.conf 파일 확인

1) 아파치 설치경로/modules

2) 아파치 설치 경로/conf/httpd.conf 파일 vi 에디터로 열어서 맨 아래 모듈 추가 확인

7. mod_evasive 옵션 설정

httpd.conf 맨 아래 아래의 옵션 설정

 

<IfModule mod_evasive24.c>

   DOSHashTableSize    3097

    DOSPageCount        5

    DOSSiteCount          50

    DOSPageInterval    1

    DOSSiteInterval      1

    DOSBlockingPeriod   20

    DOSLogDir           /usr/local/apache2.4/logs/mod_evasive

</IfModule>

(DOSLogDir 로그 경로 설정 시  만약 Apache가 Daemon으로 구동되고 있으면 로그 디렉터리의 소유권 및 권한 수정이 필요함)

 

옵션 설명

• DosHashTable

 HashTable의 크기로 사이트/페이지에 대한 분석을 위한 사이즈 할당 (접속이 많은 경우 크게 잡는 것을 권고)

• DOSPageCount

 동일한 페이지에 대한 Requset의 수에 대한 임계값 설정.

• DOSSiteCount

 동일한 사이트 대한 Requset의 수에 대한 임계값 설정.

• DOSPageInterval

 페이지에 대한 임계 값 간격. Default -> 1초

• DOSSiteInterval

사이트에 대한 임계 값 간격. Default -> 1초

• DOSBlockingPeriod

 접속 차단을 몇 분으로 지정할 것인지 설정

• DOSLogDir

 DOS라고 판단되는 트래픽이 들어왔을 때  IP 정보를 남기는 파일이 저장되는 경로

 

8. 아파치 재기동

./apachectl restart

9. 테스트

페이지 및 사이트에서 호출하는 항목 개수 등을 고려해 적절한 Count 값의 조절 및 테스트가 꼭 필요합니다.

정상 트래픽도 옵션 값에 따라 403 Error를 발생할 수도 있으니 충분한 테스트를 하여 운영 환경에 반영하는 것이 바람직합니다.

mod_evasive 설치된 폴더에 기본적으로 들어가 있는 test.pl perl 스크립트로 ddos 테스트를 해보았습니다.

바로 이 스크립트를 실행하면 400이 발생하므로 아래와 같이 test.pl 스크립트를 수정해야 정상적으로 동작합니다.

(수정)

vi test.pl

#!/usr/bin/perl

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

use IO::Socket;

use strict;

 

for(0..500) {

  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\r\nHost: 127.0.0.1\r\n\r\n";

  $response = <$SOCKET>;

  print $response;

  close($SOCKET);

}

 

실행 커맨드: perl test.pl

200  OK로 접속이 되다가 설정된 옵션 값에 따라 403 에러가 떨어집니다.

403 에러가 떨어지면서 메시지 로그 확인을 해보면 아래와 같은 메시지가 출력되는 것을 확인할 수 있습니다.

tail -f  /var/log/messages

로그 경로에 가보면 DOS 공격으로 의심되는 Blacklist IP 파일이 생성되어 있습니다.

 

리눅스 OS에서 iptable, firewalld 룰 설정으로도 DDOS를 차단할 수는 방법도 있지만, 간단하게 apache mod_evasive 모듈로 DDOS를

차단하는 방법을 알아봤습니다.

 

감사합니다 :)