AWS

AWS Client VPN을 활용한 Snowflake Private URL 접근

heed159 2024. 10. 23. 13:32

지난 글에서 AWS PrivateLink를 통해 공용(Public) 인터넷망을 타지 않고 AWS VPC와 Snowflake VPC 사이에서 직접 보안 연결을 할 수 있도록 비공개 VPC 엔드포인트를 생성하여 Private 서브넷에 띄워진 EC2 인스턴스에서 Snowflake PrivateLink URL로 접속을 확인해보았다. 

 

 

 

[1] AWS PrivateLink를 이용한 Secure한 Snowflake 액세스

AWS PrivateLink란?AWS PrivateLink는 Public(공용) 인터넷망을 타지 않고 AWS VPC와 Snowflake VPC 사이에서 직접 보안 연결을 할 수 있도록 비공개 VPC 엔드포인트를 생성하는 AWS 서비스이다. 따라서 AWS PrivateLink

heed159.tistory.com

 

 

[2] AWS PrivateLink를 이용한 Secure한 Snowflake 액세스 - Internal Stage (S3)

지난 글에서는 AWS PrivateLink를 통해 공용(Public) 인터넷망을 타지 않고 VPC 엔드포인트를 생성하여 Secure하게 Snowflake에 접근하는 법에 대해 알아보았다. 지난 글이 궁금하다면 아래 글을 참고하기

heed159.tistory.com

 

AWS PrivateLink를 사용하면 같은 리전 안에서 AWS VPC와 Snowflake VPC 간에 Public 망을 타지 않기 때문에 좀 더 보안을 강화할 수 있다는 장점이 있다. 그럼 이번 글에서는 특정 VPC 내의 Private 서브넷 대역대를 사용하고 있는 사용자만이 Snowflake UI(Snowsight)에 접속하여 작업할 수 있는 환경을 만들어보려고 한다. 

그러기 위해서는 Private 서브넷 대역대에 접근해야 하는데 이럴 때 사용하는 기술이 VPN이다. VPN은 간단하게 말하면 외부 네트워크에서 내부망 네트워크를 안전하게 터널링하여 접속할 수 있는 방법이다.

아래의 아키텍처를 살펴보면 클라이언트 사용자는 자신의 IP 대역대를 사용하는 것이 아닌 Private Subnet의 대역대를 사용하여 Snowflake에 PrivateLink로 접속하게 된다. 그럼 직접 AWS Client VPN을 구성해보자. 최종 아키텍처는 아래와 같다.

 

 

1. Client VPN 엔드포인트 생성

Client VPN 엔드포인트는 사용자가 VPC에 안전하게 접속할 수 있도록 하는 가상의 VPN 연결 지점이다. 엔드포인트는 AWS 클라우드 내에서 VPN 클라이언트가 연결할 수 있는 서버 역할을 하게 된다. Client VPN 엔드포인트의 주요 구성 요소는 아래와 같다.

 

Client VPN 엔드포인트의 주요 구성 요소

  • 서브넷 연결: VPC 내의 서브넷과 연결되어 해당 서브넷의 리소스에 접근할 수 있도록 설정
  • 인증: 엔드포인트는 사용자가 접속할 때 필요한 인증을 처리함. AWS Directory Service, 인증서 기반 인증 등 다중 인증 방식 지원
  • 라우팅: 클라이언트에서 VPC로 트래픽을 전달하기 위해 라우팅 테이블을 설정. 이를 통해 특정 네트워크 대역에 대한 트래픽만 전달하거나, 전체 인터넷 트래픽을 전달하도록 구성 가능

그럼 직접 Client VPN 엔드포인트를 생성해보자.

엔드포인트 이름과 클라이언트 IP 주소가 할당되는 IP 주소 범위를 지정해준다. 접근할 Private 서브넷 IP와 겹치지 않도록 유의한다. 또한 아래처럼 인증정보를 선택해야 하는데 상호 인증 방식을 사용하도록 한다. 이때 AWS Certificate Manager(ACM)에 등록된 인증서가 필요하다. 따라서 서버 인증서를 ACM에 등록하고 Client VPN 엔드포인트를 생성할 때 지정해줘야 한다. 

 

 

2. 서버&클라이언트 인증서 발급 및 ACM 등록

아래 페이지에서 Window 버전에 해당하는 ZIP 파일을 다운로드 한 후 압축을 풀어준다.

 

Releases · OpenVPN/easy-rsa

easy-rsa - Simple shell based CA utility. Contribute to OpenVPN/easy-rsa development by creating an account on GitHub.

github.com

 

CMD를 열고 EasyRSA-3.2.1 폴더가 저장된 위치로 이동한 다음 아래 명령을 실행하여 EasyRSA3 셸을 실행한다.

PS C:\Users\User\Downloads\EasyRSA-3.2.1-win64\EasyRSA-3.2.1> .\EasyRSA-Start.bat

 

새로운 PKI 환경을 시작하고 CA를 빌드하여 서버 인증서 및 키를 생성한다. 이후 클라이언트 인증서 및 키를 생성한다.

./easyrsa init-pki
./easyrsa build-ca nopass
./easyrsa build-server-full server.domain.tld nopass
./easyrsa build-client-full client1.domain.tld nopass

exit

