Apache 2.4 - 악성 봇(로봇 SemrushBot) 차단 및 IP차단

Last Updated on 2월 25, 2021 by 태랑(정현호)

유명한 봇 외 과도한 네트웍 트래픽을 사용하는 악성 봇들이 있습니다

이런 봇들을 apache conf 파일에 설정하여 한번에 차단을 진행하려 합니다(특히 SemrushBot)



그리고 추가적으로 SSH접속 공격한 ip 에 대해서도 같이 차단을 추가 설정 하려고 합니다.



별도의 conf 파일을 생성하여 차단하려는 이유는 지금 서버에 설정된 virtualhost가 다수가 있기 때문 입니다.

많이 사용되는 곳은 수백 이상의 가상호스트(virtualhost)가 존재 할 것이며 각각의 가상 호스트마다 차단 ip 등을 설정하는 것은 매우 어려운 일 입니다


httpd.conf 이나 vhost.conf 파일 내용도 길어지고 중복되는 내용이 계속들어가기 때문에 별도의 conf에 차단 정책이나 ip를 입력하고 virtualhost 내에서는 해당 내역을 불러서 적용하는 방식으로 하려고 합니다.



봇에 대한 리스트는 아래 링크의 사이트를 참조 하였습니다.



[참고] Nginx 에 악성 봇을 차단한 포스팅은 아래 링크를 확인 하시면 됩니다.






아래 부터
# SetEnvIfNoCase User-Agent ^$ bad_bot
SetEnvIfNoCase User-Agent "^MJ12bot" bad_bot
SetEnvIfNoCase User-Agent "^MJ12bot/v1.4.5" bad_bot

~

# Aggressive Chinese Search Engine
SetEnvIfNoCase User-Agent "Baiduspider" bad_bot

<== 여기 까지 모두 복사 합니다.


파일도 첨부 하였습니다.

bad_bot.txt



정책 내용 추가 및 내용 업데이트


사용 하면서 SemrushBot 에 대해서 수정 및 추가 하였습니다
SetEnvIfNoCase User-Agent "SemrushBot" bad_bot #181203
SetEnvIfNoCase User-Agent "SemrushBot/6~bl" bad_bot #181203
SetEnvIf User-Agent "^SemrushBot" bad_bot
SetEnvIf User-Agent "SemrushBot/6~bl" bad_bot
SetEnvIfNoCase User-Agent "SemrushBot-SA" bad_bot #181203
SetEnvIfNoCase User-Agent "^SemrushBot" bad_bot


원본 참조 글과 달리 별도의 conf 파일을 만들어서 사용할 것임으로 Require all granted 절은 여기서 사용하지 않겠습니다


위에서 복사한 내용을 apache설치디렉토리/conf/extra 밑에 bad_bot.conf 이름으로 생성 합니다.

[참고] 디렉토리는 apache의 설치 환경에 맞게 파일을 저장 하시면 됩니다.
yum/rpm 으로 설치한 환경과 source compile 한 환경 그리고 버전에 따른 conf 디렉토리의 이름이나 위치가 다릅니다.

yum/rpm 의 경우   /etc/httpd/conf.d   이 경로에 파일을 저장하면 되고 source compile 한 경우 conf 나 conf.d conf/extra 경로 등에 저장 하시면 됩니다.



[내용추가] bot 차단 리스트에 보면 Baidu 와 Yandex Bot이 리스트에 있습니다.

SetEnvIfNoCase User-Agent "Baiduspider" bad_bot

SetEnvIfNoCase User-Agent "Yandex" bad_bot


중국 Search Engine 와 러시아의 Search Engine 입니다.
보통 차단되는 이유는 수집해가는 크롤링 양이 많아 과도한 트래픽을 사용하기 때문 입니다

차단하게 되면 트래픽이 그만큼 줄어들게 됩니다 하지만 반대로 사이트나 블로그의 목적이나 특성상 많이 노출이 되거나 다양한 검색 엔진에서 검색이 되어야 하는 부분이 더 중요하다면 해당 Search Engine 도 허용을 하는것을 고려해 봐야 합니다.


운영하는 사이트의 정책이나 트래픽 소모량 , 운영하시는 분들의 판단에 따라서 2개의 bot 이외에 차단을 허용하거나 혹은 더 막을 필요가 있는 bot 은 추가하여 사용하시면 됩니다.



 IP 차단 등록


저는 /etc/hosts.deny 에 등록된 IP를 통해 별도의 IP 차단목록을 만들어서 Apache 에서도 차단 하려고 합니다.


apache 설치디렉토리/conf/extra 밑에  httpd-hosts.deny.conf  파일을 만들도록 하겠습니다.

* 파일의 위치는 위에서 설명한 내용과 같이 환경에 따라서 디렉토리는 선택하시면 됩니다.



그리고 파일에 아래와 같은 형태로 ip를 등록 후 Virtualhost 에서 설정을 하게 되면 차단이 이루어 지게 됩니다.(403 에러)

setEnvIf remote_addr 123.123.123.123 hosts_deny


현재 denyhosts 라는 ssh/sftp보안 툴을 통해 ssh/sftp 에 brute force(무작위 대입) 공격 등을 차단 하고 있습니다


