WARNING: 이 용도로 사용하려고 하십니까?

혹시 Private Subnet에 있는 EC2 인스턴스에 접근하려는 의도라면, 더 좋은 방법이 있습니다.

아래 링크를 참조하세요.

AWS SSM으로 EC2 인스턴스에 접근하기 (SSH 대체)


목차


AWS Client VPN, 서울 리전 출시!

2019년 11월부터 AWS Client VPN 서비스를 서울 리전(ap-northeast-2)에서도 사용할 수 있게 되었습니다.

대상 독자

  • AWS 서울 리전의 Client VPN 서비스 출시를 기다려 오신 분
  • AWS Client VPN 서비스가 뭔지 모르지만 알고 싶으신 분
  • AWS Client VPN을 사용하려고 하는데 잘 안 되어 혼란스러운 분


AWS Client VPN이 무엇인가?

VPN은 이미 잘 아시겠지만, 내 컴퓨터가 마치 다른 네트워크 상에 있는 호스트인 것처럼 만들어주는 기술입니다.

정부의 https 검열이 강화된 2019년 이후, warning.or.kr 페이지로 리다이렉트 되는 사이트(!)에 들어가기 위한 우회 수단으로 민간에도 많이 알려졌습니다.

AWS Client VPN은 OpenVPN 서버를 AWS에서 쉽게 이용할 수 있도록 한 관리형 서비스로서,

VPN을 통해 AWS 외부에서 VPC의 Private Subnet과 같은 내부망에 연결할 수 있도록 해줍니다.

참고: AWS Client VPN 같은 관리형 서비스를 사용하는 대신 EC2 인스턴스에 직접 VPN 서버를 호스팅할 수도 있습니다.


AWS Client VPN을 사용하면 무엇이 좋은가?

AWS VPC에서 네트워크를 구성할 때,

인터넷으로부터 직접 트래픽을 받는 public 엔드포인트(로드밸런서나 웹서버 등) 외에, 외부와 직접 통신하지 않는 자원은 인터넷에 연결되지 않은 내부 네트워크(private subnet)에 두는 것이 좋습니다.

요약하자면, AWS Client VPN을 사용함으로써 이 실천 사항을 잘 준수할 수 있게 됩니다.

Private Subnet에 있는 호스트는 Public IP가 없기 때문에 인터넷에서 직접 라우팅할 수 없어서 외부의 공격으로부터 보호됩니다.

그런데 때때로 외부 네트워크에서 내부 네트워크에 있는 자원에 접근해야 할 때가 있습니다.

우리 무스마의 예를 들어보면,

개발 환경 RDS DB 인스턴스를 Private Subnet에 두었더니, 개발자 로컬 환경에서 DB에 접근할 수가 없었습니다.

이때 만약 DB 클라이언트를 통해 관리만 할 거라면 Bastion Host를 경유하는 SSH Tunneling을 사용할 수도 있습니다. (아래 그림)

image


그런데 DB 클라이언트로 관리만 하는 것이 아니라, 로컬 네트워크에서 애플리케이션을 돌려가면서 디버깅해야 하기 때문에 결국 DB 인스턴스를 Public Subnet으로 옮기고 인터넷 액세스 가능성True로 변경해서 사용하게 되었습니다.

image

주의: 안 좋은 방법임 (RDS의 인터넷 액세스 여부 옵션의 기본값이 왜 False겠습니까?)


이때 보안을 위해서 VPC의 Security Group(보안 그룹)에서 방화벽 규칙을 잘 적용해서 사용할 수도 있습니다.

하지만 아예 외부에서 라우팅이 불가능한 것과, 방화벽 규칙으로 트래픽을 차단하는 것은 다르겠지요?

아예 못 오는 거 vs. 왔는데 막는 거

에라 모르겠다 하고 네트워크를 이런 식으로 구성하는 개발팀이라면 아무래도 Security Group에도 신경을 안 쓸 가능성이 높기 때문에 (그리고 무심코 모든 트래픽 허용을…) 보안상 취약점을 갖게 됩니다.

