AWS Client VPN Endpoint Hands-on


AWS Client VPN Endpoint 만들기

개요

AWS에서 운영중인 서버의 경우 보안상의 이유로 VPC 내에서만 접속이 가능하도록 하는 경우가 많습니다. 이 경우 개발이나 기타 관리 등의 작업을 하기 위해서 노트북에서 직접 연결해야 하는 경우가 생긴다. 여기에 접속 할 수 있는 방법이 여러가지가 있습니다.

  1. bastion host를 동일 VPC내에 public하게 EC2로 띄워서 ssh tunneling 하는 것이 가장 많이 사용하는 방법입니다.
  2. nginx 같은 reverse proxy를 동일 VPC내에 public 하게 생성하여 접속하는 방법도 있습니다.
  3. 물리적으로 VPN 장비를 AWS Direct Connect 로 연결한 뒤 해당 VPC에 Transit Gateway 로 연결하는 방법도 있습니다.

거기에 추가로 AWS에서 제공해주는 Client VPN Endpoint 서비스를 사용하는 방법도 있습니다.

해당 VPN 내에 외부에서 접속할 수 있는 Endpoint를 생성하여 VPN 서비스처럼 접속을 하면 VPC내의 자원에 접속이 가능하게 됩니다.

AWS Client VPN Endpoint란?

AWS Client VPN Endpoint는 Amazon Web Services (AWS)에서 제공하는 관리형 클라이언트 기반 VPN 서비스입니다. 이 서비스를 사용하면 사용자는 어디서나 안전하게 AWS 또는 온프레미스 네트워크에 액세스 할 수 있습니다. AWS Client VPN은 OpenVPN 기반으로 작동하므로, 대부분의 OpenVPN 호환 클라이언트 애플리케이션과 호환됩니다.

주요 특징 및 이점:

  1. 확장성: AWS Client VPN은 수천 명의 사용자에게 동시에 VPN 액세스를 제공할 수 있습니다.

  2. 높은 가용성: 여러 가용 영역(AZ)에 걸쳐서 배포되므로, 장애 복구와 높은 가용성이 기본적으로 제공됩니다.

  3. 보안: AWS Client VPN은 두 가지 유형의 인증 메커니즘을 제공합니다: 사용자 인증 및 디바이스 인증. 이를 통해 사용자와 디바이스 모두에 대한 액세스를 제어할 수 있습니다.

  4. 중앙 집중식 모니터링 및 로깅: CloudWatch, VPC 플로우 로그 및 CloudTrail과의 통합을 통해 로깅 및 모니터링이 가능합니다.

  5. 연결 규칙: 사용자별, 그룹별 또는 전체 네트워크에 대한 접근 권한을 세밀하게 제어할 수 있습니다.

  6. 통합: AWS Client VPN은 AWS의 다른 서비스와 통합하여 작동합니다. 예를 들어, ACM (AWS Certificate Manager)를 사용하여 SSL/TLS 인증서를 생성하고 관리하거나, Directory Service를 사용하여 사용자를 인증할 수 있습니다.

  7. 분석: Client VPN 엔드포인트의 연결 및 사용 데이터에 대한 측정치를 통해 연결 통계, 연결 지속 시간 및 클라이언트 OS 유형과 같은 세부 정보를 확인할 수 있습니다.

구현 시 고려해야 할 주요 사항:

  • 비용: AWS Client VPN은 사용한 시간과 데이터 전송량에 따라 비용이 발생하므로 비용 모델을 이해하는 것이 중요합니다.
  • 인증: 사용자와 디바이스 모두에 대한 인증 메커니즘을 설정해야 합니다.
  • 네트워크 구성: AWS VPC와 연결하거나 온프레미스 네트워크와 연결하기 위해 필요한 네트워크 구성을 설정해야 합니다.

요약하면, AWS Client VPN Endpoint는 확장성 있고 안전하게 원격 액세스를 제공하는 관리형 서비스입니다. 이를 통해 사용자는 AWS 자원과 온프레미스 자원에 안전하게 액세스 할 수 있습니다.

AWS Client VPN Endpoint 생성하기

그럼 AWS Client VPN Endpoint를 생성하는 과정을 진행해 보겠습니다.
참고로 이 블로그를 작성하는 2023-09-17 에는 정상적으로 생성 및 동작하는 것을 확인했습니다. 저도 이 작업을 하면서 참고한 블로그 및 동영상 등이 있었는데, 모두 정상적으로 동작하지 않았습니다. 시간이 지남에 따라 outdated 될 수도 있음을 미리 양해드립니다.

1. 서버와 클라이언트 인증서 생성 및 ACM 등록

VPN 접속에 사용할 클라이언트 및 서버의 인증서를 생성하여 ACM에 등록해야 합니다. OpenVPN을 통해서 접속할때 이 인증서를 사용할 예정입니다.

AWS Client VPN 관리자 안내서 - 상호 인증 을 참고해서 진행했습니다.

  1. OpenVPN easy-rsa 설치 및 이동
    git clone https://github.com/OpenVPN/easy-rsa.git
    cd easy-rsa/easyrsa3
    
  2. PKI 환경시작
./easyrsa init-pki

