Google OAuth, AWS IAM 이용한 인증으로 접속할수 있는 VPN 개발
Photo by Petter Lagson on Unsplash
소개
안녕하세요. WATCHA에서 서버 개발을 하고 있는 Allan 입니다. 이번 포스팅은 이전 포스팅에 이어서 WATCHA 에서 사내 VPN 서버 개발에 대해서 이야기 해보자 합니다.
최근들어 많은 IT 회사들이 COVID-19 영향으로 재택근무 늘면서 원격근무를 위한 TOOL 필요성이 대두 되었습니다.
WATCHA에서도 재택근무, 그리고 자율출퇴근제(+시차출퇴근제)를 운영하면서 새로운 이슈들이 생겼는데, 특히 사내 오피스에서만 접근되던 사이트 와 리소스들을 재택근무시에는 이용 할 수 없어 업무에 차질이 발생하고, 필요시에는 일시적으로 접근을 허용 또는 제한 하면서 관리 와 보안 측면에서 리스크가 발생할 수 있는 상황이었습니다.
How About VPN?
이러한 문제를 해결할수 있는 방법으로,
WATCHA 직원들은 본인 인증을 한후에 VPN을 연결해서 재택시에도 제한된 리소스를 접근 할 수 있도록 하는 것이좋겠다고 생각했습니다.
그래서 WATCHA에 적합한 상용 VPN을 모색해 봤으나, 몇가지 불편한 점이 있었습니다:
인증 : 일반적인 상용 VPN은 LDAP 과 같은 별도의 계정 관리 시스템 또는 설정파일(KEY 공유) 같은 인증을 지원합니다. VPN 만을 위해 별도의 계정 관리 시스템이나 LDAP을 구축하기에는 운영 및 관리이슈가 크고, 설정파일(KEY 공유)을 하기에는 보안 측면에서 리스크가 있어, WATCHA 실상에는 맞지 않는 걸로 판단하였습니다.
모니터링 및 관리: 보안 측면에서 이상징후 추적 및 모니터링, 사용자가 늘거나 트래픽이 증가할때 서버가 Auto Scaling 하는 등 관리 측면에서 적합한 솔루션을 찾기 힘들었습니다.
그리하여 모니터링에 용이하고, 확장성이 있고 개발자들은 기존에 사용하는 AWS IAM, 비 개발자들은 사내 Google 계정(G Suite)을 통한 OAuth 인증을 이용 할 수 있는 VPN 서버 및 클라이언트 를 개발했습니다. (Golang 으로 개발)
What Protocol To Use For VPN?
VPN 에는 다양한 프로토콜이 존재합니다. (L2TP, SSTP, OPENVPN …)
그중에서 OPENVPN 와 같이 SSL/TLS 채널을 이용한 VPN 연결이 안정적이면서 구성이 편하고, 방화벽도 쉽게 통과 하는 걸로 판단하여 이를 활용하기로 하였습니다.
SSL/TLS 채널 위에서 여러개의 인증을 지원하고, 클라이언트와 서버간의 패킷을 주고 받기 위해서는 클라이언트 와 서버 간의 약속, 즉 Protocol 을 정의 해야합니다. 그리고 다양한 인증을 쉽게 추가 할려면 인증 과 VPN 연결 및 패킷 교환이 명확하게 구별 될 필요성이 있다고 판단하여 최종적으로 GRPC를 이용하기로 결정하였습니다.
GRPC 를 이용하면 HTTP 2.0 + SSL/TLS 로 생성된 채널을 통해 인증 부분 과 VPN 연결 및 패킷 교환 부분을 RPC로 명확하게 구별할수 있다고 생각했고, 특히 VPN 연결 및 패킷 교환 부분은 특히 GRPC Stream을 이용하여 전반적으로 구현이 쉬울 것이라 생각 했습니다.
인증 부분
인증 부분
인증 부분은 위의 그림과 같습니다. AWS IAM, 구글 계정을 통해 WATCHA 에서 사용이 가능한 유저 인지 확인 되면 JWT 토큰을 발행합니다.
JWT 토큰에는 발행일, 사용자, 시간제한 … 등 같은 정보를 포함하고 있으며, VPN 연결시 해당 JWT 토큰 유효성 확인 절차를 거쳐서 연결을 유지합니다.
JWT 토큰을 이용한 이유는 인증 부분 과 VPN 연결 부분에 대해 서로 의존성 제거하기 위해서 VPN 연결시 참고 할 데이터를 JWT에 정보를 담을수 있고, 서명(Hashing)하여서 변조 및 위조에도 안전하다고 판단해 이용하게 되었습니다. (다른 인증을 추가 시에도 큰 변화 없이 손쉽게 적용 가능합니다.)
AWS 인증 같은 경우에는 AWS KEY 로 통해 해당 유저가 허용된 AWS 계정이 맞는지, 권한이 있는지 … 등을 확인 후 JWT 토큰을 발급해 줍니다.
Google 인증의 경우에는 브라우저에서 사용자 WATCHA 구글 계정으로 로그인하게 되면 Google OAuth을 통하여 사용자 및 권한 확인후에 JWT 토큰을 발급해 줍니다.
VPN 연결 및 패킷 교환 부분
VPN 연결 및 패킷 교환
VPN 연결 및 패킷 교환 부분은 위의 그림과 같습니다.
인증과정에서 할당 받은 JWT 토큰을 VPN 서버에 전달하면 서버는 JWT 토큰 검증후 클라이언트에게 할당할 VPN IP, VPN GATEWAY 설정 …등 VPN 연결에 필요한 네트워크 설정을 내려줍니다.
클라이언트는 TUN(가상디바이스) 및 네트워크 설정후 VPN 연결이 이뤄지고 GRPC Stream 을 통하여 패킷을 송수신이 이뤄지게 됩니다.
TAP/TUN 및 네트워크 설정 부분은 Network 디바이스, 패킷필터(Iptables) … 등 Low 레벨에 대한 깊은 이해와 방대한 설명이 필요 하여 해당 포스트에서는 다루지 않겠습니다. 🙏🏻
클라이언트 와 서버간에 VPN 연결이 이뤄진후 순간적인 네트워크 이슈로 순단이 일어나더라도, Exponential Backoff 적용되어 있어 자동으로 간격을 두며 재 연결을 시도를 하며 이용중에 JWT 토큰이 만료 되면 자동으로 VPN 연결을 종료하도록 되어 있습니다.
그리고 이상징후 및 모니터링을 위해서 필요한 로그도 남길수 있어 CloudWatch 를 이용한 분석도 가능합니다.
참고 TUN을 이용하기 때문에 OSI 7계층 중 Network Layer 상위 계층 이상은 로깅 및 분석이 가능합니다.
전체 구조
VPN 서버 및 클라이언트 전체 구성은 아래와 같습니다.
전체 구조
직군에 따라 필요한 리소스가 다르다고 판단하여 Security Group을 이용하여 접근 허용 범위가 다른 개발자용 VPN 과 비 개발자용 VPN 따로 운영하고 있습니다. 개발자용 VPN은 AWS 이용한 인증을 하고 있고, 비 개발자용 VPN은 사내 구글 계정을 이용한 인증을 지원 하고 있습니다.
VPN 서버는 Elastic Beanstalk 로 운영하고 있고 상황에 따라 Auto Scaling 가능합니다. (사용자 수 와 트래픽 사용량에 따라 유연한 확장이 가능합니다.)
CloudWatch를 사용하여 로그인한 유저, 발생된 트래픽양 … 등 로그 등의 취합하여, 이상징후 판단 및 모니터링에 활용하고 있습니다.
배포
개발자용 클라이언트 와 비 개발자용 클라이언트 따로 사내에 배포 되고 있습니다.
개발자용 클라이언트
개발자들이 친숙한 CLI TOOL로 통하여 손쉽게 VPN 을 키고 끌수 있습니다.
개발자들은 다들 맥북을 이용하고 있어, 사내 Private HomeBrew Repository 를 통하여 손쉽게 설치 및 업그레이드가 가능합니다.
비개발자용 클라이언트
개발자가 아닌 직군들은 CLI 가 익숙하지 않고 접근이 쉽지 않은 상황이라고 판단하여 Electron 같은 데스크탑 앱으로 만들어서 쉬운 UI로 접근할수 있습니다.
DMG 파일로 배포 하고 있습니다.
결론
지금까지 WATCHA 사내 VPN에 대해서 공유해 보았습니다.
WATCHA VPN은 다양한 인증 방식을 통해서 손쉽게 접근을 할 수 있고, 직군에 따라 접근 리소스를 제한 하여 효율적으로 VPN 을 관리 할수 있습니다. 게다가 상황에 따라 Auto Scaling 하여 사용량 증가에 따른 VPN 서버 증설 및 관리에 대한 이슈가 적으며, 이상징후에 대한 모니터링도 가능합니다.
COVID-19 인한 재택근무에 필요한 기술들이 요즘 부각되고 있는데, 해당 포스트가 조금이라도 도움이 되었으면 좋겠습니다. (VPN 일부 구현체를 🤘🏻이곳🤘🏻에서 오픈소스로 제공하고 있습니다.)
해당 VPN 은 WATCHA 내의 짬데이라는 개발 문화 와 약간의 업무시간을 할애 하여 개발 했습니다. 짬데이가 궁금하시다면 채용공고 를 통해 입사해서 알아보는걸로 😈
WATCHA에서는 다양한 기술들을 활용해 서비스를 지속적으로 개선, 발전시켜 갈 실력 있고 뜻있는 개발자들을 모집하고 있습니다. 관심있는 분은 채용공고를 참고해주세요.