본문으로 바로가기
 

클라우드플레어 사용시 서버 IP 노출 방지 체크리스트

요즘 클라우드플레어를 사용하는 사이트가 부쩍 늘었죠? 서버의 트래픽을 절약해 주기 때문에 사용하시는 분들이 제일 많지만, 공격을 차단해 주고 실제 서버의 IP를 숨겨주기 때문에 사용하시�

xetown.com

 

서버의 트래픽을 절약해 주기 때문에 사용하시는 분들이 제일 많지만, 공격을 차단해 주고 실제 서버의 IP를 숨겨주기 때문에 사용하시는 분들도 적지 않습니다. 특히 중소규모의 디도스 공격이 잦은 사이트라면 클플 사용으로 상당한 효과를 거둘 수 있지요.

 

그런데 실제 서버의 IP가 노출되면 이것도 모두 소용없게 됩니다. 서버 IP를 직접 공격할 수 있게 되니까요.

 

클플을 사용해서 서버 IP를 숨기고 싶은 분들은 아래의 항목들을 체크해 보시기 바랍니다.

 

 

개요: 클플을 사용한 디도스 방어의 원리

 

디도스(DDoS, distributed denial of service) 공격은 특정 서버에 어마어마한 양의 트래픽을 쏟아부어서 사이트를 마비시켜 버리는 범죄행위입니다. 이제는 누구나 단돈 몇 만원이면 국내외의 해커를 고용하여 원하는 사이트 어디든지 공격할 수 있는 시대가 되어버렸는데요... 자기가 직접 공격하는 것이 아니라 수많은 좀비PC를 동원하여 트래픽을 발생시키기 때문에 공격자를 잡기가 매우 어렵습니다.

 

디도스 공격도 여러 종류가 있지만, 크게 두 가지로 나눌 수 있습니다. 변조된 패킷을 무지막지하게 쏟아붇는 레이어 3/4 공격과, 정상적인 패킷을 사용하여 다수의 웹 요청을 발생시키는 레이어 7 공격입니다. 가게에 비유한다면 레이어 3/4 공격은 가게 문에 쓰레기를 퍼붇는 것이고, 레이어 7 공격은 사람을 마구 밀어넣는 것과 같습니다.

 

클라우드플레어를 비롯한 대부분의 CDN 서비스는 자기네 IP로 일단 요청을 받은 후, HTTP Host: 헤더의 도메인을 기준으로 실제 서버에 연결해 주는 방식입니다. 이렇게 하면 HTTP Host: 헤더가 포함되어 있지 않은 레이어 3/4 공격은 일단 모두 막힙니다. 실제 서버에서는 여러 종류의 패킷을 주고받아야 하므로 쓰레기 패킷만 골라서 막기가 쉽지 않지만, 클플은 HTTP, HTTPS, 웹소켓 외에는 전혀 관심이 없기 때문에 일괄적으로 막아버리기도 쉽습니다.

 

실제 서버로 전달되는 것은 HTTP, HTTPS, 웹소켓 등 정상적인 패킷으로 이루어진 레이어 7 공격뿐인데 (쓰레기가 아니라 멀쩡한 사람처럼 생겼거든요. 실제 사용자일지도 모르잖아요.) 이것도 클플 방화벽에서 한 번 필터링한 후 수상하다 싶으면 캡챠를 거치게 합니다. ("I'm under attack!" 모드를 켜면 모든 사용자가 의무적으로 캡챠를 거치도록 강제할 수도 있습니다.) 이렇게 실제 사용자만 통과시키기 때문에 클플을 사용하면 레이어 7 공격도 대부분 막을 수 있게 됩니다.

 

그러니까 아래 버튼을 켜기만 하면 되는군요.

 

해당 기능을 작동시킨 뒤 웹에 접속하게 되면 다음과 같이 뜹니다.

🎈 오토스케일링 하면 되잖아요?

대부분의 사이트 운영자들에게 아마존(AWS)의 오토스케일링(auto scaling)은 디도스 공격에 대한 현실적인 방어 기술이 될 수 없습니다. 부하가 늘어날수록 서버를 자동으로 증설해 주는 기술인데, 레이어 7 공격을 당하여 서버가 마구 증설되거나 트래픽이 크게 늘어나면 다음 달에 요금 폭탄을 맞는 수가 있거든요. 사이트가 아닌 내 지갑을 디도스하게 되어버리는 거죠. (XE는 오토스케일링에 적합하지 않은 구조 때문에 애초에 쓰기도 힘들지만...) 물론 클라우드프론트와 Route 53 등의 상품을 조합하여 클라우드플레어와 비슷한 기능을 얻을 수도 있지만, 클플보다 기능도 부족하고 더 비쌀 뿐더러, 아래에 나열한 체크리스트도 모두 마찬가지로 적용해야 합니다.

 

 

