ClientVPN으로 AWS 환경 접속하기
안녕하세요 클래스메소드의 이수재입니다.
이번에 프로젝트를 하며 오랜만에 ClientVPN을 사용할 일이 있었습니다.
내용을 메모 할 겸 증명서 발급부터 상호 인증 방식 ClientVPN의 생성까지 정리해보았습니다.
증명서 및 키 만들기
전제
보통 회사 내에서 사용하는 서버 및 증명서의 경우 Easy RSA로 증명서/키를 발급하고 관리하는 경우가 많다고 생각합니다.
이 글에서도 EasyRSA를 사용하여 증명서와 키를 발급합니다.
EasyRSA의 설치를 위해서는 인터넷 접속이 필요합니다. 인터넷에 접속할 수 없는 환경이라면 인스톨에 필요한 파일을 S3 등에 저장하고 이용해주세요.
Easy RSA 인스톨
아래 커맨드를 실행하여 Easy-RSA를 인스톨합니다.
$ git clone https://github.com/OpenVPN/easy-rsa.git
$ cd easy-rsa/easyrsa3
git이 안되는 경우, wget으로 인스톨합니다.(25.8 기준, 최신 버전)
$ wget https://github.com/OpenVPN/easy-rsa/releases/download/v3.2.3/EasyRSA-3.2.3.tgz
$ tar zxfv EasyRSA-3.2.3.tgz
$ cd EasyRSA-3.2.3/
(옵션) 증명서 유효 기간 설정
Easy RSA에서 발행하는 CA와 증명서의 유효 기간은 CA:3,650 일(10년), 증명서 : 825일 입니다.
ClientVPN을 이용하기 위해서는 유효 기간 만료 전에 증명서를 다시 업로드 할 필요가 있으므로 유효 기간에 대해 검토가 필요합니다.
유효 기간 수정이 필요하다면 아래 커맨드로 vars 파일을 복사해주세요.
# easyrsa3 디렉터리에서 실행
cp vars.example vars
이어서 원하는 에디터로 파일을 수정합니다.
131、134 번째 줄의 유효 기간 변수를 수정하면 적용됩니다.
set_var
앞의 # 을 지우고 원하는 유효 기간을 지정합니다.
EASYRSA_CA_EXPIRE
는 CA의 유효 기간이며, EASYRSA_CERT_EXPIRE
는 서버 및 클라이언트 증명서/키의 유효기간입니다.
# 예(원본에는 # 가 앞에 붙어있습니다.)
...
# In how many days should the root CA key expire?
#
set_var EASYRSA_CA_EXPIRE 36500
# In how many days should certificates expire?
#
set_var EASYRSA_CERT_EXPIRE 8250
...
새로운 PKI 환경 초기화
아래 커맨드로 새로운 PKI 환경으로 초기화합니다.
$ ./easyrsa init-pki
새로운 인증 기관(CA) 생성
아래 커맨드로 새로운 인증 기관(CA)을 생성합니다.
$ ./easyrsa build-ca nopass
Common Name(CN)을 입력해야하는데 기본 값인 Easy-RSA CA도 문제 없습니다.
원하는 CN이 있다면 입력하고 진행합니다.
문제 없이 실행되었다면 CA creation complete.
가 표시됩니다.
생성된 CA는 아래 커맨드로 자세한 내용을 확인할 수 있습니다.(CA 뿐만 아니라 이 뒤에 생성하는 서버/클라이언트 증명서도 확인가능합니다.)
# expire가 유효기간, Issuer가 설정한 CN
$ openssl x509 -text -noout -in pki/ca.crt
Certificate:
Data:
Version: 3 (0x2)
Serial Number:
7f:fa:f5:1c:c7:c8:63:27:a6:dd:89:e3:a3:f2:c4:41:6b:ec:ed:b6
Signature Algorithm: sha256WithRSAEncryption
Issuer: CN=GHC CVPN CA
Validity
Not Before: Aug 9 15:33:43 2025 GMT
Not After : Aug 7 15:33:43 2035 GMT
Subject: CN=GHC CVPN CA
Subject Public Key Info:
...
서버 증명서 및 키 생성
아래 커맨드를 실행하여 서버 증명서와 키를 생성합니다.
# ./easyrsa --san=DNS:{서버 도메인} build-server-full {이름} nopass
$ ./easyrsa --san=DNS:server build-server-full server nopass
이어지는 입력창에서 「yes」 를 입력합니다.
문제없이 생성되었다면 Certificate created at: {저장 디렉터리}
가 표시됩니다.
클라이언트 증명서와 키 생성
아래 커맨드로 클라이언트 증명서를 생성합니다.
가능하다면 액세스가 필요한 유저 수 만큼 증명서를 생성합니다.
# ./easyrsa build-client-full {클라이언트 도메인} nopass
$ ./easyrsa build-client-full client1.domain.tld nopass
클라이언트 증명서 생성이 완료되면 Certificate created at: {저장 디렉터리}
가 표시됩니다.
(옵션) 서버 증명서와 클라이언트 증명서 기간 다르게하기
서버와 클라이언트 증명서가 같은 변수를 사용하도록 되어 있기 때문에 클라이언트 증명서 발급 전에 변수를 재 정의하면 됩니다.
# 클라이언트 증명서 1년으로 설정하기
EASYRSA_CERT_EXPIRE=365 ./easyrsa build-client-full client1.domain.tld nopass
주요 파일들 이동해두기
Easy-RSA 아래의 디렉터리에 저장되어 있는 주요 파일들을 다른 디렉터리에 복사합니다.
$ 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}
클라이언트 증명서와 키는 파일이 필요한 유저에게 배포하고 ca와 서버 증명서 및 키는 ACM에 등록합니다.
ACM에 증명서 업로드하기
서버 증명서와 키, CA를 ACM에 업로드합니다.
이 글에서는 콘솔에서 등록하는 방법으로 설명합니다.
AWS 콘솔 화면에서 ACM을 검색하여 「Certificate Manager」에 들어간 후, 「가져오기」 버튼을 클릭합니다.
인증서 본문에는 서버 증명서(~.crt)의 내용, 인증서 프라이빗 키(~~.key)에는 서버 키의 내용, 인증서 체인에는 CA 증명서(ca.cert)의 내용을 입력합니다.
클라이언트 증명서 등록은?
CA가 같은 경우 클라이언트 증명서는 등록하지 않아도 됩니다.
ClientVPN을 생성할 때 필요한 클라이언트 증명서의 ACM을 설정해야하지만 서버 증명서의 ACM과 같은 arn을 지정해도 문제없습니다.
클라이언트 인증서를 반드시 ACM에 업로드하지 않아도 됩니다. 서버 및 클라이언트 인증서가 동일한 인증 기관(CA)에 의해 발급된 경우, Client VPN 엔드포인트를 생성할 때 서버 및 클라이언트 모두에 대해 서버 인증서 ARN을 사용할 수 있습니다. - 공식 문서
Client VPN으로 연결하기
Client VPN 생성하기
마찬가지로 콘솔 화면을 기준으로 설명하겠습니다.
콘솔에서 VPC를 검색하여 들어갑니다.
왼쪽의 메뉴 중 「Client VPN 엔드포인트」에 들어간 후, 「클라이언트 VPN 엔드포인트 생성」 버튼을 클릭합니다.
이 중 중요한 메뉴에 대해서만 설명해보겠습니다.
옵션 이름 | 설명 | 보충 |
---|---|---|
클라이언트 IPv4 CIDR | ClientVPN 자체의 CIDR | CIDR 블록은 /12보다 크거나 /22보다 작은 크기로 만들 수 없습니다. Client VPN 엔드포인트와의 연결이 확립되었을 때 클라이언트에 할당됩니다 IP의 레인지를 정의합니다. 일반적으로 ClientVPN을 이용하는 IP 주소 (즉 동시접속) 의 2배의 수를 포함하는 클라이언트 CIDR 범위를 지정하는 것이 좋습니다. - 공식 문서 |
인증 정보 | 인증 방식과 인증서의 arn을 지정합니다 | 서버/클라이언트 증명서의 발급 CA가 같은 경우 서버 인증서 ARN과 클라이언트 인증서 ARN은 동일한 ACM의 ARN을 지정해도 됩니다 |
연결 로깅 | ClientVPN에 접속한 상세 로그를 기록합니다 | |
클라이언트 연결 핸들러 | AWS Lambda를 이용하여 특정 IP 주소에서만 연결을 허용하는 등의 세밀한 컨트롤 설정 가능 | |
DNS 서버 1/2 IP 주소 | 사용하고 있는 DNS 서버의 주소 | 별도로 사용하는 DNS 서버가 있다면 주소를 입력합니다 |
분할 터널 활성화 | ClientVPN이 연결된 VPC CIDR에 대해서만 VPN을 통하도록 라우팅하는 기능 | 상세 내용 - 공식 문서 |
이 외에 옵션 값들을 설정하고 VPN을 생성합니다.
네트워크 연결하기
생성한 VPN의 ID를 클릭하면 상세한 내용을 확인할 수 있습니다.
우선 VPN을 연결할 서브넷을 지정하기 위해 네트워크를 연결합니다.
아래의 「대상 네트워크 연결」 탭에서 원하는 서브넷을 지정합니다.
가능하다면 프라이빗한 서브넷에 연결하는 것을 권장하고 있습니다.
라우팅 테이블 등록하기
네트워크 연결이 설정되면 연결된 서브넷이 포함된 VPC의 CIDR가 자동으로 등록되어 있습니다.
만약 VPC 피어링 등을 통해 다른 VPC와 통신할 필요가 있다면 해당 CIDR를 등록합니다.
「라우팅 테이블」 탭에서 「경로 생성」을 눌러 라우팅을 추가합니다.
「대상 네트워크 연결을 위한 서브넷 ID」에는 위에서 연결한 서브넷을 지정합니다.
권한 부여 규칙 설정하기
권한 부여 규칙은 네트워크에 대한 액세스 권한을 부여하는 방화벽의 역할을 합니다.
권한 부여 규칙을 추가하여 특정 클라이언트에게 지정된 네트워크에 대한 액세스 권한을 부여합니다.
단, 상호 인증 방식으로 작성한 VPN이라면 유저 그룹을 특정할 수 없습니다.
중요 사항을 공식 문서에서 가져왔습니다.
- 대상 네트워크에 대한 액세스를 허용하려면 권한 부여 규칙을 명시적으로 추가해야 합니다. 기본 동작은 액세스를 거부하는 것입니다.
- 대상 네트워크에 대한 액세스를 제한하는 권한 부여 규칙은 추가할 수 없습니다.
- 0.0.0.0/0 CIDR은 특수한 경우로 처리됩니다. 이것은 권한 부여 규칙이 생성된 순서에 관계없이 마지막으로 처리됩니다.
- 0.0.0.0/0 CIDR은 '모든 대상' 또는 '다른 권한 부여 규칙에 의해 정의되지 않은 대상'으로 생각할 수 있습니다.
- 가장 긴 접두사 일치가 우선적으로 적용되는 규칙입니다.
「권한 부여 규칙」 탭에서 「권한 부여 규칙 추가」 버튼을 클릭하여 추가할 수 있습니다.
라우팅 테이블에는 VPC CIDR에 대한 라우팅이 추가되어있지만 권한 규칙에는 추가되어 있지 않습니다.
연결된 VPC에 연결할 필요가 있다면 우선 VPC에 대한 규칙부터 추가합니다.
클라이언트 구성 파일 설정하기
클라이언트 쪽에서 VPN에 연결하기 위해서는 구성 파일을 작성할 필요가 있습니다.
사용자 기반 인증 방식이라면 구성 파일을 다운로드 할 수 있는 url을 제공할 수 있지만 상호 인증 방식에서는 관리자가 직접 구성 파일을 공유할 필요가 있습니다.
VPN의 상세 화면에서 「클라이언트 구성 다운로드」를 클릭하여 템플릿을 다운로드 할 수 있습니다.
이 파일을 액세스가 필요한 유저들에게 공유합니다.
템플릿을 공유 받은 유저는 이전에 공유받은 클라이언트 증명서와 키의 내용을 템플릿에 입력합니다.
구성은 아래와 같이 됩니다.
...
...
<ca>
-----BEGIN CERTIFICATE-----
{CA의 내용. 기본적으로 입력되어 있음}
-----END CERTIFICATE-----
</ca>
<cert>
-----BEGIN CERTIFICATE-----
{클라이언트 증명서의 내용}
-----END CERTIFICATE-----
</cert>
<key>
-----BEGIN PRIVATE KEY-----
{클라이언트 키의 내용}
-----END PRIVATE KEY-----
</key>
...
...
기본적으로 입력되어 있는 <ca>
블록 아래에 <cert>
와 <key>
블록을 추가로 입력해야 합니다.
공식 문서에도 같은 내용이 기재되어 있습니다.
VPN 에 접속
구성 파일 생서까지 완료되었다면 VPN에 접속하는 일만 남았습니다.
우선 VPN에 연결하기 위한 프로그램을 인스톨합니다.
AWS 에서 제공하고 있는 ClientVPN 도 괜찮고 OpenVPN과 같이 다른 VPN 프로그램도 괜찮습니다.
이 글에서는 AWS에서 제공하고 있는 ClientVPN 기준으로 설명합니다. [1]
ClientVPN 툴의 인스톨이 끝났다면 우선 프로필을 등록합니다.
메뉴의 「파일」-「프로필 관리」를 클릭합니다.
「프로필 추가」를 클릭하고, 원하는 프로필 이름과 위에서 생성한 구성 파일을 지정합니다.
프로필이 추가되면 연결버튼이 생성됩니다.
연결을 클릭하고 문제없이 연결되면 연결 완료가 표시되고 IP가 지정됩니다.
보충
다양한 시나리오에서 ClientVPN이 사용될 것이라 생각됩니다.
이러한 시나리오에 대해서 AWS에서 제공하고 있는 가이드가 있으므로 참고해주세요.
한가지 주의 사항으로는 EC2나 다른 액세스가 필요한 리소스에 보안 그룹을 설정할 때, 접근을 허용하는 범위는 ClinetVPN의 CIDR가 아니라 연결된 서브넷의 CIDR 입니다.
ClientVPN이 서브넷에 연결되면 ENI가 해당 서브넷에 생성되고, 이 ENI를 통해서 여러 리소스에 접근하기 때문에 리소스에서 인식하는 IP는 VPN이 아닌 ENI의 IP를 인식하게 됩니다.
ENI의 IP는 서브넷의 CIDR 범위 안에서 지정되기 때문에 서브넷의 CIDR를 추가할 필요가 있습니다.
마무리
서버 증명서의 유효기간이 만료되면 ACM에 다시 등록할 필요가 있습니다.
갱신은 간단하므로 링크로 대신합니다.
긴 글 읽어주셔서 감사합니다.
오탈자 및 내용 피드백은 must01940 지메일로 보내주시면 감사합니다.
문의 사항은 클래스메소드코리아로!
클래스메소드코리아에서는 다양한 세미나 및 이벤트를 진행하고 있습니다.
진행중인 이벤트에 대해 아래 페이지를 참고해주세요.
AWS에 대한 상담 및 클래스메소드 멤버스에 관한 문의사항은 아래 메일로 연락주시면 감사드립니다!
Info@classmethod.kr
개인적으로는 상세한 로그 등을 확인하기 쉬운 OpenVPN이 더 편한 것 같습니다. ↩︎