하지만 VPN을 사용하면,

  • 외부에서는 직접 도달할 수 없는 Private Subnet에 리소스를 호스팅하는 Best Practice를 준수하면서
  • 로컬 개발 환경 네트워크에서도 Private Subnet에 접근할 수 있습니다.

즉, 내 컴퓨터가 VPC 네트워크에 있는 호스트인 것처럼 만들어주는 것입니다.

image

보호되어야 할 리소스는 Private Subnet에 그대로 두고, 필요하면 VPN Tunnel을 통해 접근합니다.

VPC 네트워크 내부에 있는 호스트처럼 동작할 수 있으니 개발하기도 편리합니다.

그럼 이제 AWS Client VPN을 어떻게 사용하는지 알아보겠습니다.


AWS Client VPN 엔드포인트 생성하기

VPN을 사용하기에 앞서, 먼저 Client VPN 엔드포인트를 생성해보겠습니다.

Client VPN네트워킹 및 컨텐츠 전송 카테고리의 VPC 서비스의 VPN 섹션에 있습니다.

image

image


클라이언트 VPN 엔드포인트 생성을 클릭합니다.

image


VPN 엔드포인트 이름과 VPN Client가 할당받을 IP CIDR을 입력합니다.

CIDR 최소 크기는 /22입니다. 저는 192.168.252.0/22를 사용했습니다. (약 1,000+개 IP 할당 가능)

image


VPN 엔드포인트 이름과 VPN Client가 할당받을 IP CIDR을 입력합니다.

다음은 X.509 인증서를 등록해야 합니다.

image

아래 설명서에서 상호인증을 사용할 때 인증서 생성 및 등록 방법을 설명합니다.

[AWS 설명서] AWS Client VPN :: 클라이언트 인증 및 권한 부여

서버와 클라이언트 인증서 및 키를 생성하여 ACM으로 업로드하는 방법을 절차대로 진행하면 됩니다.

단, 8번까지만 하세요. (클라이언트 인증서는 ACM에 안 올려도 됩니다.)


AWS Certificate Manager에 인증서 등록

위 설명서대로 잘 따라하셨으면 AWS Certificate Manager에 아까 생성한 인증서가 등록된 것을 확인할 수 있습니다.

image

자세히 보면 인증서의 ARN을 확인할 수 있습니다. (기억하세요.)

image


서버 인증서 ARN과 클라이언트 인증서 ARN을 아까 ACM에서 본 인증서로 선택합니다.

주의: AWS 설명서에서는 서버 인증서도 올리고 클라이언트 인증서도 올리는 것으로 나오는데, 그렇게 하면 안 되고 서버 인증서 하나만 올린 다음 서버 인증서 ARN과 클라이언트 인증서 ARN에 모두 서버 인증서 ARN을 선택하면 됩니다.

image


연결 로깅과 기타 선택적 파라미터 입력 옵션을 입력합니다.

연결 로깅은 필요하신 분만 사용하시면 됩니다.

분할 터널(split tunneling) 활성화는 꼭 체크해주세요.

분할 터널은 일부 트래픽만 VPN으로 보내고 다른 연결은 기존 인터넷을 사용합니다.

분할 터널을 사용하지 않으면 모든 트래픽이 VPN으로 가게 됩니다.

(불필요하게 AWS 네트워크에 들어갔다가 오는 겁니다. 비용은 덤)

image


그리고 클라이언트 VPN 엔드포인트 생성을 클릭하면…

image

오류

You are not authorized to specify split tunnel property

안 됩니다. (이런 씨~)

왜 안 되는지는 AWS 매뉴얼의 상태를 보면 짐작이 됩니다.

image

image

영어 설명서에는 있는데 한국어 설명서 메뉴에는 Split-Tunnel on AWS Client VPN Endpoints가 없습니다.

Client VPN이 서울 리전에 이제 막 추가 되어서 일부 기능을 빼먹어서 그런 것 같습니다.