서버 인증서를 생성할 때 server.domain.tld 형식으로 생성한다는 점을 유의하자. 아래와 같이 생성한다면 server 인증서의 경우 ACM 가져오기를 했을 때 도메인 이름이 정상적으로 적용이 되지 않아 Client VPN 인증서 생성 시 서버 측 인증서 선택이 되지 않는 문제가 발생했다.

./easyrsa build-server-full server nopass

 

정상적으로 생성되면 서버 인증서와 키, 클라이언트 인증서와 키를 사용자 지정 폴더에 위치시킨다.

PS C:\Users\User\Downloads\EasyRSA-3.2.1-win64\EasyRSA-3.2.1> mkdir C:\custom_folder
PS C:\Users\User\Downloads\EasyRSA-3.2.1-win64\EasyRSA-3.2.1> copy .\pki\ca.crt C:\custom_folder\
PS C:\Users\User\Downloads\EasyRSA-3.2.1-win64\EasyRSA-3.2.1> copy .\pki\issued\server.domain.tld.crt C:\custom_folder\
PS C:\Users\User\Downloads\EasyRSA-3.2.1-win64\EasyRSA-3.2.1> copy .\pki\private\server.domain.tld.key C:\custom_folder\
PS C:\Users\User\Downloads\EasyRSA-3.2.1-win64\EasyRSA-3.2.1> copy .\pki\issued\client1.domain.tld.crt C:\custom_folder\
PS C:\Users\User\Downloads\EasyRSA-3.2.1-win64\EasyRSA-3.2.1> copy .\pki\private\client1.domain.tld.key C:\custom_folder\

 

AWS Certificate Manager(ACM)에서 인증서를 등록한다. 인증서는 서버 인증서와 클라이언트 인증서 총 두 번에 걸쳐 등록해준다.

인증서 본문 인증서 프라이빗 키 인증서 체인
server.domain.tld.crt 내용 입력 server.domain.tld.key 내용 입력 ca.crt 내용 입력(공용 사용)
client1.domain.tld.crt 내용 입력 client1.domain.tld.key 내용 입력 ca.crt 내용 입력 (공용 사용)

 

서버 인증서와 클라이언트 인증서 두 개 모두 등록하면 아래처럼 정상적으로 가져와진 것을 볼 수 있다.

 

 

3. Client VPN 엔드포인트 생성 마무리

위에서 생성한 서버 인증서와 클라이언트 인증서를 등록하고 DNS 서버 IP 주소와 443 VPN 포트를 선택한다.

 

아래와 같이 엔드포인트가 생성되었다. 

 

이제 대상 네트워크를 연결한다. 만든 Client VPN을 선택하고 밑의 목록에서 대상 네트워크 연결을 선택한다.

해당 서브넷을 VPN 엔드포인트와 연결한다고 생각하면 된다. 조금 기다리면 보안 그룹과 로컬 라우팅 테이블이 자동으로 생성된다.

 

이제 클라이언트가 VPC에 액세스 할 수 있도록 권한 부여 규칙을 만들어보자.

 

이제 Client VPN 엔드포인트 구성 파일을 다운로드하고 해당 파일을 사용하여 VPN 클라이언트 애플리케이션을 구성해보도록 하자.

이후 구성 파일을 메모장으로 열고 Client 인증서와 키를 추가해준다.

<cert>
Contents of client certificate (.crt) file
</cert>

<key>
Contents of private key (.key) file
</key>

 

이제 Client VPN에 연결해보자. 그러기 위해서는 AWS에서 제공하는 에이전트를 사용한다. 아래 페이지에서 OS에 맞는 클라이언트 파일을 다운로드하고 설치한다.

 

AWS Client VPN 다운로드 | Amazon Web Services

AWS Client VPN용 클라이언트는 무료로 제공됩니다. 컴퓨터를 AWS Client VPN에 직접 연결하여 엔드 투 엔드 VPN 경험을 구현할 수 있습니다. 이 소프트웨어 클라이언트는 AWS Client VPN의 모든 기능과 호환

aws.amazon.com

 

설치가 완료된 후 클라이언트 프로그램 > 파일 > 프로필 관리 > 프로필 추가 > .opvn 파일을 추가한다. .opvn 파일은 위해서 다운로드한 Client 구성 파일을 의미한다.

 

모든 과정이 정상적으로 진행되었다면 해당 VPN으로 연결이 가능해지고 AWS VPC와 로컬 PC 간 VPN 터널링을 사용할 수 있게 된다.

Private EC2에 Ping을 날려보면 정상적으로 통신되는 부분을 확인할 수 있다. 이는 사전에 EC2 인스턴스에 ICMP를 허용해야 한다.

 

이제 nslookup 명령어를 통해 Snowflake PrivateLink 도메인으로 정상적으로 연결이 되는지 확인해본다.

 

최종적으로 VPN 내의 네트워크 대역대를 사용하여 Snowflake PrivateLink 도메인으로 접속을 해보자. 아래처럼 정상적으으로 Private URL을 타고 Snowflake에 접속하는 걸 볼 수있다. Snowflake 내에서 Network Policy를 통해 특정 IP 대역만 접속 허용할 IP Whitelist를 설정해주면(Private IP 대역대) Public IP 로 접속이 불가능해져 보안 측면에서 훨씬 더 안전한 운영을 목표로 할 수 있게 된다.