ProxyAJP를 이용한 Apache2 + Tomcat 연동시 중대한 보안 문제

– 2010.08.03 추가
아래에 쓴글은 정상적으로 작동하지 않으며 다음의 방법이 보안을 위한 정상적인 방법입니다.


ProxtRequests 설정을 Off로 변경 :
외부 요청이 차단됨, 이후에도 ProxyPass, ProxtPassMatch등 정상 사용 가능


– 기존의 글

기존에 다음과 같은 ProxyAJP를 이용한 Apache2와 Tomcat의 연동법에 대한 글을 썼었습니다.

Proxy AJP + mod_rewrite를 이용하여 Apache 2.2 + Tomcat 완벽 연동하기
Apache 2 Proxy AJP를 이용한 호스팅 환경에서의 완벽 연동

하지만 위의 방법들에 중대한 보안 문제가 있다는 것을 알게 되었습니다. 어느 순간부터인가 서버에 엄청난 트래픽이 유입되더군요.

저는 단순히 DDOS공격인줄 알았습니다. IP는 정체를 알수 없이 전세계에서 들어오더군요. 사실상 끝나기를 기다리며 내 서버에는 사실상 영리목적의 사이트가 없는데 무엇이 목적일까 고민하게 되었습니다.

우선 쌓이는 로그가 매우 특이한것을 알수 있었습니다. 로그는 대충 다음과 같은 형식이었습니다.

[code]202.109.175.224 – – [17/Apr/2009:21:17:39 +0900] “GET http://www.dfwater.com/Index.asp HTTP/1.1” 503 28 “http://www.dfwater.com/” “Mozilla/4.0 (compatible; MSIE 6.0; Windows 5.1)”
84.16.227.121 – – [17/Apr/2009:21:17:35 +0900] “GET http://www.google.com/ie?q=puts+inurl:?p%3D&hl=en&num=100&start=200&sa=N HTTP/1.0” 302 335 “http://www.google.com/ie?q=puts+inurl:?p%3D&hl=en&num=100&start=200&sa=N” “Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)”
64.91.72.166 – – [17/Apr/2009:21:17:39 +0900] “CONNECT 205.188.251.26:443 HTTP/1.0” 200 – “-” “-“
61.160.211.12 – – [17/Apr/2009:21:17:36 +0900] “GET http://www.kiss888mu.cn HTTP/1.1” 500 3847 “http://www.baidu.com” “Mozilla/4.0 (compatible; MSIE 6.0; Windows 5.1)”
118.69.166.3 – – [17/Apr/2009:21:17:39 +0900] “GET http://69.147.112.211/config/isp_verify_user?l=mmg&p=0011 HTTP/1.0” 200 26 “-” “-“
208.70.78.177 – – [17/Apr/2009:21:17:36 +0900] “GET http://www.google.com/ie?as_q=inurl:/guestbook.html+tampa+fl+gay+life+and+dating&num=100&hl=en HTTP/1.0” 302 355 “http://www.google.com/ie?as_q=inurl:/guestbook.html+tampa+fl+gay+life+and+dating&num=100&hl=en” “Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.8b2) Gecko/20050224 Firefox/1.0+”
78.30.203.105 – – [17/Apr/2009:21:17:39 +0900] “GET http://inmarket73.ru/forum/index.php?s=fb2bade970f814c6d66c67f414a2328b&act=Reg&CODE=image&rc=35f728107e6ae6292a22c4e6f16634ac&p=3 HTTP/1.0” 200 68 “http://inmarket73.ru/forum/index.php?act=Reg&CODE=image&rc=7f430230e31d334872d1b5136a57b9ce&p=1” “Mozilla/4.0 (compatible; MSIE 6.0; AOL 9.0; Windows NT 5.1)”
94.76.199.2 – – [17/Apr/2009:21:17:36 +0900] “GET http://superschurke.de/comments/feed/ HTTP/1.1” 404 809 “-” “Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)”[/code]

로그가 좀 지저분 합니다만 형식이 다음과 같다는것만 보시면 됩니다. 요청이 GET 메서드 이후에 http로 시작하는 것을 알수 있습니다. 그것도 전혀 쌩뚱 맞은 도메인과 호스트에 요청을 합니다.

이것이 왜 이상하냐면 보통의 브라우저는 요청을 할때 다음과 같이 합니다. theeye.pe.kr/index.html의 요청이 있다면 DNS에 질의 하여 theeye.pe.kr 도메인의 호스트 IP를 알아낸 이후에 그곳에 접속하여 GET /index.html 과 같은 방법으로 요청을 하게 됩니다.

위와 같은 방법은 마치 여의도에 가서 “롯데월드가 어딧나요?” 라고 물어보는 꼴이 되는 것입니다.

왜 저런 요청이 자꾸 들어오는 것인지 궁금하여 서버에 다음과 같이 테스트를 해보았습니다.

