Search
🔐

#2편 AWS에서 Private DB 만들기 | VPN 설정하기

subtitle
VPC, VPN 설정으로 안전하게 DB 관리하기
Tags
aws
Created
2021/06/28
2 more properties

바로가기

VPN 설정

VPN 연결

그 외 할일

2.
code build에서 vpn 연결
간략

로컬에서 Private DB에 접근하는 법

로컬에서 private DB에 접근하는 법은 3가지가 있다. 읽어보고 자신에게 맞는 방법을 선택하면 된다. 이 포스트는 VPN을 통해 연결하는 방법에 대해 설명한다.
AWS의 direct connect
AWS의 direct connect 링크는 사용자의 인터넷 네트워크를 이더넷 광섬유 케이블이 깔려있는 AWS의 Direct Connect Location에 연결시킨다. 케이블 한쪽에는 사용자의 라우터, 다른 한쪽에는 AWS DC 라우터를 연결시킨다. 이 연결을 통해 사용자는 사용자의 네트워크 경로에 있는 ISP를 우회하여 퍼블릭 AWS 서비스 또는 아마존 VPC에 대한 Virtual Interface를 생성할 수 있다.
source: AWS
VPN 연결
위키에 따르면 virtual private network는 공중 네트워크를 통해 한 회사나 몇몇 단체가 내용을 바깥 사람에게 드러내지 않고 통신할 목적으로 쓰이는 사설 통신망을 말한다.
VPN을 통해 AWS 외부에서 VPN 내부의 프라이빗 서브넷에 연결할 수 있다.
AWS에서 클라이언트 VPN 엔드포인트를 설정하고 서버와 클라이언트 상호인증 키를 발급하여 ovpn 클라이언트를 통해 private db에 연결해야 한다.
출처: AWS
Bastion Host
세번째는 Bastion Host(배스천 호스트)를 사용한다. EC2 인스턴스를 점프(Bastion) 서버로 사용하여 로컬 컴퓨터에서 프라이빗 DB 인스턴스에 연결할 수 있다. AWS 문서에 의하면 VPN 또는 AWS Direct Connect를 사용해 연결하는 것이 가장 좋고 그 둘을 사용할 수 없는 경우에 배스천 호스트를 사용하라고 한다.

VPN으로 프라이빗 서브넷에 연결하기

인증 정보 추가

상호인증과 인증서
인증서는 인증 기관(CA)에서 발행한 디지털 형태의 증명서이다. Client VPN에서는 인증서를 사용하여 Client VPN 엔드포인트에 연결하려고 시도하는 클라이언트를 검증한다.
상호인증이란 Client VPN이 인증서를 사용하여 클라이언트와 서버 간 통신을 인증하는 것을 말한다. 상호인증을 위해서는 서버 인증서와 클라이언트 인증서 및 키를 생성해야 한다. 클라이언트 인증서는 연결하려는 로컬 컴퓨터에 따라 하나 이상이 될 수 있다.
인증서 추가하기
연결이 필요한 컴퓨터 수만큼 클라이언트 인증서를 추가할 수 있다. 퇴사자가 생기는 경우에는 클라이언트 인증서를 해지하면 된다. 인증서를 추가하는 과정은 아래와 같다.
1.
서버, 클라이언트 인증서 발급
인증서는 AWS의 상호인증 문서를 참고해 easy-rsa로 발급한다.
참고로 7번에서 ACM에 인증서 업로드할 때 서버 인증서와 CA가 같은 경우 클라이언트 인증서는 업로드할 필요 없다.
2.
서버 인증서를 AWS Certificate Manager(ACM)에 업로드
서버 인증서를 업로드 했다면 ACM에서 확인할 수 있다.
만약 올라가있지 않다면 다른 계정에 로그인 되어있을 수도 있으므로 aws configure 로 재로그인

AWS client vpn 엔드포인트 생성

