웹사이트 검색

CentOS 7에서 Apache용 mod_evasive를 사용하여 DoS 및 DDoS로부터 보호하는 방법


소개

이전에 mod_dosevasive라고 알려진 mod_evasive Apache 모듈은 Apache 웹 서버에 대한 DoS, DDoS(Distributed Denial of Service) 및 무차별 대입 공격으로부터 보호하는 데 도움이 됩니다. 공격 중에 회피 조치를 제공하고 이메일 및 시스템 로그 기능을 통해 남용을 보고할 수 있습니다. 이 모듈은 IP 주소 및 URI의 내부 동적 테이블을 생성하고 다음 중 하나에서 단일 IP 주소를 거부하는 방식으로 작동합니다.

  • 동일 페이지를 초당 몇 번 이상 요청
  • 동일한 자식에 대해 초당 50개 이상의 동시 요청 만들기
  • 일시적으로 차단된 상태에서 요청하기

위의 조건 중 하나라도 충족되면 403 응답이 전송되고 IP 주소가 기록됩니다. 선택적으로 이메일 알림을 서버 소유자에게 보내거나 시스템 명령을 실행하여 IP 주소를 차단할 수 있습니다.

이 자습서에서는 서버에서 mod_evasive를 설치, 구성 및 사용하는 방법에 대해 설명합니다.

전제 조건

이 자습서를 시작하기 전에 다음이 있어야 합니다.

  • CentOS 7 64비트 Droplet(CentOS 6에서도 작동)
  • sudo 권한이 있는 루트가 아닌 사용자. 이 유형의 사용자를 설정하려면 CentOS 7 자습서로 초기 서버 설정을 따르십시오. 모든 명령은 이 사용자로 실행됩니다.
  • Droplet에서 실행되는 Apache 웹 서버. Apache를 설치하려면 CentOS에 Linux, Apache, MySQL, PHP(LAMP) 스택을 설치하는 방법 문서의 1단계를 따르세요.

1단계 - mod_evasive 설치

이 섹션에서는 mod_evasive가 작동하는 데 필요한 패키지를 설치하고 마지막으로 mod_evasive를 설치합니다.

먼저 서버에 EPEL(Extra Packages for Enterprise Linux) yum 리포지토리를 설치해야 합니다. EPEL은 Enterprise Linux용 고품질 오픈 소스 애드온 소프트웨어 패키지 세트를 생성, 유지 및 관리하는 Fedora Special Interest Group입니다. 다음 명령을 실행하여 서버에 EPEL 리포지토리를 설치하고 활성화합니다.

CentOS 7:

  1. sudo rpm -ivh http://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-5.noarch.rpm

CentOS 6:

  1. sudo rpm -ivh http://download.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm

다음을 사용하여 EPEL 저장소가 활성화되었는지 확인합니다.

  1. sudo yum repolist

활성화하면 출력에 다음 리포지토리가 나열됩니다.

epel/x86_64                                                            Extra Packages for Enterprise Linux 7 - x86_64

이제 yum 플러그인 protectbase를 사용하여 EPEL로부터 기본 패키지를 보호해 보겠습니다.

  1. sudo yum install yum-plugin-protectbase.noarch -y

protectbase 플러그인의 목적은 특정 yum 리포지토리를 다른 리포지토리의 업데이트로부터 보호하는 것입니다. 보호되지 않은 리포지토리의 패키지는 보호되지 않은 리포지토리에 최신 버전이 있더라도 보호되지 않은 리포지토리의 패키지에 의해 업데이트되거나 재정의되지 않습니다.

이제 mod_evasive 모듈을 설치할 준비가 되었습니다. 다음 명령을 실행하여 설치하십시오.

  1. sudo yum install mod_evasive -y

2단계 - 설치 확인

이제 mod_evasive가 설치되었으므로 구성 파일이 설치되었고 모듈이 로드되고 있는지 확인하겠습니다.

설치 중에 mod_evasive 구성 파일 /etc/httpd/conf.d/mod_evasive.conf가 추가되었습니다. 이 실행을 확인하려면 다음을 수행하십시오.

  1. sudo ls -al /etc/httpd/conf.d/mod_evasive.conf

출력은 다음과 유사해야 합니다.

-rw-r--r-- 1 root root 3473 Jul 21 01:41 /etc/httpd/conf.d/mod_evasive.conf

기본적으로 다음 LoadModule 줄이 구성 파일 mod_evasive.conf의 맨 위에 추가됩니다. 파일을 열고 아직 없는 경우 줄을 추가합니다. 이 줄은 Apache 웹 서버에 mod_evasive 모듈을 로드하고 사용하도록 지시합니다.

CentOS 7에서 행은 다음과 같아야 합니다.

LoadModule evasive20_module modules/mod_evasive24.so

CentOS 6에서 행은 다음과 같아야 합니다.

LoadModule evasive20_module modules/mod_evasive20.so

Apache 웹 서버용으로 로드된 모듈을 나열하고 mod_evasive를 찾습니다.

  1. sudo httpd -M | grep evasive

