이글은 ModSecurity 2.x를 기준으로 작성 되었습니다.

아래에 나열되는 User-Agent(이하 ua)들은 현재 이서버에서 차단하는 ua들이고 확실히 정상적인 ua는 아니라고
판단, 차단하고 있습니다. 실제 적용시에는 SecRuleEngine 설정을 DetectionOnly로 설정후 테스트 해보시기 바랍니다.

#file modsecurity_crs_10_config.conf
SecRuleEngine DetectionOnly

또한 corerule에 포함된 설정은 제외했고 추가 ua차단 rule에 대해서만 기술(?)합니다.

특정 ua차단의 경우 apache 웹서버단에서도 가능하지만 좀더 유연하고 여러가지 다양한 설정이 가능하고
개인적으로 선호(?)하는 modsecurity를 이용한 차단을 하고 있습니다.

운영중인 서버에 남은 apache log, auditlog를 오랜기간 분석(?)해 추려낸 ua 목록입니다.

아래 설정중 severity, rule id, msg등은 변경가능 합니다. "#"는 주석, ""는 줄바꿈의 의미로 사용되었습니다.

# ua header에 "가 있는 ua
SecRule REQUEST_HEADERS:User-Agent """
        "log,phase:1,auditlog,drop,exec:/usr/bin/modsec2ipt.pl,msg:'MZ5'"

# ua header 처음이 user-agent또는 webcollage로 시작하는 ua
SecRule REQUEST_HEADERS:User-Agent "^user-agent|webcollage"
"log,auditlog,drop,msg:'UA',,id:'990902',severity:'2'"

# 기타 차단 ua들
SecRule REQUEST_HEADERS:User-Agent "b(ax)$"
     "log,auditlog,drop,exec:/usr/bin/modsec2ipt.pl,msg:'ax',severity:'2'"

SecRule REQUEST_HEADERS:User-Agent "webripper|w0000t|larbin|anonymous|avwvaxsrwhrvpcbvmwot"
"log,auditlog,drop,exec:/usr/bin/modsec2ipt.pl,msg:'WebRipper',severity:'2'"

# 중국쪽 게시판 스패머들이 사용한것으로 확인된 ua (google 검색을 이용해 게시판을 찾기도 하더군요.)
# 게시판 검색시 쓰인 검색어: "board.php 사이트주소 HTML 글쓴이 비밀번호"
# qqdownload의 경우 스패머가 아닌 정상적인 사용자일 가능성이 있으므로 사용에 주의 요망
SecRule REQUEST_HEADERS:User-Agent "qqdownload|tencenttraveler|psp|webster|cncdialer"
"log,auditlog,drop,exec:/usr/bin/modsec2ipt.pl,msg:'UA',id:'990902',severity:'2'"

SecRule REQUEST_HEADERS:User-Agent "^java|windows 95|hmsbot|Toata dragostea mea pentru diavola"
"log,auditlog,drop,exec:/usr/bin/modsec2ipt.pl,msg:'UA',id:'990902',severity:'2'"

SecRule REQUEST_HEADERS:User-Agent "plantynet|compatible;msie"
"log,auditlog,drop,msg:'PlantyNet',,id:'990902',severity:'2'"

# 이 rule의 경우도 정상적인 사용자가 있을 수 있으나 극히(?) 적을것으로 예상됩니다.
SecRule REQUEST_HEADERS:User-Agent "win 9x 4.90)$"
"log,auditlog,drop,msg:'Win 9x 4.90',id:'990902',severity:'2'"

SecRule REQUEST_HEADERS:User-Agent "b5.1;1813)$"
"log,auditlog,drop,msg:'UA',severity:'2'"

SecRule REQUEST_HEADERS:User-Agent "bwindows xp)$"
"log,auditlog,drop,msg:'XP',severity:'2'"

# 정상적인 ua는 아닌것으로 보이나 특정 프로그램(webhard등)이 이 ua를 달고 오는 경우가 있습니다.
SecRule REQUEST_HEADERS:User-Agent "mozilla/3.0 (compatible)$"
"log,auditlog,drop,msg:'mozilla30'"

# crank라는 hack tool이 사용하는 ua
SecRule REQUEST_HEADERS:User-Agent "^cr4nk.ws"
"auditlog,phase:1,drop,exec:/usr/bin/modsec2ipt.pl,msg:'cra4nk',,id:'990902',severity:'2'"

# ua header가 비어있는 경우
SecRule REQUEST_HEADERS:User-Agent "^$"
"log,auditlog,phase:1,drop,msg:'UA require',,id:'990902',severity:'2'"

# coppermine gallery의 보안 취약점을 공격했던 ua
SecRule REQUEST_HEADERS:User-Agent "winnie poh"
"log,auditlog,phase:1,drop,exec:/usr/bin/modsec2ipt.pl,msg:'UA2',,id:'990902',severity:'2'"

# mozilla/7.0이라는 괴상한(?) ua를 달고 오는 녀석도 있습니다.
SecRule REQUEST_HEADERS:User-Agent "^Mozilla/7.0"
"log,auditlog,phase:1,drop,exec:/usr/bin/modsec2ipt.pl,msg:'Mozilla7',,id:'990902',severity:'2'"

Mozilla/4.0 (compatible; MSIE 5.5; Windows 98; DigExt)라는 ua를 달고 오는 녀석들도 있는데 이메일 수집기
(또는 유사 프로그램)일 가능성이 매우 높습니다. 주기적으로 모니터링한 결과 10여개의 ip가 수집되었고 국내가
대부분이고 해외에서 접속하는 경우도 약간 있습니다. 저처럼 스패머를 혐오(?)하는 관리자 분들이라면 모니터링
해보시고 차단하기를 조심스래(?) 권해봅니다 :)
현재는 이 ua가 접근하면 무작위 이메일을 만들어 뿌려주게 설정해 뒀습니다.

[root@free4u tmp]# cat apache_dir/logs/access_log | grep -i "digext" | wc -l
28
오늘만해도 벌써 28번이나 다녀(?)가셨군요.

위에 사용된 regex(정규표현식)이 정확한 것인지는 확신할 수 없으나 현재 잘 돌아가는것을 보니 별 문제는
없는듯 합니다.
regex에 관한것은 서버에 저정해 두었던 한동훈님이 작성한 글을 링크합니다.

문서 제목 : [강좌] Regex (정규표현식) 라이브러리
작성자 : 한동훈 ddoch@email.protected

regex.txt




  1. Favicon of http://free4u.wo.tc/ EcusE 2009.06.10 14:55

    user-agent 목록 참고 사이트 : http://www.user-agents.org/ http://www.useragentstring.com/pages/useragentstring.php

원문 링크 : http://spamcleaner.org/en/misc/modsec2ipt.html ( modsec2ipt )
원제 : Linux : communication between mod_security and iptables to block IP's

자세한 설정 내용을 적어보려 했으나 원문 자체가 자세하고 알기 쉽게 되어 있어 적용하는데 큰 무리는 없을 거라 생각됩니다.
modsecurity 1.x와 2.x를 같이 지원하고 있습니다.

간단한 원리만 설명하자면 특정 uri에 대한 rule에 modsecurity가 넘겨주는 "REMOTE_ADDR"을 
iptables로 넘겨주는 동작을 하는 것입니다. perl script로 되어 있고 몇가지 보안 문제의 대비책도 되어 있어 사용하기도
좋습니다.
SecRule REQUEST_URI "/sumthin" log,exec:/path/to/modsec2ipt.pl,phase:1
현재는 약간 수정해서 사용하고 있는데 잘 동작하더군요. 또한 modsec2ipt는 modsecurity를 이용해 apache를 chroot상태로
운영해도 tcp/ip 연결되기 때문에 iptables를 이용해 ip를 차단하는것이 가능합니다.

주기적으로 차단된 ip를 해제하는 cron script또한 함께 문서에 작성되어 있습니다.

관련 링크 : http://spamcleaner.org/en/misc/modsec2ipt.html
  1. Favicon of https://free4u.wo.tc EcusE 2013.04.04 14:56 신고

    modsecurity 1.9.x대를 사용하신다면 아래링크의 글을 참고하세요. http://www.digimoon.net/blog/337

modsecurity mailling ( http://marc.info/?l=mod-security-users&r=1&w=2 )에 올라온 core rule set vs gotroot ruleset글에
대해 gotroot ruleset을 작성한 Michael Shinn과 modsecurity를 인수(?)한 breach.com의 Ryan Barnett의 답장 놀이(?)가
볼만합니다. 그 와중에(?) jwall.org에서 modsecurity에 사용되는 ruleset들을 비교해 자세한 리포트(?)가 소개되었습니다.
http://www.jwall.org/eval_rules.jsp
영문사이트지만 modsecurity에 관심이 많으신 분이시라면 크게 무리(?)는 없을거라 생각됩니다만 google번역 링크
보셔도 좋을듯 합니다. gotrootrule과 corerule의 제작 배경, 세부 작동 내역등을 알 수 있습니다.
각 ruleset을 적용시 성능 문제 역시 많은 논란(?)이 있는데 자세한 것은 직접 글들을 읽어보시면 도움이 될듯 합니다.
아래 관련링크에 메일링을 편하게 볼 수 있는 링크를 추가합니다. 주로 marc.info를 이용해왔는데 gmane.org가
좀더 편하게 글들을 읽을 수 있더군요.


관련 링크 :
http://www.jwall.org/eval_rules.jsp
http://news.gmane.org/gmane.comp.apache.mod-security.user
http://marc.info/?l=mod-security-users&r=1&w=2
http://sourceforge.net/mailarchive/forum.php?forum_name=mod-security-users

출처 : http://www.krcert.or.kr/

krcert에서 modsecurity 2.x 용 rule파일도 배포하고 있네요. 1.x대 rule만 제공하다가 1.x, 2.x대를 함께 제공하더군요.
설정파일을 열어보니 gotroot rule과 이전에 사용하던 rule그리고 modsecurity core rule을 섞어(?)
놓은것 처럼 보이더군요. Array

rule파일을 열어보면 아래와 같이 Googlebot-Image를 스팸봇으로 규정(?)해놓았는데 좀더 정확하게 googlebot의 ip range가
아니고 googlebot의 User-agent(이하 UA)이름을 달고 올때 차단하는것이 좋아보입니다.
# 7. 스패머 프로그램 봇
SecRule REQUEST_HEADERS:User-agent "Googlebot-Image" "msg:'Robot attack'"

위의 rule은 아래처럼 바꿀수 있습니다.
SecRule REQUEST_HEADERS:User-agent "Googlebot-Image" " chain,msg:'Robot attack'"
SecRule REMOTE_ADDR "!^66.249.[6-9][0-9]."
#googlebot 의 ip가 아니고 UA를
Googlebot-Image라고 밝히는 경우

#기타 여러 검색엔진의 경우도 마찬가지로 설정할수가 있습니다.
googlebot의 ip range는 아래링크를 참고하세요.
http://www.iplists.com/google.txt


그리고 또한 아래 설정처럼 여러개의 UA를 나열할 경우 하나의 rule로 설정해 처리속도를 높이는 것도 좋은방법입니다.
SecRule REQUEST_HEADERS:User-agent "WebZIP" "msg:'Robot attack'"
SecRule REQUEST_HEADERS:User-agent "Teleport" "msg:'Robot attack'"
SecRule REQUEST_HEADERS:User-agent "GetRight" "msg:'Robot attack'"
SecRule REQUEST_HEADERS:User-agent "FlashGet" "msg:'Robot attack'"

#위의 4개 설정을 하나로 통합
SecRule REQUEST_HEADERS:User-agent "WebZIP|Teleport|GetRight|FlashGet" "msg:'Robot attack'"

krcert rule에 대한 태클(?)을 건것 처럼 보이기도 하는데 아주 유용한 설정들이 포함되어 있으니 참고하시면
큰 도움이 될것으로 보입니다. Array


첨부파일은 krcert에서 배포하는 modsecurity 1.x, 2.x용 rule파일과 modsecurity관련 pdf문서 입니다.

securenet에서 modsecurity에 관한 자료와 관련 문의를 할 수 있는 게시판도 제공하고 있습니다.
http://www.securenet.or.kr/main.jsp?menuSeq=496


기본적인 chroot환경의 기본개념은 대부분 비슷합니다.

apahce 1.x대의 chroot 운영은 이전에 포스팅한 아래링크를 참고하세요.
Apache 의 chroot 운영 및 Jail System

modsecurity 의 chroot 관련 문서링크
SecChrootDir지시자의 설명에도 나와있지만 아주 간단하게 apache 프로세스를 chroot환경으로 운영할수가 있습니다.
별도의 패치나 수정이 필요없고 (modsecurity를 사용한다는 조건하에) httpd.conf에 몇가지 수정만 하면 적용할수 있습니다.

SecChrootDir지시자를 사용하는데 몇가지 제약이 있습니다.
먼저 windows용 modsecurity에는 적용되지 않습니다.

1. DNS lookups do not work.
2. PHP에서 메일을 보낼수 없다.
3. 몇몇 경우 apache의 graceful(reload)가 되지 않는다. (확실히 테스트시에도 graceful 이 동작하지
않더군요. 그래서 항상 restart를 해야합니다.) 


3번을 제외하곤 대부분의 chroot환경에서 받는 제약과 비슷합니다. 따라서 해결방법도 비슷합니다.
library문제, sendmail관련등의 문제 해결역시 이전에 작성한  Apache 의 chroot 운영 및 Jail System 문서의
환경설정 이하 부분을 참고하시면 되겠습니다.


직접 SecChrootDir를 이용 chroot환경에 apache를 운영해본 결과(!?)
SecChrootDir "/web"로 설정시 mount명령의 bind옵션을 이용해 /web/httpd디렉토리 구조를 /web/web/httpd 형태로
mount해 /web/httpd구조를 그대로 사용하게 설정하는것이 여러가지 문제를 피할수 있는 방법으로 생됩니다.

mount --bind /web/httpd/ /web/web/httpd/

설정 예제는 아래와 같습니다. /web/httpd와 /web/web/httpd가 같은 디렉토리 입니다.

ServerRoot "/web/httpd"
SecChrootDir "/web"
DocumentRoot "/web/httpd/htdocs"
<Directory "/web/httpd/htdocs">
Options FollowSymLinks
AllowOverride AuthConfig Limit
Order deny,allow
</Directory>
CustomLog logs/access_log


마지막으로 apache의 실행 스크립트내의 경로 역시 수정해야합니다. apache의 배포처에 따라 실행 스크립트내용은
다를수 있습니다. 다만 httpd의 경로 및 pid파일의 경로등만 주의해서 설정하면 됩니다.
# the path to your PID file
PIDFILE=/web/httpd/logs/httpd.pid
# the path to your httpd binary, including options if necessary
HTTPD="/web/httpd/bin/httpd -k start -DSSL"

+ Recent posts