(그런데 왠지 다른 방법이 있을 것 같습니다. 그건 나중에 알아보겠습니다.)

그럼 일단 분할 터널 활성화 옵션을 해제하고 다시 VPN Endpoint를 생성하겠습니다.

image


VPN 엔드포인트가 정상적으로 생성되었습니다.

image


생성 직후에는 상태가 Pending-associate 입니다.

image

지금부터 해야할 것은 이렇습니다.

  1. VPC를 선택하고, 연결할 서브넷(Private Subnet) 추가 (연결 탭에서)
  2. 각 서브넷에 라우트 설정 추가 (라우팅 테이블 탭에서)
  3. IP 대역 진입 승인 (권한 부여 탭에서)


VPC를 선택하고, 연결할 서브넷(Private Subnet) 추가

연결 탭에서 연결을 클릭합니다.

image

여기에 서브넷을 추가하시면 되는데요.

연결할 서브넷 수 만큼 이 과정을 반복하시면 됩니다.

image

이때 주의할 점은, 같은 VPC에 속한 서브넷만 등록할 수 있습니다.

(즉 여러개의 VPC를 섞어서 넣을 수 없습니다. VPC를 섞어넣으면 아래와 같이 오류 메시지가 뜹니다.)

image


각 서브넷에 라우트 설정 추가

라우트 테이블 탭에서 경로 생성을 클릭합니다.

(아까 등록한 서브넷 개수 만큼 기본 경로가 생성되어 있습니다.)

image

역시 아까 등록한 서브넷 개수 만큼 반복해서 등록하시면 됩니다.

image

image

이렇게 다 추가했습니다. (저는 기본 3개 + 추가 3개)

image

근데 이게 뭘 하는 건지는 모르겠습니다 ㅠㅠ (그냥 시키는대로 했는데, 누가 좀 가르쳐주세요.)


IP 대역 진입 승인

권한 부여 탭으로 가서 수신 승인을 클릭합니다.

image

어떤 IP 대역으로 연결하는 것을 허용합니다. Anywhere (0.0.0.0/0)로 하면 무방합니다.

image

image

image


AWS Client VPN 접속하기

이제 VPN 서버로 연결해보겠습니다.

AWS Client VPN은 관리형 서비스이기 때문에 VPN 서버는 숨겨져 있습니다.

대신, VPN 서버로 접속할 수 있는 엔드포인트만 노출됩니다.


클라이언트 구성 파일(*.ovpn) 다운로드

클라이언트 VPN 목록 화면에서 클라이언트 구성 다운로드를 클릭합니다.

AWS VPN은 OpenVPN이라는 프로토콜을 사용합니다.

OpenVPN을 지원하는 VPN 클라이언트 프로그램에 이 설정 파일을 임포트하면 설정이 반영되고, 그대로 VPN에 접속할 수 있습니다.

image


클라이언트 구성 파일 수정

파일(*.ovpn)을 받아서 열어보면 아래의 내용입니다.

필요한 설정이 이미 만들어져 있습니다.

client
dev tun
proto udp
remote cvpn-endpoint-xxxxxxxxxxxxxxxxx.prod.clientvpn.ap-northeast-2.amazonaws.com 443
remote-random-hostname
resolv-retry infinite
nobind
persist-key
persist-tun
remote-cert-tls server
cipher AES-256-GCM
verb 3
<ca>
-----BEGIN CERTIFICATE-----
(생략)
-----END CERTIFICATE-----

</ca>

reneg-sec 0

여기서 일부를 수정할 것입니다.

[AWS 설명서] AWS Client VPN :: 클라이언트 인증 및 권한 부여

설명서에 있는 6. 클라이언트 인증서 및 키를 생성합니다. 대로 클라이언트 인증서를 생성합니다.

주의: 아까 서버 인증서를 만들 때 사용한 것과 같은 CA를 써야 합니다.