물론 이건 실제 서버의 IP가 노출되지 않았을 때의 이야기입니다. 실제 서버 IP가 노출되면 이러한 보안 처리가 아무 의미 없게 됩니다. 서버 IP 노출을 막기 위해서 다음을 체크해봅시다.

 

 

1. [초급] 무슨 일이 있어도 클플을 끄지 않는다

 

몇 초라도 클플(주황색 구름 아이콘)을 꺼두면 실제 IP가 노출되고, 한 번 노출된 IP는 다시 주워담을 수 없습니다. 테스트를 위해서든 디버깅을 위해서든, 잠시라도 클플을 끄는 일은 결코 없어야 하겠습니다.

 

SSL, redirect, 실제 방문자 IP 파악 등을 위해 클플을 껐다 켰다 난리를 피우시는 분들을 종종 봅니다. 이 패치를 적용하면 SSL이나 실제 방문자 IP 파악을 위해 클플을 끄지 않아도 됩니다.

 

테스트를 위해 반드시 필요하다면 ycwehfbwd.example.com처럼 아무도 짐작할 수 없을 만한 서브도메인을 임시로 만들어서, 그 서브도메인만 클플을 끄고 테스트한 후 지워버리세요. 이것도 3번에 걸리지 않도록 주의해야 합니다.

 

 

2. [초급] 클플 사용 전에 쓰던 IP를 계속 쓰면 위험

 

이미 공격이 시작된 후에 급히 클플을 적용하시는 경우가 있는데, 일반 방문자들은 클플을 경유하여 접속하겠지만 공격자는 기존의 IP를 기억하고 계속 공격할 수 있습니다. 이미 공격이 진행중이라면 클플 적용 후에 서버 IP를 바꾸는 것이 좋습니다. (호스팅 업체를 옮겨야 할 수도 있습니다.)

 

 

3. [초급] 실제 서버 IP로 연결되는 서브도메인을 모두 제거해야

 

ftp.도메인.com, mail.도메인.com 같은 서브도메인을 자동으로 추가해 주는 호스팅 업체가 많습니다. 클플에 가입하면 이런 서브도메인을 자동으로 파악해서 클플 네임서버에 등록해 주는데, 도메인.com과 www.도메인.com은 클플을 경유하도록 (주황색 구름 아이콘) 설정하면서도 그 밖의 서브도메인은 그대로 두는 (회색 구름 아이콘) 분들이 꽤 있어요. ftp 같은 경우는 클플을 경유하면 접속이 안 되기 때문이기도 하고요.

 

그런데 이런 서브도메인이 하나라도 남아 있으면 그걸 사용해서 실제 서버 IP를 파악할 수 있습니다. 아예 일반적인 서브도메인 정보를 바탕으로 실제 IP를 찾아 주는 사이트도 있고요. 반드시 필요하지 않은 서브도메인은 모두 정리하도록 합시다.

 

주의!!! CNAME 레코드도 마찬가지입니다. 클플은 CNAME 레코드를 특이한 방식으로 처리하기 때문에 사실상 A 레코드와 같은 효과가 발생합니다. 구름 아이콘이 꺼져 있으면 실제 서버 IP가 노출되는 것은 A 레코드와 마찬가지입니다.

 

주의!!! 클플에서 와일드카드(*.example.com) 서브도메인을 추가하면 디도스 방어고 뭐고 다 날아가 버립니다. 요즘은 와일드카드 서브도메인을 추가하면 그 옆에 조그만 경고 아이콘이 뜨지만, 경고를 못 보는 분이 많습니다.

 

관리자가 서버 접속을 위해 ftp나 ssh를 사용해야 한다면 서브도메인을 사용하지 말고 서버 IP로 직접 접속하시면 됩니다. 남에게는 꽁꽁 숨기더라도 관리자는 알고 있어야죠, 그쵸?

 

 

4. [중급] 같은 서버에서 메일을 취급하면 절대 안된다

 

웹호스팅에 가입하면 메일 서비스가 제공됩니다. 그런데 이 서비스가 작동하기 위해서는 서버의 실제 IP를 가리키는 MX 레코드가 있어야 합니다. 그래서 웹호스팅 업체에서는 MX 레코드를 자동으로 설정해 주고, 클플에 가입할 때도 이것이 그대로 유지되는 것이 보통입니다. 클플은 메일을 취급하지 않기 때문에, 메일 전달을 위해서는 서버에 직접 연결해야 하거든요.

 