1.
aws vpc manager - client vpn 엔드포인트 생성 클릭
2.
client vpn CIDR 등록
source: AWS
3.
서버/클라이언트 인증서 ARN
인증 옵션: '상호 인증' 선택
서버/클라이언트 인증서 ARN: 업로드한 서버 인증서의 ARN을 선택한다.
4.
프로토콜: UDP
5.
분할 터널링 선택
Client VPN 엔드포인트가 있으면 등록된 클라이언트의 모든 트래픽은 Client VPN 터널을 통해 라우팅 된다. 즉, AWS 리소스에 접근하지 않는 인터넷 트래픽도 VPN 터널을 통해 라우팅된다. VPN은 시간당 요금이 있으므로 AWS 리소스에 접근하지 않는 트래픽은 제외하여 비용을 절약할 필요가 있다.
이때 Client VPN 엔드포인트에서 분할 터널링을 활성화하면, AWS가 Client VPN 엔드포인트에 연결된 디바이스에 Client VPN 엔드포인트 라우팅 테이블 경로를 푸시한다. 이렇게 하면 Client VPN 엔드포인트 라우팅 테이블의 경로와 일치하는 트래픽만 Client VPN 터널을 통해 라우팅된다.
6.
연결할 VPC: 기본 VPC 선택
7.
보안그룹 선택: 보안그룹은 최대 5개까지만 선택 가능하다.
8.
연결 로깅: VPN 접속 로그를 남기려면 CloudWatch를 사용해 로그를 남긴다. 선택 사항이다.
9.
생성

클라이언트 VPN에 서브넷 연결

1.
연결 선택
2. 연결할 Private 서브넷을 선택한다.
3. 라우팅 테이블 추가
VPN 엔드포인트에 서브넷 연결 시 VPN 엔드포인트 라우팅 테이블에 VPC에 대한 라우팅이 자동으로 추가된다.
만약 라우팅을 추가하는 경우 새 라우팅이 클라이언트로 전송되도록 연결을 재설정해야 한다.
분할 터널링을 사용하지 않는 경우 클라이언트에게 인터넷 액세스를 허용하기 위해서 0.0.0.0/0 규칙을 라우팅 테이블에 추가한다. (참고)
4. 권한 부여
클라이언트 VPN 엔드포인트 하단 메뉴에서 '권한부여' 탭 선택 - 수신 승인 클릭
권한 부여 규칙 추가: 1편에서 만들었던 VPC CIDR를 입력한다.
액세스 권한 부여
Activate Directory를 사용할 경우: activate directory 생성 방법 참고해서 AD 생성 - SID 입력

VPN 클라이언트로 연결하기

AWS OVPN 클라이언트 프로그램 설치

서울 리전에서 사용할 수 있는 CVPN(Client VPN)용 데스크톱 클라이언트가 출시되었다. 여기에서 OS에 맞는 클라이언트를 설치한다.

ovpn config 파일 추가

1.
ovpn config 파일 추가
<profile이름아무거나>.ovpn 파일 생성
client cert /<cert-file-path>/client1.domain.tld.crt key /<key-file-path>/client1.domain.tld.key dev tun proto udp remote <AWS-VPN-Client-endpoint> 443 remote-random-hostname resolv-retry infinite nobind remote-cert-tls server cipher AES-256-GCM verb 3 <ca> Contents of CA </ca> reneg-sec 0
JavaScript
복사
2.
AWS VPN Client 프로그램 열기
3.
파일 - 프로필 관리 - 프로필 추가
4.
VPN 구성 파일에서 ovpn 파일 선택

ovpn 클라이언트 연결

시간당 요금이 있으므로 사용하지 않는 경우 연결 해제하는 것을 잊지 말자.

그 외 연결

github action에서 vpn 연결

private DB에 연결해야 하는 액션이 있다면 ovpn으로 연결해줘야 한다. action-connect-ovpn 라는 액션을 사용해 연결해보도록 하자.
1.
repository에 ovpn config 파일 추가
config.ovpn
client dev tun proto udp remote <aws-client-vpn-endpoint> 443 remote-random-hostname resolv-retry infinite nobind remote-cert-tls server cipher AES-256-GCM verb 3 ca ca.crt cert user.crt key user.key reneg-sec 0
JavaScript
복사
2.
깃헙 secret에 추가
easy_rsa로 깃헙용 클라이언트 crt, key 생성
CA_CRT: ca.cert 파일. certificate 부분만 base64로 인코딩
ca.cert, 클라이언트 crt, 클라이언트 key 추가
시크릿 키 이름은 여기서 확인
3.
기존 workflow yaml 파일에 추가
name: Release on: release jobs: Release: runs-on: ubuntu-latest steps: - name: Checkout branch uses: actions/checkout@v2 run: sudo api-get install openvpn <...중략...> - name: Connect VPN uses: golfzaptw/action-connect-ovpn@master id: connect_vpn with: PING_URL: '127.0.0.1' env: CA_CRT: ${{ secrets.CA_CRT}} USER_CRT: ${{ secrets.USER_CRT }} USER_KEY: ${{ secrets.USER_KEY }} - name: Check Connect VPN run: echo ${{ steps.connect_vpn.outputs.STATUS }} <...중략...> - name: Kill VPN if: always() run: sudo killall openvpn
YAML
복사

References