Tag Archives: 서버관리

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 설정을 하시고 서버를 운영하시는 분들은 다른 호스트로의 요청을 해보시기 바랍니다.

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

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

[BIND] DNS Round Robin Load Balancing

사업이 번창하여 서버를 증설해야 하는 상황이지만 L4 스위치와 같은 로드밸런싱 장비가 부담이 된다면?

정말 저렴하고도 간단하게 로드밸런싱을 구현하는 방법이 있습니다.

사실 로드밸런싱이라고 부르긴 좀 엄하지만 그래도 접속하는 사용자들을 분산시키는 효과는 분명히 있습니다.

Round Robin 방식을 이용한 로드 밸런싱 방법이 그것인데요. DNS를 이용하여 손쉽게 구현할 수 있습니다.

Round Robin 방식이란 서버가 A, B, C 3대가 있다고 하면 첫번째 요청에는 A에 연결하여 주고 두번째 요청은 B에 연결하여 주고 세번째 요청은 C에 연결하여 주고 마지막으로 또다시 요청이 오면 A로 연결하여 주는 무한히 반복 연결하여 주는 방식입니다.

L4의 클라이언트 세션을 유지해 가며 처음 연결했던 서버에 지속적으로 연결해 주는 기능은 없지만 간단히 요청과 결과로만 이루어진 페이지들이라면 써볼만 합니다.

BIND의 Zone 파일을 다음과 같이 간단히 수정하면 구현할 수 있습니다.

[code]; zone file fragment
        IN  MX  10  mail.example.com.
….
mail IN  A       192.168.0.4
        IN  A       192.168.0.5
        IN  A       192.168.0.6[/code]
설정 후에 확인을 해보면 다음과 같은 결과를 볼 수 있습니다.
[code]C:\>nslookup mail.example.com


*** Default servers are not available
Server:  UnKnown
Address:  168.126.63.1


Non-authoritative answer:
Name:    mail.example.com
Addresses:  192.168.0.4, 192.168.0.5, 192.168.0.6[/code]


Addresses의 서버들의 순서가 매 요청때 마다 바뀌는걸 알 수 있습니다.