AWS

AWS 클라이언트 VPN

misankim 2023. 4. 5. 00:30

AWS Network 섹션에 대한 학습 내용 공유합니다. Site-to-Site VPN 혹은 Trasit Gateway의 경우 온프레미스 라우터의 설정이 필요한 부분으로 직접 테스트가 어려워, AWS에서 제공하는 SSL VPN인 클라이언트 VPN 사용법에 대해 학습한 내용을 공유해드립니다.

클라이언트 VPN 엔드포인트 생성을 위한 자체서명 인증서(CA, 서버, 클라이언트) 생성

클라이언트 VPN은 openVPN과 유사하게 동작합니다. 때문에 클라이언트 vpn 엔드포인트 생성 시 서버 인증서 지정이 필요하며, 클라이언트 인증을 위해서는 아래 2가지 방법 중 한가지를 반드시 선택해야합니다.

1) 클라이언트에 대한 인증 방법으로는 클라이언트 인증서를 이용한 상호인증 방식
2) ActiveDirectory 혹은 SAML 인증

여기서 저는 서버 인증서와 클라이언트 인증서를 이용하여 서버-클라이언트 간 상호 인증을 진행하는 방식으로 설정하도록 하겠습니다. 먼저 리눅스/윈도우즈 운영체제 중 원하는 곳에서 자체서명 인증서를 생성한 뒤, AWS Certificate Manager를 통해 자체서명 인증서를 가져온 뒤, 클라이언트 vpn 엔드포인트 생성 시 가져온 인증서를 선택하면 됩니다. 아래는 인증서 생성부터 진행합니다.

AWS 공식 가이드
https://docs.aws.amazon.com/ko_kr/vpn/latest/clientvpn-admin/client-authentication.html#mutual
git clone https://github.com/OpenVPN/easy-rsa.git

cd easy-rsa/easyrsa3

# 초기화
./easyrsa init-pki

# ca 생성
./easyrsa build-ca nopass

# 서버 인증서 생성
./easyrsa build-server-full server nopass

# 클라이언트 인증서 생성
./easyrsa build-client-full client1.domain.tld nopass

mkdir ~/ssl_cert/
cp pki/ca.crt ~/ssl_cert/
cp pki/issued/server.crt ~/ssl_cert/
cp pki/private/server.key ~/ssl_cert/
cp pki/issued/client1.domain.tld.crt ~/ssl_cert/
cp pki/private/client1.domain.tld.key ~/ssl_cert/
cd ~/ssl_cert/

[root@premisan-i ssl_cert]# ll
total 28
-rw------- 1 root root 1172 Oct 14 16:04 ca.crt
-rw------- 1 root root 4460 Oct 14 16:04 client1.domain.tld.crt
-rw------- 1 root root 1704 Oct 14 16:04 client1.domain.tld.key
-rw------- 1 root root 4552 Oct 14 16:04 server.crt
-rw------- 1 root root 1708 Oct 14 16:04 server.key

서버 인증서와 클라이언트 인증서, CA 인증서가 모두 생성되었습니다.

ACM(AWS Certificate Manager)을 통해 인증서 가져오기

PC에서 생성한 인증서를 ACM으로 가져옵니다. AWS 문서에는 aws cli를 통해 가져오는 방식으로 기술되어 있지만 웹콘솔에서 가져와도 동일합니다. openvpn은 인증서의 도메인에 대해 검증하지 않습니다.

 

서버 인증서를 가져온 것과 동일한 방법으로 클라이언트 인증서도 가져옵니다.

서버 인증서와 클라이언트 인증서가 정상적으로 가져와졌습니다.

클라이언트 VPN 엔드포인트 생성

인증서를 가져왔다면 이제 클라이언트 VPN 엔드포인트를 생성합니다. 클라이언트 CIDR의 경우 반드시 VPC에서 사용하는 아이피 대역으로 설정할 필요가 없습니다. 실제로 AWS 리소스로 접근할 때에는 VPC 대역에 해당하는 사설아이피로 NAT되어 전달되기 때문에 혼동을 피하기 위해서는 오히려 10.255.0.0/16과 같이 사용하지 않고 있는 대역으로 설정합니다. 인증 옵션은 상호 인증 사용을 체크하고 서버 인증서와 클라이언트 인증서를 지정합니다. 하단 기타 옵션은 필요에 따라 설정합니다. 굳이 설정 안해도 동작하는데에는 이상이 없습니다.

클라이언트 VPN 엔드포인트 설정

생성이 진행되는 동안 나머지 설정을 진행합니다. 먼저 연결탭으로 이동하여 VPN을 연결할 VPC와 서브넷을 선택합니다. 가용영역당 하나의 서브넷만 선택이 가능합니다.

이제 권한부여 탭으로 이동하여 수신 승인 버튼을 눌러 VPN 액세스를 허용할 대상 클라이언트를 설정합니다.

VPN 클라이언트의 인터넷 액세스를 허용하기 위해 라우팅 테이블 탭으로 이동합니다. 연결 탭에서 추가한 서브넷에 해당하는 대역에 대한 라우팅 테이블은 자동으로 생성되어 있습니다.

여기에 경로 생성 버튼을 눌러 0.0.0.0/0 대역에 대한 라우팅 테이블을 추가해줍니다. 0.0.0.0/0 대역에 대한 라우팅 테이블을 추가하지 않으면, vpn 연결 시 클라이언트는 인터넷 액세스가 제한됩니다.

