이번 글에서는 보다 안전하게 MySQL 서버 연결을 하기 위한 방법으로 SSH-Tunneling
방식을 정리하려고 한다.
위의 두 가지 방식으로 MySQL 서버에 접속해보려고 한다.
Secure Shell
의 약자인증 (Authentication)
사용자와 서버를 인증하는 역할을 한다.
public key와 private key를 사용하는 비대칭 암호방식을 사용한다.
클라이언트에서 서버에 접속할 때 사용자 인증을 거쳐야 하는데, 이 때 전통적인 패스워드 인증방식과 더불어 사용된다.
암호화 (Encryption)
SSH는 네트워크를 통해 전달되는 데이터를 암호화한다.
그래서 누군가 중간에 데이터를 가로채더라도 내용을 알 수 없다.
무결성 (Integrity)
압축 (Compression)
SSH 연결을 통해 보낸 데이터를 압축할 수 있다.
SSH 클라이언트/서버 사이에서 데이터를 전송하기 전에 압축하고 이를 압호화해서 전송한다.
데이터를 받는 쪽에서는 복호화 작업을 거친 후 압축을 해제하고 사용한다.
ssh 클라이언트와 서버오 연결이 이루어지면 이를 터널링이라고 한다.
여기에 포트 포워딩(Port Forwarding) 기술을 더해서 다른 어플리케이션에 접근할 수 있다.
터널링을 통해 방화벽을 우회할 수 있다.
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를 누르면, 접속된 것을 확인할 수 있다.
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 방식을 많이 이용해보자.
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
좋은정보 알아갑니다~~ :)