데이터베이스(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에서 아래 명령어로 터널을 생성할 수 있습니다.
# 기본 명령어 구조
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 기준 설정 단계
- Connection Settings에서 상단 탭의 SSH를 선택합니다.
- Use SSH Tunnel 체크박스를 활성화합니다.
- 서버의 IP, 사용자 이름, 인증 방식(비밀번호 또는 SSH Key)을 입력합니다.
- 다시 Main 탭으로 돌아와서 Host는 localhost, Port는 서버 내부의 포트(3306 등)를 입력합니다.
이렇게 설정하면 연결 버튼을 누를 때마다 DBeaver가 자동으로 터널을 생성하고 접속해 줍니다.
5. 실무 적용 팁: 보안 강화하기
SSH 터널링을 사용할 때 방화벽(UFW) 설정을 함께 챙겨야 보안이 완성됩니다.
- DB 포트 차단: sudo ufw deny 3306 명령어로 외부에서의 직접 접속을 원천 차단하세요.
- SSH 전용 계정: DB 접속 전용 SSH 계정을 만들고 권한을 최소화하면 더욱 안전합니다.
- SSH 키 인증: 비밀번호 대신 SSH 키(Key) 방식을 사용하면 터널링의 보안 수준이 비약적으로 상승합니다.
6. 결론: 보안과 편리함은 공존할 수 있습니다
SSH 터널링은 인프라 보안의 정석과도 같은 기술입니다. 처음에는 조금 번거롭게 느껴질 수 있지만, 소중한 데이터를 보호하기 위해 반드시 익혀야 할 필수 스킬입니다.