출력에 다음이 표시되어야 합니다.

 evasive20_module (shared)

3단계 - mod_evasive 구성

이제 설치가 완료되고 확인되었으므로 모듈 구성을 살펴보겠습니다. mod_evasive는 mod_evasive.conf 구성 파일을 통해 쉽게 사용자 지정할 수 있습니다. 이 자습서에서는 일부 구성 매개 변수에 대해 설명합니다. 모든 매개변수에 대한 정보는 구성 파일을 참조하십시오. 여기에는 각 매개변수에 대한 설명이 포함되어 있습니다.

변경해야 하는 구성 옵션 중 하나는 DOSEmailNotify입니다. 이것은 매우 유용한 지시어입니다. 이 값을 설정하면 IP 주소가 차단될 때마다 지정된 이메일 주소로 이메일이 전송됩니다. 이메일 본문에 mod_evasive HTTP Blacklisted 111.111.111.111가 표시됩니다.

예를 들어 mod_evasive 경고를 sammy@example.com과 같이 보내려면 파일을 편집하십시오.

  1. sudo nano /etc/httpd/conf.d/mod_evasive.conf

줄 앞의 #를 제거하여 DOSEmailNotify 줄의 주석 처리를 제거하고 이메일 주소를 자신의 것으로 변경합니다.

DOSEmailNotify   sammy@example.com

참고: mod_evasive는 이메일 알림을 보내기 위해 /bin/mail을 사용합니다. 메일 서버를 설치하고 작동해야 합니다. 이메일 알림이 작동하도록 간단한 메일 서버를 설정하는 방법에 대한 정보는 이 자습서를 참조하십시오.

설정할 수 있는 다른 매개변수는 DOSWhitelist입니다. 이 옵션을 사용하면 신뢰할 수 있는 클라이언트의 IP 주소를 허용 목록에 추가하여 절대 거부되지 않도록 할 수 있습니다. 화이트리스트의 목적은 소프트웨어, 스크립트, 로컬 검색 봇 또는 기타 자동화 도구가 서버에서 대량의 데이터를 요청하여 거부되는 것을 방지하는 것입니다.

IP 주소(예: 111.111.111.111)를 화이트리스트에 추가하려면 다음과 같이 구성 파일에 항목을 추가하십시오.

DOSWhitelist	111.111.111.111

필요한 경우 IP 주소의 마지막 3옥텟까지 와일드카드를 사용할 수 있습니다.

서로 다른 IP 범위의 여러 IP 주소를 화이트리스트에 추가하려면 다음과 같이 구성 파일에 별도의 DOSWhitelist 행을 추가할 수 있습니다.

DOSWhitelist	111.111.111.111
DOSWhitelist	222.222.222.222

DOSPageCountDOSSiteCount는 클라이언트가 불필요하게 차단되는 것을 방지하기 위해 덜 공격적인 값으로 변경하도록 권장되는 두 가지 다른 매개 변수입니다.

DOSPageCount는 IP 주소에 의한 페이지 간격(일반적으로 1초로 설정됨)당 동일한 페이지에 대한 요청 수에 대한 제한입니다. 해당 간격의 임계값을 초과하면 클라이언트의 IP 주소가 차단 목록에 추가됩니다. 기본값은 2로 매우 낮게 설정되어 있습니다. /etc/httpd/conf.d/mod_evasive.conf에서 다음을 편집하여 더 높은 값(예: 20)으로 변경할 수 있습니다.

DOSPageCount 20

DOSSiteCount는 사이트 간격(기본값은 1초)당 IP 주소별로 동일한 웹사이트에 대한 총 요청 수에 대한 제한입니다. 100초와 같이 더 큰 값으로 변경하려면:

DOSSiteCount 100

더 나은 성능을 얻기 위해 변경할 수 있는 몇 가지 다른 매개 변수가 있습니다.

하나는 DOSBlockingPeriod로 클라이언트(IP 주소)가 차단 목록에 추가된 경우 차단되는 시간(초)입니다. 이 시간 동안 클라이언트의 모든 후속 요청으로 인해 403(금지됨) 오류가 발생하고 타이머가 재설정됩니다(기본값은 10초).

예를 들어 차단 기간을 300초로 늘리려는 경우:

DOSBlockingPeriod	 300

다른 하나는 mod_evasive에서 사용하는 임시 디렉토리를 나타내는 DOSLogDir입니다. 기본적으로 /tmp는 시스템이 쉘 사용자에게 열려 있는 경우 일부 보안 문제를 여는 잠금 메커니즘에 사용됩니다. 권한이 없는 셸 사용자가 있는 경우 Apache가 실행 중인 사용자(일반적으로 apache)에게만 쓰기 가능한 디렉토리를 만든 다음 mod_evasive.conf 파일에서 이 매개 변수를 설정해야 합니다.

