2008. 4. 15.

프록시 - Proxy 는 크래커를 지켜주지 못한다.

인터넷 상에서 데이터를 전송할 때 꼭 필요한 것 중에 하나가 IP Address 이다.
네트워크 상에서 IP 는 자신의 고유 주소로써 데이터를 송/수신할 때 꼭 필요한
것 중에 하나이다.

본래 Proxy 는 네트워크의 중간에 설치함으로써 Cache 등의 기능을 활용하여
네트워크 트래픽을 줄이거나 자원의 절약을 위해서 사용되었으나 근래에 들어서
그 용도가 많이 변질되었다.

Proxy 라 함은 주로 Web Proxy 를 많이 뜻하는데, Web Proxy 를 이용하여 인터넷을
사용할 경우 자신의 IP 를 노출시키지 않고 Proxy Server 의 IP 를 이용한다는
점에서, 사용자의 프라이버시를 지킬 수 있다는 것에 많은 사람들이 애용하고 있다.

그러나 특정 부류의 경우 Proxy 를 이용하여 악성 리플을 남기거나, 불법적인
행위를 하는 경우가 있는데, Proxy 의 익명성을 이용하여 이러한 행동을 한다면
이는 잘못된 생각이다. Proxy 는 사용자를 지켜주기 위해 개발된 것이 아니다.

이 글은 Proxy 의 익명성을 이용하여 인터넷에서 악의적인 행동을 하는
사람들을 대상으로 쓸 것이다.

Proxy 서비스를 제공해주는 A 라는 Proxy 서버가 있다고 가정하자. B 라는 사용자는
A Proxy 서버를 이용하여 C 사이트에 연결할 것이다. B 는 인터넷 익스플로어의
Proxy 관련 설정으로 A Proxy 를 지정하였다. 이럴 경우 B 사용자는 C 사이트에 연결
할 때 다음과 같은 경로를 거치게 된다. (중간의 Network 경로는 생략하였다.)

B (사용자) -> A (Proxy Server) -> C (웹 사이트)

보기에, B 사용자는 A Proxy 서버를 거쳐서 C 에 가기 때문에, C 사이트는 B 사용자의
주소를 모를 것처럼 보인다. 이 것이 Proxy 서버가 사용자의 익명성을 지켜준다고
생각한다. 하지만 실제로는 그렇지 않다.

Proxy 서버가 C 사이트에 Web Contents 를 요청할 때, 여러 가지 헤더를 넘기게
되는데, 이 때 Proxy 를 이용하는 원래 사용자의 IP 도 같이 넘겨주기 때문이다.
여기서 A Proxy 서버는 C 사이트에 Web 요청을 보낼 때, B 사용자의 IP 정보도
같이 넘겨주게 되는데, 그 메소드는 "X-Forwarded-For" 이다.

Apache 웹 서버를 대상으로 설명하자면, Apache 웹 서버는 Request 의 헤더 중에
X-Forwarded-For 라는 것이 있다면 이 것을 환경 변수에 저장한다. 즉, C 사이트는
A Proxy 서버를 이용하는 B 사용자의 IP 주소도 알 수 있다는 이야기가 된다.

여기서는 웹 사이트에 접속한 사용자가 Proxy 서버를 이용하여 들어왔는지 알아
내는 방법을 PHP 를 대상으로 설명해보겠다. PHP 에서는 Apache 웹 서버에서 저장한
환경 변수를 상속받아 PHP 의 환경 변수로 다시 저장하는데, Proxy 가 보내온
헤더의 정보 중 "X-Forwarded-For" 는, PHP 에서 $HTTP_X_FORWARDED_FOR 변수에
담기게 된다.

아래는 웹 사이트에 접속한 사용자가 Proxy 를 이용하는지 판별해주는 테스트
소스이다.




위 소스를 테스트해보면 알 수 있지만, Proxy 서버를 이용하여 접근할 경우 원래
사용자의 IP 를 볼 수 있다.

이 글로 우리는 Proxy 서버를 사용하는 것이 사용자의 IP 를 숨겨주는 것이
아니라는 것을 알 수 있다. Proxy 를 이용하여 악의적인 행위를 해서는 안 될
것이다. 자신의 IP 가 노출되기 때문에 해서는 안된다는 것이 아니라, 악의적인
행위는 근절되야한다!!


만약 서버 관리자의 입장으로써, Proxy 서버를 이용하는 사람들을 막고 싶다면
HTTP_X_FORWARDED_FOR 환경 변수를 체크함으로 이용할 수 있을 것이다. 그러나
여기서 한가지 주의해야 할 점은, 회사나 학교 등에서는 내부 IP 를 사용하는
경우가 가끔 존재하는데, 이럴 경우 외부로 나가는 패킷은 집단 내에 존재하는
Proxy 서버를 통해서 나가게 되는 경우가 있다.

이럴 경우에, HTTP_X_FORWARDED_FOR 환경 변수가 존재한다고 무조건 사용자의
접근을 차단하는 방법을 이용해서는 안되고, Original IP 가 가상 IP 에서만
존재할 수 있는 것인지 확인을 한 후 처리를 해야할 것이다. 예를 들어 Original
IP 가 "192.168.0.100" 이라면 가상 IP 이다.

그러나 이 것도 100% 신뢰할 수는 없는데 그 이유에 대해서는 내가 쓴 "CGI
에서 Proxy 환경 변수를 이용할 경우 문제가 되는 점" 에서 참고하도록 하자.


참고사이트: http://hackersnews.org/hn/read.cgi?board=hn_sangsik&y_number=83&nnew=2
그럼 이만..

댓글 없음: