본문 바로가기
카테고리 없음

[Database] 외부 접속 차단 및 안전한 원격 DB 연결을 위한 SSH 터널링 기법

by 돌미나리는야생미나리 2026. 4. 8.

데이터베이스(DB)에는 서비스의 가장 소중한 자산인 사용자 정보와 비즈니스 데이터가 담겨 있습니다. 하지만 로컬 개발 환경에서 서버의 DB에 접속하기 위해 3306(MySQL)이나 5432(PostgreSQL) 포트를 전 세계에 개방하는 것은 매우 위험한 행동입니다.

오늘은 DB 포트를 외부에 노출하지 않고도, 마치 내 컴퓨터에 있는 DB처럼 안전하게 접속할 수 있게 해주는 SSH 터널링(SSH Tunneling) 기법을 상세히 알아보겠습니다.


1. 왜 DB 포트를 직접 열면 안 되는가?

대부분의 DB 엔진은 보안 취약점이 발견될 수 있으며, 기본 포트가 널리 알려져 있어 무차별 대입 공격(Brute-force)의 주 타겟이 됩니다.

  • 보안 위험: 포트가 열려 있다는 것만으로도 해커는 공격의 실마리를 찾습니다.
  • 데이터 유출: 암호화되지 않은 연결을 사용할 경우 중간에서 데이터가 탈취될 수 있습니다.

따라서 가장 권장되는 방식은 방화벽에서 DB 포트를 완전히 차단하고, 인증된 사용자만 SSH라는 보안 통로를 통해 우회 접속하는 것입니다.


2. SSH 터널링(포트 포워딩)의 원리

SSH 터널링은 내 PC(Local)와 서버(Remote) 사이에 암호화된 '터널'을 뚫는 기술입니다. 내 PC의 특정 포트로 보내는 신호를 SSH 터널을 통해 서버 내부의 DB 포트로 전달하는 방식입니다.

사용자 입장에서는 localhost:3307로 접속하지만, 실제로는 서버의 3306 포트에 안전하게 연결되는 마법 같은 일이 일어납니다.


3. 터미널 명령어로 SSH 터널 뚫기

별도의 도구 없이 터미널(Terminal)이나 CMD에서 아래 명령어로 터널을 생성할 수 있습니다.

Bash
 
# 기본 명령어 구조
ssh -L [로컬포트]:localhost:[서버DB포트] [서버계정]@[서버IP]

# 예시: 내 PC의 3307 포트를 서버의 3306(MySQL) 포트와 연결
ssh -L 3307:localhost:3306 yumina@1.23.456.78
  • -L: 로컬 포트 포워딩을 의미합니다.
  • 3307: 내 PC에서 사용할 임시 포트입니다. (기존 DB와 충돌을 피하기 위해 보통 다른 번호를 씁니다.)
  • localhost:3306: 서버 입장에서 본 DB의 주소와 포트입니다.

이 명령어를 실행한 채로 터미널을 열어두면 터널이 유지됩니다.


4. GUI 도구(DBeaver, MySQL Workbench) 설정법

명령어가 익숙하지 않다면, 자주 사용하는 DB 관리 도구에서도 클릭 몇 번으로 설정이 가능합니다.

4.1 DBeaver 기준 설정 단계

  1. Connection Settings에서 상단 탭의 SSH를 선택합니다.
  2. Use SSH Tunnel 체크박스를 활성화합니다.
  3. 서버의 IP, 사용자 이름, 인증 방식(비밀번호 또는 SSH Key)을 입력합니다.
  4. 다시 Main 탭으로 돌아와서 Host는 localhost, Port는 서버 내부의 포트(3306 등)를 입력합니다.

이렇게 설정하면 연결 버튼을 누를 때마다 DBeaver가 자동으로 터널을 생성하고 접속해 줍니다.


5. 실무 적용 팁: 보안 강화하기

SSH 터널링을 사용할 때 방화벽(UFW) 설정을 함께 챙겨야 보안이 완성됩니다.

  • DB 포트 차단: sudo ufw deny 3306 명령어로 외부에서의 직접 접속을 원천 차단하세요.
  • SSH 전용 계정: DB 접속 전용 SSH 계정을 만들고 권한을 최소화하면 더욱 안전합니다.
  • SSH 키 인증: 비밀번호 대신 SSH 키(Key) 방식을 사용하면 터널링의 보안 수준이 비약적으로 상승합니다.

6. 결론: 보안과 편리함은 공존할 수 있습니다

SSH 터널링은 인프라 보안의 정석과도 같은 기술입니다. 처음에는 조금 번거롭게 느껴질 수 있지만, 소중한 데이터를 보호하기 위해 반드시 익혀야 할 필수 스킬입니다.