예를 들어 mod_evasive에서 사용하는 디렉토리를 /var/log/mod_evasive로 설정하려면 다음을 사용하여 디렉토리를 생성합니다.

  1. sudo mkdir /var/log/mod_evasive

그런 다음 소유권을 apache 사용자로 설정합니다.

  1. sudo chown -R apache:apache /var/log/mod_evasive

이제 mod_evasive 구성을 편집하고 다음과 같이 디렉터리를 변경합니다.

DOSLogDir           "/var/log/mod_evasive"

다른 매개변수는 DOSSystemCommand입니다. 값이 설정되면 IP 주소가 블랙리스트에 추가될 때마다 지정된 명령이 실행됩니다. 이 매개변수를 사용하여 mod_evasive를 서버 또는 쉘 스크립트에 설치된 방화벽과 통합하고 방화벽에서 mod_evasive에 의해 차단된 IP 주소를 차단할 수 있습니다.

4단계 - mod_evasive 모듈 로드

구성 파일을 변경한 후 적용하려면 Apache 웹 서버를 다시 시작해야 합니다. 다음 명령을 실행하여 Apache를 다시 시작하십시오.

CentOS 7:

  1. sudo systemctl restart httpd.service

CentOS6에서:

  1. sudo service httpd restart

참고: mod_evasive는 FrontPage Server Extensions와 충돌하는 것으로 보입니다. Apache 웹 서버 설정을 확인하여 mod_evasive가 제대로 작동하는지 확인할 수도 있습니다. 제안된 Apache 조정은 MaxRequestsPerChild에 대해 매우 높은 값을 갖지만 무제한이 아니며(0 값은 무제한을 의미함) KeepAliveKeepAliveTimeout 로 활성화합니다. 적당히 길게 설정하십시오.

5단계 - mod_evasive 테스트

모듈이 올바르게 작동하는지 확인하기 위해 간단한 테스트를 수행해 보겠습니다. 우리는 mod_evasive 개발자가 작성한 perl 스크립트 test.pl을 사용할 것입니다. 스크립트를 실행하려면 먼저 다음을 사용하여 서버에 perl 패키지를 설치해야 합니다.

  1. sudo yum install -y perl

테스트 스크립트는 mod_evasive와 함께 다음 위치에 설치됩니다.

/usr/share/doc/mod_evasive-1.10.1/test.pl

기본적으로 테스트 스크립트는 mod_evasive를 트리거하기 위해 Apache 웹 서버에서 동일한 페이지를 연속으로 100번 요청합니다. 마지막 섹션에서 mod_evasive를 수정하여 동일한 페이지에 대한 초당 요청에 더 관대하도록 했습니다. mod_evasive의 모든 알림 방법을 트리거하려면 스크립트를 100개가 아닌 200개의 연속 요청으로 변경해야 합니다.

/usr/share/doc/mod_evasive-1.10.1/test.pl 편집:

  1. sudo nano /usr/share/doc/mod_evasive-1.10.1/test.pl

다음 줄을 찾으십시오.

for(0..100) {

100200으로 교체:

for(0..200) {

저장 및 종료.

스크립트를 실행하려면 다음을 실행하십시오.

  1. sudo perl /usr/share/doc/mod_evasive-1.10.1/test.pl

다음과 유사한 출력이 표시됩니다.

HTTP/1.1 403 Forbidden
HTTP/1.1 403 Forbidden
HTTP/1.1 403 Forbidden
HTTP/1.1 403 Forbidden
HTTP/1.1 403 Forbidden
...

스크립트는 웹 서버에 100개의 요청을 만듭니다. 403 응답 코드는 웹 서버에서 액세스가 거부되었음을 나타냅니다. mod_evasive는 IP 주소가 차단된 경우에도 syslog에 기록합니다. 다음을 사용하여 로그 파일을 확인합니다.

  1. sudo tailf /var/log/messages

다음과 유사한 줄이 표시되어야 합니다.

Jul 29 00:11:18 servername mod_evasive[18290]: Blacklisting address 127.0.0.1: possible DoS attack.

IP 주소가 mod_evasive에 의해 차단되었음을 나타냅니다.

IP가 차단될 때 이메일 알림을 보내도록 mod_evasive를 구성한 경우 받은 편지함에 다음 내용이 포함된 이메일이 있게 됩니다.

mod_evasive HTTP Blacklisted 127.0.0.1

결론

mod_evasive는 단일 서버, 스크립트 공격 및 분산 공격을 차단하는 데 탁월합니다. 그러나 유효하지 않은 요청을 처리하고 응답하기 위한 서버의 총 대역폭 및 프로세서 용량에 한해 유용합니다. 이러한 이유로 최대 보호를 위해 이 모듈을 서버 방화벽과 통합하는 것이 좋습니다. 정말 좋은 인프라와 방화벽이 없으면 무거운 DDoS로 인해 여전히 오프라인 상태가 될 수 있습니다. 공격이 매우 무겁고 지속적이면 하드웨어 기반 DDoS 완화 솔루션으로 전환해야 할 수 있습니다.