차단 되는 IP는 /etc/hosts.deny 에 등록되어 차단되고 있습니다.
그래서 /etc/hosts.deny 에 등록된 아이피를 이용하여 Apache 에서도 차단을 하려고 합니다.


# 스크립트 생성
아래 스크립트 생성 후 crontab 에 등록하여 사용 할 예정입니다
* 경로는 변경하여 사용해도 됩니다
* 스크립트는 작성시 같은 라인을 구분하여 생성 해야 합니다.


[root]# mkdir -p /root/script/ip_log/
[root]# vi /root/script/apache_ipdeny_hosts_deny_cron.sh

cat /etc/hosts.deny | grep ALL | awk '{print $2}' | sort -u > /root/script/ip_log/etc_hosts_deny.log

sed s/^/'setEnvIf remote_addr '/g /root/script/ip_log/etc_hosts_deny.log > /root/script/ip_log/etc_hosts_deny2.log

sed s/$/' hosts_deny'/g /root/script/ip_log/etc_hosts_deny2.log > /usr/local/apache2.4/conf/extra/httpd-hosts.deny.conf

sleep 1

/bin/systemctl reload httpd





# crontab 에 등록
[root]# chmod 755 /root/script/apache_ipdeny_hosts_deny_cron.sh
[root]# crontab -e

## apache ip deny - from /etc/hosts.deny
00 */4 * * * /root/script/apache_ipdeny_hosts_deny_cron.sh > /dev/null 2>&1
  ->> 4시간 마다 한번씩 수행 되는 예제 입니다.



# Apache Conf 파일 수정

여기까지 2개의 파일을 만든 후 apache 설정 파일을 편집 합니다 (httpd.conf)
[root]# vi httpd.conf

* 파일명은 apache 를 설정해서 사용하시는 환경에 따라 다릅니다
* virtualhost 가 설정된 파일에 설정하시면 됩니다.


각 virtualhost 마다 아래와 같이 directory 절에 내용을 추가 할것입니다. 

<Directory>
Include conf/extra/bad_bot.conf
Include conf/extra/httpd-hosts.deny.conf
 
#Blocking by Country CN
SetEnvIf MM_COUNTRY_CODE ^(CN) BlockCountry
 
<RequireAll>
     Require all granted
     Require not env BlockCountry    
     Require not env bad_bot
     Require not env hosts_deny
</RequireAll>
 
</Directory>



<Directory>  ~  </Directory> 절 사이에 기술하면 되며

<RequireAll> 절 밖에 Include 하여 위에서 생성한 bad_bot.conf 파일과 httpd-hosts.deny.conf 파일을 등록해 줍니다.

아래 <RequireAll> 절에서는 Require not env 를 이용하여 bad_bot 과 hosts_deny 2개를 추가적으로 입력해줍니다.


Require not env bad_bot  에서 의 bad_bot은 SetEnvIfNoCase User-Agent "^MJ12bot" bad_bot
에서 지정한 bad_bot 을 사용한다는  의미 입니다.





conclusion


지금까지 위에서 설명한 내용과 같이 설정하게 되면 장점은 아래와 같습니다.

별도의 conf 파일에 IP추가나 변경 후 graceful
(reload) 하게 되면 require not env 를 설정한 모든 virtualhost(가상 호스트)가 공통적으로 적용 받을수 있기 때문에 빈번하게 내용이 추가/갱신 될수 있는 ip 차단같은 경우 더 쉽고 유연하게 적용할수 있습니다.


그래서 지금 시스템에서는 
1. 위에서 작성한 bad_bot.conf 파일로 bot 에 대해서 차단을 수행 하고 있고

2. ssh 접속 실패 및 문제 되는 접속에 대해서는 denyhosts 와 별도의 쉘을 통해서 /etc/hosts.deny 에 IP를 차단 등록을 하고 있습니다.


denyhosts 관련글

 



3. 그리고 포스팅에서 설명한 내용처럼 별도의 쉘스크립트 통해서 /etc/hosts.deny 를 참조하여 httpd-hosts.deny.conf  파일을 작성하여 Apache에서도 IP를 차단하고 있습니다.
(적용 후 apache reload 필요)



여기 까지 설정을 완료 하였으면 apache를 reload 하여 변경 내용을 적용하면 됩니다.
# systemctl reload httpd 


reload 이후 ip 차단등이 정상적으로 이루어지는지 테스트를 해봅니다.




apache log 확인


차단이 이루어 지게 되면 access 와 error 로그에 2곳에 로그가 같이 기록 됩니다.

(logging level 에 따라 내용이 조금 씩 다를 수는 있습니다)


#Access log
185.xxx.xxx.xxx - - [18/Sep/2020:00:52:47 +0900] "GET /index.php? HTTP/1.1" 403 - "-" "Mozilla/5.0 (compatible; SemrushBot/6~bl; +http://www.semrush.com/bot.html)" NL

# Error log
[client 185.xxx.xxx.xxx:2062] AH01630: client denied by server configuration


Access log 에 기록되더라도 error 403 으로 차단된 것임으로 설정상 문제가
없으며 정상적으로 이루어 지고 있다고 보시면 됩니다.



연관된 글
apache 웹 방화벽 - Mod_Security 설치 및 구성

apache - GeoIP를 사용하여 국가별 차단 정책 적용

Nginx 에서 악성 봇 차단 설정

SSH 무작위 접속 보안 및 IP 차단

답글 남기기