VPN(Virtual Private Network, 가상사설망)의 정의는 인터넷과 같은 공중망(Public Network)을 마치 전용선으로 사설망(Private Network)을 구축한 것 처럼 사용할 수 있는 방식을 의미한다.
나는 보통 VPN에 대해 간략하게 설명할때 이렇게 설명한다.
하나의 폐쇄된 사설망이 있을때 그 사설망에 속해있지 않은 원격 사용자가 그 폐쇄된 사설망에 존재하는 것처럼 만들어주는 것이다.
VPN의 종류에는 IPSEC VPN, SSL VPN, L2TP등과 같은 여러가지가 있으며 이중 VPN의 표준은 IPSEC VPN이다.
VPN의 정의에서 나온 사설망이란 크게 두 가지의 장점을 가지고 있다. 첫번째는 보안(Security)의 의미이고 하나는 접근(Access) 통제의 의미이다.
VPN에서 보안이란 통신 데이터를 암호화와 인증을 통해 통신데이터가 도청 또는 위조되는 것을 방지하는 것이고, 접근통제란 정당한 권한을 가진 즉, 같은 사설망에 있는 개체만이 사설망에 있는 특정 개체에 접근이 가능하도록 하는 것이다.
IPSEC(IP Security Protocol)은 VPN의 표준으로 IP 통신을 하는 모든 데이터에 적용 가능하다.
IPSEC VPN 제품은 일반적으로 키교환 프로토콜인 IKE(Internet Key Exchange)데몬과 IKE를 통해 생성된 키를 이용하여 송수신되는 데이터(패킷)에 대한 암복호화 및 인증을 실행하는 IPSEC Driver로 구성된다.
간단하게 이야기하면 IKE 데몬을 통해 상대편 장비와 키교환을 하고, 생성된 키를 IPSEC Driver에 내려서 IPSEC을 타야하는 패킷에 대해 암복화 및 인증을 실행하는 구조이다.
IPSEC VPN은 보통 gateway to gateway 방식과 gateway to host 방식을 주로 사용한다.
gateway to gateway 방식은
사설IP대역1---IPSEC VPN Gateway1---Internet---IPSEC VPN Gateway2--사설IP대역2
환경에서 G/W1과 G/W2 사이에 가상 사설망을 만들고 사설IP대역1과 사설IP대역2가 서로 통신하는 방식이다.
gateway to host 방식은
host PC ---- Internet ---- IPSEC VPN Gateway ---- 사설IP대역
환경에서 host PC와 G/W 사이에 가상 사설망을 만들고 host PC와 사설IP대역이 서로 통신하는 방식이다.
IPSEC VPN Gateway는 일반적으로 리눅스 운영체를 가지며, host PC는 윈도우 운영체제이다. 따라서 IPSEC VPN을 원할하게 사용하기 위해서는 리눅스용 모듈과 윈도우용 모듈 두 가지가 있어야 한다.
리눅스 상에서 구현된 IPSEC VPN 오픈소는 많이 있으나 가장 많이 사용되고 있는 것은 strongswan(http://strongswan.org)과 openswan(http://openswan.org)이다.
두 프로젝트 모두 freeswan이라는 프로젝트에서 파생되었으며 현재는 strongswan쪽이 더 활성화 되어 있다. IPSEC VPN을 공부해보고 싶은 사람은 strongswan을 적극 권장한다.
리눅스 상에서 IPSEC VPN을 구현하는 방법은 Application 단에서 IKE 데몬을 구현하고, sk buffer를 이용하여 리눅스 커널단에서 IPSEC Driver를 구현하는 것이 일반적인 방법이다.
윈도우 상에서 IPSEC VPN을 구현하는 방법은 리눅스와 마찬가지로 Application 단에서 IKE 데몬을 구현하고, NDIS IM driver 단에서 IPSEC Driver를 구현한다. 이때 윈도우에서 IPSEC Driver를 구현하기 위해서는 Windows DDK에서 제공하는 Passthru 소스를 수정하면 구현이 가능하다.(하지만 문제는 무쟈게 많이 발생한다. --;;)
만약 윈도우즈 상에서 비교적(?) 안정된 IPSEC Driver를 구현하고자 하면 PCAUSA라는 회사에서 제공하는 NDIS Hooking Driver를 이용하면 그다지 어렵지 않게 구현이 가능하다. 물론 윈도우즈 OS의 제약은 따른다.
그러나 윈도우의 특성(?)상 안정된 IPSEC Driver를 구현하기는 쉽지 않다. 또한 드라이버간의 충돌 문제도 무시하지 못하는 부분이다. 이렇듯, 윈도우 상에서 IPSEC VPN 모듈(일반적으로 IPSEC Client)의 문제점으로 인해 나온 제품이 바로 SSL VPN이다. SSL VPN에 대해서는 나중에 다시 쓰기로 하겠다.
현재 IPSEC VPN 벤더들은 너무나도 많다.
대표적인 외산제품으로는 Cisco, CheckPoint, Nortel, Netscreen, SonicWall 기타 등등이며, 국산으로는 퓨쳐시스템, 넥스지, 어울림, 시큐아이닷컴, 안철수 연구소 정도이다.
또한 QuickSec이라는 IPSEC VPN 상용소스도 있다. 개인적인 소견으로는 freeswan 계열의 IPSEC VPN 오픈소스가 없었다면 QuickSec을 만든 회사는 짭짤했을 것이다. =-=
이상으로 대략적인 정말 대략적인 부분을 썼다. 다음 글에서는 IKE(version1, 2)에 대한 설명과 IPSEC Driver에서 패킷이 처리되는 과정을 간단하게 정리하려고 한다. 기술적으로 얼마 정도의 depth를 가지고 들어갈지는 좀 더 생각을 해봐야겠다.
오늘은 IPSec VPN에 대한 주제로 좀 더 기술적(?)인 내용을 쓰려고 한다. 지난번에 이야기한 것과 같이 IPSec VPN은 두가지 모듈로 이루어진다.
키교환 기능을 수행하는 IKE(Internet Key Exchange) 데몬과 교환된 키를 이용하여 송/수신 되는 데이터를 암/복호화하는 IPSec Driver이다.
우선 IKE는 IPSec 뿐만 아니라 Internet 상에서 키교환을 하기 위한 표준이며 현재 IKEv1과 IKEv2로 구분된다.
IKEv1은 Phase1과 Phase2의 두가지 단계로 이루어진다. Phase1의 기능은 상대방에 대한 인증 기능과 Phase2의 데이터를 보호하기 위한 키교환 기능을 포함하고 있다.
즉, Phase1에서 만들어진 보안 파라미터(IKE SA)를 이용해서 Phase2 메세지들을 보호하게 된다. Phase2의 기능은 IPSec Driver에서 사용할 보안 파라미터(IPSec SA)를 협상하는 기능을 수행한다.
IKEv1과 IKEv2의 큰 차이점들은 다음과 같다.
-. 키교환 과정이 간소화 됐다.
: v1에서는 키교환에 필요한 메시지 수가 최소 6번에서 9번이 필요했다. 그러나 v2에서는 최소 4번이면 가능하게 되었다.
-. v1에서는 RFC가 아닌 Draft로 되어 있던 기능들 (NAT Traversal, DPD, XAuth…)이 v2에서는 RFC에 포함되었다.
-. IKE 협상과정에서 DoS 공격에 대한 방어를 위한 메카니즘이 포함되었다.
다음은 IPSec Driver에 대한 동작원리에 대한 것이다.
일반적인 방법으로 네트웍 상에 있는 사설 IP와 사설 IP는 서로 통신을 하지 못한다. 그 이유는 라우팅을 할수 없기 때문이다. 그래서 사설 IP와 사설 IP를 통신하기 위해 사용하는 방법이 바로 "터널링"이라는 기법이다. IPSec VPN도 바로 "터널링"이라는 기법을 사용하였다.
우리가 Application에서 소켓을 통해 패킷을 보내면 |IP header|Payload| 의 형태로 전송되어 진다.(ethernet header 다음부터 표기한 것이다.)
이때 IP header에 들어가는 소스 IP와 목적지 IP는 모두 라우팅이 가능해야 한다. 그래야 목적지까지 도달할 수 있다. 그러나 사설IP에서 사설IP로 통신을 시도하면 IP header에 포함된 소스IP와 목적지IP가 라우팅이 되지 않게 된다.
터널링 기법은 보통 이러한 패킷에 IP header를 하나 더 붙이게 된다.
즉, |IP header|Payload| => |New IP header|IP header|Payload| 로 변환해서 보내는 것이다. 그러면 터널링 장비는 자기가 받은 패킷중에 가장 앞에 있는 New IP header를 제거하고 나머지 부분(원본)을 포워딩시켜 통신이 가능하게 한다.
이러한 터널링 기법에 원래 데이터를 암호화하여 보내는 것이 바로 IPSec Driver의 동작원리이다.
부가적으로 우리가 많이 사용하는 NAT에 대한 원리를 뽀너스로 써보면, NAT는 전송할 패킷에 대한 소스 IP를 자기 자신의 IP(NAT 장비 IP)로 변환하여 데이터를 보내고, 내부적으로 키값(주로 포트 정보)을 가지고 세션 테이블을 유지하면서 자기(NAT 장비)에게 들어오는 패킷에 대해서는 세션 테이블을 보고 해당 IP로 포워딩하는 기법이다.
이번글에서는 SSL VPN에 대해 이야기 해볼까한다.
SSL VPN은 IPSec VPN의 Gateway to Client 방식에서 빈번하게 발생하는 문제에 대한 대안으로 출발되었다.
앞에서 말한바와 같이 IPSec VPN Client를 개발하기 위해서는 IPSec Driver를 개발하여야 하며 IPSec Driver는 Windows 커널단에서 Device Driver 형태로 존재하게 된다. 이 경우 모듈의 불안정이나 다른 Device Driver(Lan Card Driver 등)와의 충돌 문제가 빈번하게 발생하게 되며, 이 경우 우리의 가슴을 철렁하게 만드는 블루 스크린이 뜨게 된다.
이러한 문제점을 해결하기 위해 SSL VPN이 제시되었다. SSL VPN은 https가 사용하는 SSL(TLS)을 이용하여 보안 채널을 형성하는 기법이다.
등장 초기에는 모든 웹브라우져는 SSL을 지원하기 때문에 웹브라우져를 이용하면 별도의 Client 프로그램의 설치 없이 사용이 가능하다는 컨셉이었다. 그러나 이러한 컨셉은 사용자가 사용할 수 있는 어플리케이션이 제한된다는 단점이 있다. 즉, 웹브라우져를 통해 이용할 수 있는 서비스(http, https 등)나 ActiveX 또는 Java Applet 등을 통해 간단하게 지원할 수 있는 서비스(Telnet, SSH)는 사용이 가능하나 업무환경에서 많이 사용하고 있는 C/S 프로그램 환경에 대해서는 지원이 불가능하다.
이러한 한계를 극복하고자 SSL VPN도 Light-Weight한 Client를 이용하게 되었다. SSL VPN Client도 일반적으로 어플리케이션단에서 동작하는 데몬 하나와 P-to-P 터널링 기능을 수행하는 Device Driver로 구성된다. 어플리케이션단에서는 SSL 세션과 송수신 되는 패킷에 대한 암복호화를 담당하고, Device Dirver는 단지 P-to-P 터널링만을 지원한다. 이렇다보니, SSL VPN이 Device Driver를 사용한다고해도 패킷의 암복호화를 포함한 다양한 기능을 수행하는 IPSec Driver보다 안정성이 뛰어나다.
다음 단계로 넘어가려 하니 길이 너무 길어질것 같아 일단은 여기서 마무리 하도록 하고 다음 글에서는 SSL VPN에 대해 좀 더 써보도록 하겠다.
SSL VPN은 IPSec의 Gateway to Client방식에서 Client단에 설치되는 클라이언트의 안정성 문제에 대한 대안으로 출발되었다.
SSL VPN은 언제, 어디서나 인터넷이 되는 PC에서는 손쉽게 VPN을 통해 사내망에 안전하게 접속할 수 있다는 컨셉으로 시작하였다.
초기에는 별도의 클라이언트 설치 없이 단지 웹브라우져를 통해 동작하였다. 이러한 점은 SSL VPN의 장점인 동시에 다양한 환경의 어플리케이션(C/S)을 사용할 수 없다는 단점도 내포하고 있었다.
이러한 상황을 극복하기 위해 SSL VPN 벤더들은 기존의 웹브라우져를 이용하던 프록시 방식에서 좀 더 진보된 SSL VPN 방식을 제안, 개발하게 된다.
그것이 터널링 방식의 SSL VPN이다. 터널링 방식의 SSL VPN은 프록시 방식과 달리 별도의 Client 프로그램이 설치가 되며, Client 프로그램에는 P-to-P 터널링을 위한 Device Driver가
설치되며, 이 경우 IPSec VPN과 동일하게 어플리케이션과 독립적으로 모든 C/S 프로그램에 대한 VPN 기능을 제공할 수 있다.
IPSec VPN과 터널링 방식의 SSL VPN의 기능 구분은 다음과 같다.
IPSec VPN : Device Driver에서 New IP Header를 붙여서 라우팅을 변경하고, 패킷의 암복호화 기능을 수행한다.
SSL VPN : Device Driver에서 P-to-P 터널링을 통해 라우팅을 제공하며, 패킷의 암복호화는 데몬이 수행한다.
이러한 터널링 방식의 SSL VPN이 제공되면서 초기 SSL VPN의 단점인 한정된 어플리케이션의 지원 문제는 해결되었지만 새로운 문제가 제기되었다.
그것이 바로 End Point Security, 즉 접속하는 Client단의 보안 문제이다.
SSL VPN은 인터넷이 되는 PC에서는 모두 사용이 가능하다. 터널링 방식이라고 해도 특정 웹사이트에 접속하면 ActiveX를 이용하여 Client가 자동으로 설치되고, 그 후에는 로그인을 통해 사내망으로 바로 접근이 가능하다.
언제나 사용자 편의성과 보안과는 상반되는 경우가 있다. 인터넷이 되는 PC면 언제, 어디서나 사용할 수 있다는 장점은, 해당 PC가 보안에 취약하다면 많은 문제가 발생할 수 있다는 문제로 직결된다. 예를 들어 해당 PC가 백신이 설치되어 있지 않고, 바이러스, 웜이 걸려 있다면, VPN을 타고, 그대로 사내망으로 바이러스나 웜이 전파될수도 있다. 또한 키스토로크를 감지하는 악성 프로그램이나 화면캡쳐 프로그램과 같은 프로그램이 설치되어 있다면, 사용자가 보고 쓰는 모든 데이터가 그대로 누출될 수도 있다.
이러한 이유로 인해 SSL VPN의 경우 접속하는 클라이언트에 대한 End Point Security에 대한 이슈가 제기되었고, 이러한 부분이 강화되고 있다.