VPN 사용자별로 각각 인증서를 따로 만들어주시면 됩니다. (예를 들어, 개발 팀원 당 인증서 한 벌씩)

그리고 ovpn 설정 파일을 수정해줍니다.

client
dev tun
proto udp
remote cvpn-endpoint-xxxxxxxxxxxxxxxxx.prod.clientvpn.ap-northeast-2.amazonaws.com 443
remote-random-hostname
resolv-retry infinite
nobind
persist-key
persist-tun
remote-cert-tls server
cipher AES-256-GCM
verb 3

# 여기만 수정합니다.

ca <CA 파일명>
cert <Certificate 파일명>
key <Private Key 파일명>
reneg-sec 0

.ovpn, ca, .crt, .key 파일을 각 사용자별로 디렉터리에 모아주세요. 이것이 VPN 클라이언트 설정의 한 세트입니다.


OpenVPN 클라이언트 설치

OpenVPN 스펙을 구현한 다양한 VPN 클라이언트가 있습니다.

그중에서 macOS 환경에서 많이 사용한다는(구글에 쳐보니 제일 먼저 나온) Tunnelblick을 사용하겠습니다.

Mac에서 접속하기 (OpenVPN Client)

homebrew로 설치하면 됩니다.

$ brew cask install tunnelblick

image


VPN 설정 파일 등록

Tunnelblick을 설치하면 macOS 메뉴바에 아이콘이 뜹니다. (아래)

image


VPN을 추가하려면 설정 파일(*.ovpn)을 이 메뉴바 아이콘에 드래그하면 됩니다.

(macOS 사용자 인증을 요구할 수도 있습니다.)

image


VPC 보안 그룹 설정

VPN 엔드포인트에 VPC가 한 번 바인딩 된 후, 해당 VPC의 기본 Security Group이 설정되어 있습니다.  보안 그룹 적용을 클릭해서 보안 그룹을 추가하거나 변경할 수 있습니다.

image


VPN 연결

VPN 설정을 추가하면 메뉴에 연결하기가 나타납니다.

연결하기를 클릭합니다.

image

image

연결에 성공했습니다.

주의

지금 설정으로는 VPN을 연결한 상태에서 모든 트래픽이 VPN으로 향하게 됩니다.

쓸데없이 AWS 네트워크를 거쳐서 오게 되므로 지연이 생기고 비용(AWS 트래픽 사용료)도 추가로 듭니다.

사용하지 않을 때는 꼭 연결을 해제하시기 바랍니다.


다른 방법: New Desktop Client for AWS Client VPN

2020-02-04, New Desktop Client for AWS Client VPN 출시 (서울 리전 포함)

OpenVPN 클라이언트를 따로 설치하고 설정하지 않아도 되는 쉬운 방법이 나온 것 같습니다. 확인해보십시오.


기대 효과

AWS Client VPN을 사용함으로써, 중요한 서버 자원을 인터넷과 격리된 네트워크(Private Network)에 배치하는 보안 실천 사항을 준수하면서, Private Subnet에 편리하고 안전하게 접근하여 개발 및 운영 관리를 할 수 있게 됩니다.

당연하지만 보안에 신경쓰는 회사에 한해서


Q & A

Q. 설명서는요?

AWS Client VPN 관리자 안내서

Q. 요금은요?

AWS Client VPN 요금

  1. Client VPN 엔드포인트에 연관(associated)된 서브넷 개수 × $0.15/h

  2. Client VPN 엔드포인트에 접속한(connected) 클라이언트 수 × $0.05/h (하루에 $1.2, 한달에 $36)

(헉! 비싸서 못쓰겠다 ㅠㅠ)


향후 과제

  • 이번에는 아직 VPN의 split tunneling 기능을 적용하지 못했습니다. 소식 기다렸다가 업데이트 하겠습니다.
  • VPN 종량제 요금이 계속 사용하기에 좀 무리인 것 같은데, 전문가에게 요금 컨설팅도 받아보겠습니다.


감사합니다.


References