Client VPN 구현하기
AWS Client VPN은 AWS 리소스 및 온프레미스 네트워크의 리소스에 안전하게 액세스할 수 있는 클라이언트 기반 관리형 VPN 서비스입니다. 클라이언트 VPN을 사용하면 OpenVPN 기반 VPN 클라이언트를 사용하여 어디서나 리소스에 액세스할 수 있습니다.
- 사용자는 VPN 연결 응용 프로그램이 설치된 장치를 사용하여 집이나 사내에서 클라이언트 VPN 엔드포인트에 연결합니다.
- 엔드포인트에 연결할 때 SAML, Directory Service를 사용하여 상호 인증 절차를 진행할 수 있습니다.
- 엔드포인트의 연결된 서브넷의 ENI를 통해 VPC에 액세스할 수 있습니다. 이 때 ENI의 IP 주소로 Source NAT됩니다.
- 보안그룹과 인증 규칙을 이용하여 액세스 제어도 가능합니다.
- 온프레미스 환경과의 연결이 필요한 경우 VPC와 온프레미스 환경을 Direct Connect 또는 Site-to-Site VPN을 사용하여 연결할 수 있습니다.
- 액세스 로그는 CloudWatch Logs로 출력할 수 있습니다.
VPC 생성
VPN을 통해 연결한 후 VPC의 리소스에 액세스하기 위해 4개의 사설 서브넷이 있는 VPC를 준비합니다. 두 개는 EC2 인스턴스가 위치하고 나머지 두 개는 VPN 엔드포인트에 연결된 ENI가 위치할 서브넷입니다.
198.19.0.0/16을 CIDR 대역으로 가지는 cvpn-hands-on VPC를 생성합니다.
서브넷 생성
ap-northeast-2a
- Name: Subnet1
- IPv4: 198.19.1.0/24
- Name: Subnet255
- IPv4: 198.19.255.0/24
ap-northeast-2c
- Name: Subnet2
- IPv4: 198.19.2.0/24
- Name: Subnet254
- IPv4: 198.19.254.0/24
EC2 생성
- Name: Server#1
- AMI ID: ami-01d87646ef267ccd7
- Architecture: 64bit(x86)
- 키 페어 없이 계속 진행
- VPC: cvpn-hands-on
- Subnet: subnet1
- 퍼블릭 IP 자동 할당: 비활성화
- 보안그룹: cvpn-hands-on-sg (ICMP - IPv4 /
198.0.0.0/16
) - 스토리지: 8GiB gp2
CloudWatch 생성
Client VPN 엔드포인트 생성시 아래 로그 스트림을 지정합니다.
- 로그 그룹:
/aws/clientvpn
- 로그 스트림:
connection-log
OpenVPN easy-rsa 클라이언트 및 서버의 인증서, 키 생성
OpenVPN easy-rsa를 사용하여 서버와 클라이언트의 인증서와 키를 생성하고 인증서와 키를 ACM에 업로드합니다. 상호 인증(인증서 기반)은 서버와 클라이언트의 인증서와 키를 모두 사용합니다. Active Directory 인증(사용자 기반)은 서버 인증서와 키를 사용합니다.
- OpenVPN easy-rsa 리포지토리의 복제본을 로컬 컴퓨터에 만들어 easy-rsa/easyrsa3 폴더로 이동합니다.
mkdir client-vpn-workshop && cd client-vpn-workshop
git clone https://github.com/OpenVPN/easy-rsa.git && cd easy-rsa/easyrsa3
- 새 PKI 환경을 초기화합니다.
./easyrsa init-pki
- 새 인증 기관(CA)를 빌드하려면 이 명령을 실행하고 프롬프트를 따릅니다.
echo yes | ./easyrsa build-ca nopass
- 서버 인증서와 키를 생성합니다.
./easyrsa build-server-full server nopass
- 클라이언트 인증서와 키를 생성합니다. 클라이언트 인증서와 클라이언트 개인 키는 클라이언트를 설정할 때 필요하므로 반드시 저장해야 합니다.
./easyrsa build-client-full client1.domain.tld nopass
- 서버 인증서와 서버 키, 클라이언트 인증서와 클라이언트 키를 사용자 지정 폴더에 복사합니다.
mkdir -p ~/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/
server.crt | 서버 인증서 |
---|---|
server.key | 서버 인증서 키 |
client1.domain.tld.crt | 클라이언트 인증서 |
client1.domain.tld.key | 클라이언트 인증서의 키 |
ca.crt | CA 인증서 |
ACM 생성
ACM 이동 - 인증서 가져오기 클릭
서버 인증서(ACM) 생성하기
- 아래 명령어 실행 후 인증서 본문에 붙여넣기
cd ~/custom_folder && sed -n -e '/BEGIN/,$p' server.crt | pbcopy
- 아래 명령어 실행 후 인증서 프라이빗 키에 붙여넣기
sed -n -e '/BEGIN/,$p' server.key | pbcopy
- 아래 명령어 실행 후 인증서 체인에 붙여넣기
sed -n -e '/BEGIN/,$p' ca.crt | pbcopy
- 인증서 업로드
클라이언트 인증서(ACM) 생성하기
- 아래 명령어 실행 후 인증서 본문에 붙여넣기
sed -n -e '/BEGIN/,$p' client1.domain.tld.crt | pbcopy
- 아래 명령어 실행 후 인증서 프라이빗 키에 붙여넣기
sed -n -e '/BEGIN/,$p' client1.domain.tld.key | pbcopy
- 아래 명령어 실행 후 인증서 체인에 붙여넣기
sed -n -e '/BEGIN/,$p' ca.crt | pbcopy
- 인증서 업로드
여기까지 OpenVPN easy-rsa를 사용하여 서버 및 클라이언트 인증서 및 키를 생성하여 ACM에 업로드를 완료합니다.
AWS Clinet VPN 엔드포인트 구성
이 항목에서는 AWS Client VPN 엔드포인트를 구성합니다. 인증에는 인증서를 사용한 상호 인증을 사용하여 VPC (198.19.0.0/16)에 대한 액세스만 클라이언트 VPN 연결을 경유하도록 합니다.
VPC - Client VPN 엔드포인트 - 클라이언트 VPN 엔드포인트 생성
설정에서 분할 터널을 활성화하세요. 비활성화된 경우 모든 네트워크 연결이 클라이언트 VPN 연결을 통해 이루어지므로 인터넷 액세스 등에 영향을 줄 수 있습니다. 활성화하면 특정 네트워크(VPC)에 대한 액세스만 클라이언트 VPN 연결을 통해 이루어집니다.
Client VPN 엔드포인트 생성
- 이름: cvpn-hands-on
- 클라이언트 IPv4 CIDR: 100.64.0.0/22 (RFC 6598)
인증 정보
- 서버 인증서 ARN: 서버 인증서 선택
- 인증 옵션: 상호 인증 사용
- 클라이언트 인증서 ARN: 클라이언트 인증서 선택
연결 로깅
- CloudWatch Logs 로그 그룹 이름:
/aws/clientvpn
- CloudWatch Logs 로그 스트림 이름:
connection-log
기타 파라미터
- 전송 프로토콜 - UDP
- VPC ID - cvpn-hands-on
- VPN 포트 443
- 세션 제한 시간 24
이제 생성된 Client VPN 엔드포인트에 연결할 각 서브넷을 선택하여 해당 서브넷에 네트워크 인터페이스를 생성합니다.
대상 네트워크 연결
-
VPC: cvpn-hands-on
-
연결할 서브넷 선택: subnet255
-
VPC: cvpn-hands-on
-
연결할 서브넷 선택: subnet254
VPC의 CIDR를 타겟으로 하여 권한 부여 규칙을 추가합니다.
권한 부여 규칙 추가
- 액세스를 활성화할 대상 네트워크 198.19.0.0/16
- 다음에 대한 액세스 권한 부여: 모든 사용자에게 액세스 허용
여기까지 완료한 후 Client VPN 엔드포인트가 활성화된 후 클라이언트 구성 다운로드를 클릭합니다.
클라이언트 구성 다운로드
이 항목에서는 AWS Client VPN 엔드포인트를 구성했습니다. 인증에는 인증서를 사용한 상호 인증을 사용하여 VPC(198.19.0.0/16)에 대한 액세스만 클라이언트 VPN 연결을 경유하도록 설정했습니다.
Client VPN 다운로드 및 연결
클라이언트 구성 파일 편집
vim ~/downloads/downloaded-client-config.ovpn
- 새 터미널을 열고 아래 명령어로 복사한 클라이언트 인증서 본문을
<cert></cert>
사이에 붙여넣기 합니다.
sed -n -e '/BEGIN/,$p' ~/custom_folder/client1.domain.tld.crt | pbcopy
- 아래 명령어로 복사한 클라이언트 인증서 키를
<key></key>
사이 붙여넣기 합니다.
sed -n -e '/BEGIN/,$p' ~/custom_folder/client1.domain.tld.key | pbcopy
- AWS Client VPN 클라이언트 프로필 선택 -> 클라이언트 구성 다운로드 파일 선택 -> 연결
연결 테스트
ping -c 5 [ec2-private-ip]
netstat -rn
198.19.0.0/16
이 포함되었는지 확인합니다. 클라이언트 CIDR에서 지정한 100.64.0.0/22에서 세분화된 주소가 할당되었음을 알 수 있습니다.
Clean UP
- 클라이언트 VPN 엔드퐁니트 삭제
- 대상 네트워크 연결 해제
- EC2 인스턴스 종료
- CloudWatch 로그 스트림, 로그 그룹 삭제
- ACM 삭제
서울 리전은 Simple AD가 활성화되지 않습니다. Simple AD를 상호 기반 인증으로 사용하기 위해서는 다른 리전을 선택하세요.