모든 설정을 완료한 뒤, 잠시 기다리면 엔드포인트의 상태가 사용 가능으로 변경됩니다.

클라이언트 구성 다운로드 버튼을 눌러 vpn 접속에 사용할 설정 파일을 다운로드합니다.

openvpn 클라이언트 다운로드/설치

vpn 을 통해 AWS 리소스로 접근할 PC에서 openvpn 클라이언트를 다운로드 및 설치합니다. openvpn 다운로드 센터(https://openvpn.net/community-downloads/)에서 OS에 맞는 클라이언트 파일을 다운로드합니다. 전 윈도우즈용 파일인 WINDOWS 64-BIT MSI INSTALLER를 다운로드하여 설치했습니다.

클라이언트 구성 파일 편집

다운로드한 vpn 구성파일의 모습입니다. 우리는 상호 인증 방식으로 접속할 것이기 때문에 구성 파일에 <cert>~</cert>단락과 <key>~</key>단락을 추가하여 클라이언트 인증서에 대한 정보를 추가합니다.

<cert> -> 클라이언트 인증서 파일 본문
-----BEGIN CERTIFICATE-----
MIIDVjCCAj6gAwIBAgIRANTM3QvN+9deS8wjH5iwI8swDQYJKoZIhvcNAQELBQAw
FjEUMBIGA1UEAwwLRWFzeS1SU0EgQ0EwHhcNMjAxMDE0MDcwMzAyWhcNMjMwMTE3
MDcwMzAyWjAdMRswGQYDVQQDDBJjbGllbnQxLmRvbWFpbi50bGQwggEiMA0GCSqG
...
+Nym9QJ05yRhpcqvnlJK/qeOyCD0YTu7k9RTQZx4s+ZDzmy4qjkDrs/f1qJ0o7p2
FAuFiQ14112e72luLj/eOl84GIgSvmj0RDnYOGgeTS+nnSN/j9GYdZe3gTXep6hQ
oTRmF0I/mUnQjiRt22ZfDsuOcyAJJVYlaZxLthU2qIbvbfPLCeKzSDfl
-----END CERTIFICATE-----

</cert>

<key> -> 클라이언트 키 파일 내용
-----BEGIN PRIVATE KEY-----
MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDDi3nfABF5iokf
OYi8t9YADVHQQllhItk3J7dmNmyHN+W+MqyayG/PNySidQI2ep5mn7aVqCzRlg+p
jtrR58RztVnpxgicHbdqReL4+Z4e4gSRXkjSZ6AzbjsTGyBnvIBcEpr5NrXTu2L5
...
hF/9+rNQcccvG0pH4+SDjNskarR9NGJw8vziPMmT1QKBgFaLdhp83iaSqL0bIG1F
BRgL1+2kd8CCQ2i6LSeQRn9CaVl7RLRL+0DY79mf2XynC3+SPoINBaiR9QRe84m/
2v54ESTXMciJgVrZbdqHoxLvg1bBCW60EaJkITSLLeWTuEgVyBjmFwW89xJOzbAF
dNAc95Gqs7tn5lARFNadKfWU
-----END PRIVATE KEY-----
</key>

클라이언트 인증서 내용을 추가한 구성 파일입니다.

openvpn 클라이언트를 통해 vpn 접속

openvpn gui 프로그램 실행 후 트레이의 아이콘을 우클릭하여 파일 불러오기를 누릅니다.

다운로드하여 편집한 구성파일을 선택합니다.

이제 다시 트레이 아이콘을 우클릭하여 설정파일의 이름과 동일하게 생성된 항목의 연결 버튼을 눌러 vpn 연결을 시도합니다.

아래와 같이 팝업 창이 나타나고 정상적으로 연결이 되면 연결되었다는 내용의 알림이 발생합니다.

연결이 완료되면 트레이아이콘의 색이 변하며 할당된 아이피를 표시합니다.

vpn 연결 확인 및 aws 리소스에 접속

정상적으로 vpn에 연결이 되었다면 윈도우즈의 경우 ipconfig 명령어를 통해 정상적으로 아이피를 받아왔는지 확인합니다.

VPC에 구성되어 있는 EC2 인스턴스의 사설아이피를 통해 SSH 접속을 해봅니다. (주의! SAP 에 접속되어 있는 경우 10.0.0.0/8 대역에 대해 SAP 인터페이스로 라우팅 설정이 되어 있기 때문에 openvpn 접속 테스트 시 sap은 일시정지 시켜둡니다) SSH 접속을 위해서는 동일 대역(10.0.0.0/16)에 대해 SSH 액세스를 허용하는 보안그룹 설정이 필요합니다.

또한 다른 서브넷에 있는 EC2 인스턴스에도 정상적으로 접속되는 것을 확인할 수 있습니다.

연결을 끊을 때에는 트레이아이콘 우클릭하여 연결 해제를 선택합니다.

연결 탭에서 vpn 연결에 대한 로그를 확인할 수 있습니다.

결론

클라이언트 VPN 엔드포인트를 이용하여 AWS 에 생성된 private 리소스에 접근하는 방법을 알아보았습니다. 처음에는 설정이 다소 어렵게 느껴지지만 잘 활용한다면 private 리소스를 효과적으로 관리할 수 있는 방법이 될 것 같습니다.