[Node.js] SSH-Tunneling을 통한 MySQL 서버 연결

Yongjin·2021년 10월 2일
4

Node.js

목록 보기
1/1
post-thumbnail

이번 글에서는 보다 안전하게 MySQL 서버 연결을 하기 위한 방법으로 SSH-Tunneling 방식을 정리하려고 한다.

  • MySQL Workbench를 활용한 방법
  • Node.js로 접속하는 방법

위의 두 가지 방식으로 MySQL 서버에 접속해보려고 한다.

SSH란?

  • Secure Shell의 약자
  • 손쉽게 PC에 접근하는 방식을 제공하기 위해 만들어진 프로토콜

SSH의 역할

  • 인증 (Authentication)

    • 사용자와 서버를 인증하는 역할을 한다.

    • public key와 private key를 사용하는 비대칭 암호방식을 사용한다.

    • 클라이언트에서 서버에 접속할 때 사용자 인증을 거쳐야 하는데, 이 때 전통적인 패스워드 인증방식과 더불어 사용된다.

  • 암호화 (Encryption)

    • SSH는 네트워크를 통해 전달되는 데이터를 암호화한다.

    • 그래서 누군가 중간에 데이터를 가로채더라도 내용을 알 수 없다.

  • 무결성 (Integrity)

    • 네트워크를 통해 전달받은 데이터가 변경되지 않았음을 보장한다.
  • 압축 (Compression)

    • SSH 연결을 통해 보낸 데이터를 압축할 수 있다.

    • SSH 클라이언트/서버 사이에서 데이터를 전송하기 전에 압축하고 이를 압호화해서 전송한다.

    • 데이터를 받는 쪽에서는 복호화 작업을 거친 후 압축을 해제하고 사용한다.

SSH Tunneling

  • ssh 클라이언트와 서버오 연결이 이루어지면 이를 터널링이라고 한다.

  • 여기에 포트 포워딩(Port Forwarding) 기술을 더해서 다른 어플리케이션에 접근할 수 있다.

  • 터널링을 통해 방화벽을 우회할 수 있다.

MySQL Workbench를 이용한 방법


Workbench Database 탭의 Connect to Database 클릭

Connection Method를 Standard TCP/IP over SSH를 선택한다.

SSH Hostname: MySQL 서버가 설치되어 있는 Server의 IP 주소와 SSH 연결이 가능한 Port를 적어준다.(필자의 경우 1024로 설정하였음)

SSH Username: 접속할 Server의 UserName을 적어준다.

SSH Password: UserName에 해당하는 Password를 적어준다. 이번 예시에서는 간단히 Password를 통한 방식을 사용하였다. (보안상 SSH Keyfile을 이용하는 것이 좋다. SSH Keyfile을 이용하면, 공백으로 남긴다.)

SSH Keyfile: SSH KeyFile의 경로를 입력한다.

MySQL Hostname: 127.0.0.1

MySQL Port: 3306

Username: Mysql의 Username을 입력한다. (필자의 경우, yongjin이라는 계정으로 접속하려고 한다.)

Password: 해당 Username의 Password를 입력한다.

입력을 완료한 후, OK를 누르면, 접속된 것을 확인할 수 있다.

Node.js에서 접속하는 방법


SSH Tunneling을 위해 tunnel-ssh라는 모듈을 설치하고, 설정들을 위한 값을 따로 관리하기 위해 dotenv라는 모듈도 설치한다.

$ npm install tunnel-ssh
$ npm install dotenv

.env파일을 프로젝트의 루트 디렉토리에 생성한 후, dotenv를 통해 접근한다.

SSH_HOST=[DB가 설치된 Server의 IP]
SSH_PORT=[해당 Server의 포트]
SSH_USER=[Server에 접속할 Username]
SSH_PASSWORD=[해당 User의 Password]
SSH_DATABASE_HOST=127.0.0.1
SSH_DATABASE_PORT=3306

DATABASE_USERNAME=[DB의 UserName]
DATABASE_PASSWORD=[해당 User의 password]
DATABASE_NAME=[사용할 DB]
DATABASE_HOST=127.0.0.1

이제 tunnel-ssh를 통해 데이터베이스에 접속을 해보자.

// tunnel-ssh.js
import mysql from 'mysql2';
import tunnel from 'tunnel-ssh';
import dotenv from 'dotenv';
dotenv.config();

const ssh_config = {
  username: process.env.SSH_USER,
  password: process.env.SSH_PASSWORD,
  host: process.env.SSH_HOST,
  port: process.env.SSH_PORT,
  dstHost: process.env.SSH_DATABASE_HOST,
  dstPort: process.env.SSH_DATABASE_PORT,
};

tunnel(ssh_config, (error, server) => {
  if (error) {
    throw error;
  } else if (server !== null) {
    mysql
      .createConnection({
        host: process.env.DATABASE_HOST,
        user: process.env.DATABASE_USERNAME,
        password: process.env.DATABASE_PASSWORD,
        database: process.env.DATABASE_NAME,
      })
      .execute('SHOW TABLES from fleamarket;', (err, result, fields) => {
        if (err) throw err;
        console.log(result);
      });
  }
});

.env 파일에 설정을 잘 입력하였다면 아래와 같이 결과가 정상적으로 출력되는 것을 확인할 수 있다.

마치며


이번 글에서는 SSH-Tunneling을 통한 원격 서버의 DB에 접속하는 방법에 대해 정리를 해보았다. 이 방법을 몰랐을 때는, 서버의 DB 포트를 열어주는 설정을 하고, 외부의 접속을 허용하는 설정 등 다양한 설정을 해줘야 한다. 하지만 SSH-Tunneling 방식을 사용하니, 별다른 설정이 필요없다는 것이 매우 좋았다. 물론, 보안 상으로도 SSH-터널링을 이용하는 방식이 더 우수하다. 원격 서버의 DB에 접근할 일이 있다면, SSH-Tunneling 방식을 많이 이용해보자.

references


https://ithub.tistory.com/328
https://blog.dongmin.dev/13
https://ithub.tistory.com/328
shttps://stackoverflow.com/questions/38509995/how-to-use-node-js-to-make-a-ssh-tunneling-connection-to-a-mongodb-database

profile
성장하는 개발자

3개의 댓글

comment-user-thumbnail
2021년 10월 3일

좋은정보 알아갑니다~~ :)

답글 달기
comment-user-thumbnail
2022년 3월 6일

좋은 정보 감사합니다!!

답글 달기
comment-user-thumbnail
2023년 8월 2일

안녕하세요. 좋은글 감사합니다. 따라해보다가 관련 패키지에서 터널링 방식이 조금 바뀐듯하여 업데이트 드립니다 :) tunnel(ssh_config, (error, server) => { ... 이 부분에서 함수명 등의 변화가 있었던 거 같아요.

답글 달기