pki라는 폴더가 만들어졌으며 pki/vars에 있는 설정을 사용할 것이라는 메세지가 출력됩니다.

  1. CA(인증 기관)를 빌드
./easyrsa build-ca nopass

pki/ca.crt 에 CA가 생성되었습니다.

  1. 서버 인증서 및 Key 생성
./easyrsa build-server-full server nopass

아래 두 파일이 생성되었다는 메세지가 확인됩니다.

  • Certificate created: pki/issued/server.crt
  • Inline file created: pki/inline/server.inline
  1. 클라이언트 인증서 및 키를 생성
./easyrsa build-client-full client1.domain.tld nopass

아래 두 파일이 생성되었다는 메세지가 확인됩니다.

  • Certificate created: pki/issued/client1.domain.tld.crt
  • Inline file created: pki/inline/client1.domain.tld.inline

각각 다른 client 인증서를 생성하려며 이 과정에서 client1.domain.tld 부분을 바꿔가면서 실행하면 됩니다.

  1. 여기서 생성한 파일들을 실제로 사용할 폴더로 복사합니다.
mkdir ~/custom_folder/
cp pki/ca.crt ~/custom_folder/
cp pki/issued/server.crt ~/custom_folder/
cp pki/private/server.key ~/custom_folder/
cp pki/issued/client1.domain.tld.crt ~/custom_folder
cp pki/private/client1.domain.tld.key ~/custom_folder/
cd ~/custom_folder/
  1. 이 인증서들을 AWS ACM에 등록합니다.
aws acm import-certificate --certificate fileb://server.crt --private-key fileb://server.key --certificate-chain fileb://ca.crt
aws acm import-certificate --certificate fileb://client1.domain.tld.crt --private-key fileb://client1.domain.tld.key --certificate-chain fileb://ca.crt

2. Client VPN Endpoint 생성

AWS Console에서 AWS Client VPN Endpoint 화면으로 이동합니다.

  1. Create client VPN endpoint
    • Name tag, Description 항목은 각자 식별할 수 있는 정보를 입력하시면 됩니다. (optional)
    • Client IPv4 CIDR : VPN에 부여할 ip 범위입니다. 참고로 이미 다른 subnet에 부여한 ip 범위를 입력할 경우 해당 subnet으로 routing 연결을 못하게 되므로 현재 VPC에서 사용하지 않는 범위로 설정하는 것이 좋습니다. 아무 범위나 입력이 가능하지만, 그럴경우 기존에 생성한 Security Group이나 기타 ip 범위를 활용한 allow/block 정책등을 수정해줘야하므로 가능하면 해당 VPC내에서 아직 사용하지 않는 CIDR로 설정하는 것이 편리합니다.
    • Server certificate ARN : 앞에서 등록한 server 인증서를 ACM에서 찾아서 선택합니다.
    • Use mutual authentication 를 체크하면 Client certificate ARN 를 선택하는 창이 나옵니다. 여기에 앞에서 등록한 client 인증서를 ACM에서 찾아서 선택합니다.
    • DNS는 선택하지 않아도 됩니다.
    • Enable split-tunnel 를 체크합니다. 그렇지않으면 모든 요청이 다 VPN으로 전달되므로 인터넷 연결을 사용하지 못하게 될 수도 있습니다.
    • VPC 및 Security Group을 선택합니다.
    • Create client VPN endpoint 버튼을 누르면 생성됩니다.
  2. 연결한 Subnet 선택

VPN Endpoint가 생성되면 Pending-associate 상태로 표시됩니다.

해당 VPN Endpoint를 선택한 다음에 Target network associations 탭으로 가서 Associate target network 버튼을 눌러서 연결할 VPC 및 Subnet들을 선택합니다. 이 경우 VPN Endpoint 생성시 설정한 CIDR 범위와 겹치는 subnet은 선택하지 못합니다.

상태가 Avaliable 가 될때까지 시간이 오래 걸립니다. (수십분 정도)

3. Client 구성파일 수정

VPN Endpoint를 선택하면 우측 상단에 Download client configuration 라는 버튼이 있습니다. 이걸 눌러서 구성파일을 다운로드 받습니다.

이 파일을 수정해줘야 합니다.

해당 파일을 열어서 아래부분만 수정하면 됩니다.

ca <CA 파일명>
cert <Certificate 파일명>
key <Private Key 파일명>

여기서 파일명을 입력하는 것이 아니라 내용을 다 넣어도 됩니다.

<ca>
  CA 파일내용
</ca>
<cert>
  Certificate 파일내용
</cert>
<key>
  Private Key 파일내용
</key>

4. OpenVPN 프로그램 다운로드 및 Client 구성파일 등록

AWS Client Endpoint는 OpenVPN 규격을 지원하므로 OpenVPN을 지원하는 프로그램 아무거나 다운로드 받아서 사용이 가능합니다. 필자는 macos를 사용하고 있어서 tunnelblick을 설치했습니다.

brew install --cask tunnelblick

설치후 위에서 수정한 구성파일을 등록해줍니다. 그리고 AWS Console에서 Client VPN Endpoint가 Avaliable 상태가 된 것을 확인한 후에 연결을 하면 됩니다.

References


이 글이 도움이 되셨다면 공감 및 광고 클릭을 부탁드립니다 :)