실제 서버 IP를 숨기고 싶다면 서버에서 직접 메일을 받지 않아야 합니다. 호스팅 업체에서 지정해 준 MX 레코드는 삭제하고, 그 대신 네이버 Works나 해외의 메일호스팅 서비스를 사용해서 메일을 외부로 빼내면 됩니다.

 

가입환영 메일이나 비번찾기 인증 메일도 마찬가지입니다. 서버에서 메일을 보내면 아래와 같이 메일 헤더에 서버 IP가 그대로 노출됩니다.

 

Received: from [XXX.YY.ZZZ.ABC]

 

Gmail이나 국내 포털의 SMTP를 사용하여 외부 서비스를 통해 발송해도 똑같습니다. 모두 서버 IP가 노출됩니다. 메일 발송 기능이 꼭 필요하다면 서버 IP를 숨겨주는 외부 API를 사용하는 것이 좋습니다. 이것은 API마다 차이가 있기 때문에 자세한 테스트가 필요합니다. 현재 고급 메일 발송 모듈에서 지원하는 API들 중에는 우리메일 SparkPost가 서버 IP를 숨겨주는 것으로 알고 있으나, 각 서비스의 정책 변화에 따라 바뀔 수도 있습니다.

 

스팸 방지에 사용되는 SPF 레코드도 마찬가지입니다. 예전에 서버에서 메일을 보내기 위해 화이트도메인 등록을 해두었다면 SPF 레코드에 서버 IP가 남아있을 수 있습니다. 화이트도메인 등록을 하지 않았더라도 호스팅 업체에서 자동으로 SPF 레코드를 추가해 두었을 수도 있고요. 이것을 통해서도 서버 IP가 노출될 수 있으므로 삭제해야 합니다. 외부 서비스를 통해 메일을 발송한다면 화이트도메인 등록은 필요하지 않습니다.

 

 

5. [중급] 호스팅 업체의 네임서버가 나를 배신할 수도!

 

위의 세 가지는 보안에 어느 정도 신경쓰는 분이라면 쉽게 해결할 수 있습니다. 문제는 여기부터입니다. 클플에 가입하면 클플에서 제공하는 네임서버(예: john.ns.cloudflare.com)로 변경하게 되는데, 그렇다고 그 때까지 잘 사용하던 호스팅 업체의 네임서버(예: ns1.cafe24.com)가 중단되는 건 아니거든요. 클플 네임서버에서 IP 주소를 숨기고 MX, SPF 등을 깨끗이 정리하더라도 예전 네임서버에는 여전히 실제 IP가 남아있을 가능성이 높습니다. 심지어 호스팅 업체를 바꾸더라도 새 호스팅 업체에서 님의 도메인을 자동으로 네임서버에 등록해 버릴지 몰라요. 그게 다 자동으로 된다는 것이 웹호스팅의 기본이거든요.

 

DNS라는 것이 어떻게 작동하는지 조금이라도 알고 있다면 예전 네임서버를 검색하는 것은 전혀 어렵지 않아요. DomainTools 같은 사이트에서 특정 도메인의 네임서버 변경 이력을 구입할 수도 있고, 정확히 알 수 없더라도 우리나라에서 널리 알려진 호스팅 업체들 수십 개만 찾아보면 99%는 답이 나옵니다. 가비아 네임서버도 검색해 보고, 카페24 네임서버도 검색해 보고... 심지어 도메인 등록업체와 현재 호스팅 업체가 같다면 1분도 안 걸리죠.

 

이 문제를 해결하기 위해서는 호스팅 업체의 네임서버에서 님의 도메인을 삭제해 달라고 요청해야 합니다. 웹호스팅이라면 네임서버 설정이 고객정보와 연동되어 있기 때문에 쉽지 않을 수도 있습니다. 서버호스팅이나 가상서버호스팅이라면 그나마 쉽고요.

 

 

6. [고급] 외부 요청을 통해 IP가 노출되지 않도록 한다

 

외부 이미지의 섬네일을 생성하거나 이미지 자동 첨부 애드온 등을 사용하면 회원들이 쓴 글에 포함된 이미지를 서버에서 직접 다운받게 됩니다. 그러면 공격자는 자신의 서버에 올려놓은 이미지가 포함된 글을 써놓고 어느 IP에서 그 이미지를 요청하는지 확인할 수 있게 됩니다.

 

