Cloudflare Tunnel 데이터베이스 연결하기

Cloudflare Tunnel 데이터베이스 연결하기
Photo by Mark Boss / Unsplash

[Cloudflare 방식 지원종료] 설치형 tunnel 지원 예정


안녕하세요 셀렉트팀 입니다.

셀렉트 클라우드를 이용하는 경우
클라우드와 서비스 데이터베이스를 최초 1회 연결을 해야하는데
보안을 위해 데이터베이스를 public-ip이 없이 운영하고 있는 경우
리소스 연결작업이 불가능합니다.

*만약 외부에서 접근이 가능하다면 해당 안내를 확인해주세요.
https://blog.selectfromuser.com/connecting-to-database/

이를 해결하기 위해 다음과 같은 방법으로 안내드리고 있습니다.

  • Self-hosted 설치형을 내부망에 직접 설치하여 운영
  • Cloudflare Tunnel 터널링을 통해 클라우드와 연결

설치형 연결

기존 네트워크안에 있는 서버, EC2, 컨테이너, 클러스터에서 셀렉트를 운영하는 경우 API 서버를 배포하는것과 마찬가지로 DB_HOST등 환경변수, 설정값으로 즉시 접속 가능합니다.

접속이 되지않는 경우 (AWS) 해당 EC2의 Security Group을 확인해주세요. 직접 mysql -h HOST -u USER -p 명령어를 통해 접속을 확인해보면 도움이 됩니다.

터널링 구성

일반적으로 Bastion Host를 구성하여 해당 SSH를 통해 내부망에 접속하고 데이터베이스를 연결하는 경우가 많습니다. 하지만 이 방식은 Bastion Host 노출과 L4 상위 레이어의 네트워크 보안위협을 완벽히 방어하기 어렵습니다.

Zero Trust 네트워크 구축을 위해 자사의 VPN을 별도 구축하거나 Cloudflare 클라우드플레어의 무료 서비스를 이용하게 됩니다.

본문에서는 클라우드플레어의 무료 이용가능한 범위로 안내드립니다.

*[알림] 담당자가 1:1 지원을 해드립니다. 진행에 앞서 문의바랍니다.

준비물:

  • 디비 접속 가능한 서버
  • 디비 접속 계정 정보
  • cloudflare 계정

1. Cloudflared 설치

yum, brew등으로 쉽게 설치 가능합니다.

참고: https://developers.cloudflare.com/cloudflare-one/connections/connect-apps/install-and-setup/tunnel-guide/

2. Cloudflare 로그인

cloudflared tunnel login 을 입력하면 웹사이트가 뜨고 연결할 도메인을 선택가능합니다.

3. Tunnel 만들기

cloudflared tunnel create test-db 명령어를 통해 해당서버(EC2)와 클라우드플레어 네트워크 사이에 터널을 만듭니다. (test-db 이름은 자유롭게 지정)

참고: https://developers.cloudflare.com/cloudflare-one/connections/connect-apps/install-and-setup/tunnel-guide/

4. Tunnel에 데이터베이스 연결하기

만들어진 터널안에서 여러개의 IP, Port, Application을 터널링 할 수 있습니다.

이제 데이터베이스 TCP 연결을 터널에 추가합니다.

cloudflared tunnel --url tcp://<DB_HOST_디비주소>:<DB_PORT_디비포트> --hostname <EXTERNAL_DOMAIN_본인도메인> --name mysql

external_domain은 셀렉트클라우드에 제공하는 URL 입니다. 비어있는 서브도메인이 필요합니다.

각 항목에 맞는 예제 명령어는 아래와 같습니다.

cloudflared tunnel --hostname test-db-0318.selectfromuser.com --url tcp://testdb.2b25d36a88.ap-northeast-2.rds.amazonaws.com:3306 --name mysql

해당 명령어를 통해

test-db-0318.selectfromuser.com에 tcp 접속할시 해당 testdb에 연결 가능합니다.

5. Tunnel 보안 설정하기

해당 URL을 유추하기 쉽지 않지만
높은 보안을 위해 클라우드플레어 단에서 방화벽 설정이 필요합니다.

  • 클라우드플레어 로그인
  • 도메인 선택
  • Access > Access Policies > Create Access Policy

내용을 입력합니다.

  • Application Name: 자유
  • Application Domain: 위의 도메인
  • Session Duration: No Duration - Expires Immediately

Policies

  • Policy Name: 자유
  • Decision: Non Identity
  • Include > IP Ranges > 입력 13.125.106.136/32

위의 설정으로 셀렉트 클라우드에서 해당 터널을 접속가능합니다.
(다른 IP에서는 접속 불가능합니다)

(선택) 더 높은 보안을 위한 Service Token 발급

Access Service Tokens > Generate A Service Token

과정을 통해 발급받은 Client ID, Client Secret을 보관합니다.

위의 Policy 설정에 추가합니다.

  • Include > 동일
  • Require > Access Service Token > 만든 토큰을 선택

셀렉트 컨시어지 담당자에게 요청

해당 정보를 이메일로 알려주시면 해당 터널을 셀렉트 클라우드에서 쓸수있도록 추가 설정을 해드립니다.

제공 (필수)

  • 터널 주소 ex: test-db-0318.selectfromuser.com

제공 (선택)

  • Service Token: Client ID
  • Service Token: Client Secret

(추가 질문) SSH Tunneling은 지원하나요?

위의 '터널링 구성'에서 말했던 문제로 인해 공식 지원하지 않습니다.

SSH 계정발급 및 설정없이, 외부네트워크 inbound 방화벽 오픈없이
터널링 가능한 reverse ssh tunneling을 준비중입니다.
(내부망 서버에서 셀렉트클라우드쪽 ssh을 접속하는 방식)
담당자가 순차적으로 지원하고 있으니 문의 바랍니다.

감사합니다.