안녕하세요 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를
차단하는 방법을 알아봤습니다.
감사합니다 :)
'INFRA > Middleware' 카테고리의 다른 글
제니퍼(Jennifer) 이벤트 알람 Slack 으로 받기 (1) | 2021.05.04 |
---|---|
[Apache] mod_expires로 css, javascript Cache 해보기 (0) | 2020.11.18 |