이런 취약점을 차단하기 위해서는 가능하면 XE에서 외부 요청을 하지 않아야 합니다. 외부 요청을 발생시킬 만한 모듈이나 애드온은 사용하지 말고, 스킨이나 위젯 등에서 섬네일을 생성하는 코드도 모두 지우고, 꼭 섬네일을 써야겠으면 외부 이미지를 참조하지 말고 첨부파일만 사용하도록 document 및 comment 모듈을 수정할 필요가 있습니다.

 

사용하시는 모듈, 애드온, 위젯, 스킨 등이 절대 외부 요청을 발생시키지 않는다는 확신이 들지 않는다면? 최악의 경우에도 서버 IP가 노출되지 않도록 프록시를 경유하여 요청해야 합니다. 무료 프록시 목록은 이런 사이트에서 구할 수 있고 (반드시 anonymous, https 기능을 제공하는 것을 선택하세요), 해외 가상서버를 사용하여 직접 구축할 수도 있습니다.

 

주의!!! 무료 프록시는 수시로 다운되고, 다른 사용자들이 말썽을 부리면 여기저기서 차단되어 버리곤 합니다. 프록시 사용이 많을 것으로 예상되는 사이트를 안정적으로 운영하려면 내 사이트 전용 프록시를 따로 구축하는 것이 좋습니다. 프록시 IP에 디도스 공격을 퍼부어 봤자 메인 사이트 운영에는 지장이 없으니까요.

 

XE에서는 config.user.inc.php에 아래와 같이 프록시 IP와 포트를 넣고 (실제 프록시 정보로 대체해야 합니다.)

 

define('__PROXY_SERVER__', '123.45.67.89:8080');

 

이 패치를 적용하여 외부 이미지 요청 등을 할 때 프록시를 사용하도록 코어를 수정해야 합니다. (라이믹스는 코어를 수정하지 않아도 정상 작동합니다.)

 

 

7. [고급] IP가 노출되더라도 확인하거나 공격하기 어렵도록 만들자

 

위의 작업을 제대로 하지 않아서 IP가 이미 노출되었다면 어떻게 해야 할까요?

 

우선, IP만 입력해서는 님의 사이트에 방문할 수 없도록 조치해야 합니다. 웹호스팅이라면 여러 사이트가 한 서버를 공유하므로 IP만 입력하면 호스팅 업체에서 미리 설정해 둔 에러 페이지가 뜨는 것이 보통입니다. 그렇다면 다행이고요... 그러나 서버를 직접 운영하시는 분들은 서버 세팅을 대강 해두어서 브라우저 주소창에 IP만 입력해도 사이트가 뜨는 경우가 은근히 많습니다. 심지어 IP를 입력하면 실제 도메인으로 리디렉트해주시는 친절한 분들도 있어요. 둘다 안됩니다. IP를 입력해서 찾아오는 방문자들에게는 간단한 에러 페이지만 보여주어야 합니다. 그래야 이 IP가 맞는지 공격자가 확인하기 힘들어집니다.

 

그러나 공격자에게 좀더 실력이 있다면 Host: 헤더를 조작하는 것으로 위의 안전장치를 쉽게 우회할 수 있습니다. IP를 직접 방문하면서도 도메인을 방문한 것처럼 꾸밀 수 있다는 거예요. 따라서 IP로 접속해서 서버에 부담을 많이 주는 통합검색 요청을 대량으로 한다든지, 이런 공격이 가능하게 됩니다.

 

이것까지 차단하려면 서버의 방화벽에서 클라우드플레어 IP 대역 외에는 아예 80번 포트에 접속하지 못하도록 막는 방법밖에 없습니다. (SSL을 사용하실 경우 443번 포트도 마찬가지입니다. 웹호스팅에서는 .htaccess를 사용하여 비슷한 기능을 구현할 수 있습니다.) IP를 알고 있더라도 직접 접속이 안되고, 반드시 클플을 경유하여 접속하도록 강제하는 것입니다.

 

주의!!! 서버의 방화벽을 잘못 건드리면 엉뚱한 사람을 차단해 버리거나, 심지어 관리자도 접속하지 못하게 되어 버릴 수도 있습니다. 당장 클플을 우회하여 공격이 들어오고 있는 긴급한 상황이 아니라면 여기까지는 하지 않아도 됩니다.

 

주의!!! 물론 이것도 레이어 7 디도스 공격이나 막아주지, 서버 IP에 무의미한 패킷을 대량으로 전송하는 고전적인(?) 디도스 공격이라면 소용없긴 합니다. 따라서 애초에 서버 IP가 노출되지 않도록 하는 것이 가장 중요합니다.

 

 


darren, dev blog
블로그 이미지 DarrenKwonDev 님의 블로그
VISITOR 오늘 / 전체