[code]telnet theeye.pe.kr 80
GET http://www.naver.com[/code]
자, 상식적으로 잘못된 요청이라고 나와야 하지만 정상적으로 페이지가 출력됩니다. 아니 왜 내 서버에서 엉뚱한 사이트의 요청을 처리해 주는 것이지!?

이제 여의도에 가서 “롯데월드가 어딧나요?” 라고 물었더니 상대방이 자기 차에 태워 롯데월드에 데려다 주었습니다.

친절한 사람이군요;;; 근데 문제가, 이걸 악용해서 소문이 나서 세상의 모든 사람이 이 친절한 사람에게 와서 자신이 가고싶은 곳이 어딧는지를 물어본다는 것이 문제가 됩니다.

서버가 엉뚱한 요청을 받아 대리 요청후에 결과를 되돌려 주는 문제는 일전의 Proxy설정의 잘못이었습니다.

ProxyAJP설정을 별다른 보안 절차 없이 설정하게 되면 이 세상 모든 http 요청의 IP세탁 시스템으로 둔갑되어질 수 있습니다.

이문제를 해결하기 위해서는 간단하게 Proxy 요청은 로컬호스트에서만 가능하게 설정하시면 됩니다.

[code]<Proxy *>
Order Deny,Allow
Deny from all
Allow from localhost
</Proxy>[/code]
간단하게 해결되었죠? Proxy 설정을 하시고 서버를 운영하시는 분들은 다른 호스트로의 요청을 해보시기 바랍니다.

에러없이 요청이 정상처리 된다면, 이제 표적이 되기전에 설정을 조금 손보시기 바랍니다.

첨언 : 추가로 로그들을 쭉 분석해 봤는데, 위와 같은 방법을 사용하는 이유는 특정 사이트의 검색요청을 계속하여 검색랭킹을 올린다거나, 추천사이트의 어뷰징 혹은 사이트 페이지뷰를 높이는데 사용되어지는 듯 싶습니다.

mod_spamhaus를 이용하여 스패머의 아파치 접근을 막아보자.

웹 서비스를 운영하는 차원에서 보면 스패머들은 매우 골치 아픈 문제입니다. 하지만 자세히 보면 이러한 공격이 특정한 패턴을 가지고 있지 않습니다.

그래서 더욱 필터링 하기가 어렵습니다. 대부분의 아이피를 조회해보면 특정 위치가 아닌 거의 전세계에서 동시에 들어오고, 그 방식도 매우 다채롭습니다.

이러한 공격에는 대부분 공격자의 명령에 따라 다른 시스템을 공격하는 좀비 PC들이 작업을 하게 됩니다.

하지만 이번에 소개해 드릴 mod_spamhaus를 Apache 웹서버에 설치하게 되면 SpamHaus에서 제공하는 스패머 블랙리스트와 대조하여 블랙리스트에 올라가 있는 시스템의 접근을 차단하게 됩니다.

보통은 sendmail과 같은 메일시스템(MTA)에 필터로 등록하여 사용하곤 하는데 이런식으로 사용하는것도 좋은 생각인것 같습니다.

스팸메일을 보내는데 이용되는 좀비PC나 스팸글을 등록하는 좀비PC나 같은 녀석들이 재활용 될테니깐요.

http://sourceforge.net/projects/mod-spamhaus/ 에서 관련 소스를 받아 설치합니다.

[code]tar -zxvf mod-spamhaus-0.7.tar.gz
cd mod-spamhaus
make
make install[/code]
apxs2를 찾을수 없다는 에러가 난다면 MakefileAPXS값을 적절한 값으로 변경해 줍니다. 저의 경우에는 apxs로 바꾸었습니다.

설치가 끝나게 되면 자동으로 httpd.conf 설정 파일에 다음의 내용이 추가 됩니다. 혹시 없다면 추가해 줍니다.

[code]LoadModule spamhaus_module   /usr/lib/apache2/modules/mod_spamhaus.so[/code]
다음으로 다음과 같은 설정을 하여 줍니다.

[code]<IfModule mod_spamhaus.c>
MS_METHODS POST,PUT,OPTIONS,CONNECT
MS_WhiteList /etc/spamhaus.wl
MS_CacheSize 256
</IfModule>[/code]
실제로 /etc/spamhaus.wl 파일을 생성해 두고 이 안에는 신뢰할수 있는 ip주소를 입력하시면 bypass 하게 됩니다.

이제 아파치를 재시작 하시면 됩니다. 이제부터 POST, PUT, OPTIONS, CONNECT 명령에 대해 spamhaus에 블랙리스트로 등록되어있는지를 확인하게 됩니다.

캐시 사이즈에 맞추어 캐시도 하게 됩니다. 적절히 설정하시면 됩니다.

참고 :
http://sourceforge.net/projects/mod-spamhaus/
http://www.howtoforge.com/how-to-block-spammers-with-apache2-mod_spamhaus-debian-etch
http://www.spamhaus.org/