본문 바로가기

HOW TO HACK/Basics

해커라면 알아야 할 리눅스 기초-14 : MySQL에 SSH 터널링으로 연결하기

# 본 게시글은 작성자 본인의 스터디한 내용을 바탕으로 작성된 글입니다.


# 본 게시글에는 일부 잘못된 정보가 포함되어있을 수 있습니다.


# 이 글을 열람하는 것은 위 사항에 동의하는 것으로 간주합니다.


# 잘못된 정보에 대한 예의바른 태클 및 지적질 적극 환영합니다.





이번 포스팅에서는 이전 글에서 살펴봤던 MySQL 데이터베이스에 SSH Tunneling(터널링)을 통해 연결하는 방법을 다루도록 하겠습니다. 



Step 1 : SSH란?



SSHSecure Shell의 약자이며, 안전한 원격통신을 위해 사용됩니다.

왜 안전한 원격통신에 사용되냐면...

이 SSH는 원격에 있는 호스트와 데이터 통신을 할 때 데이터를 암호화해서 통신하거든요.

주로 많이 사용되었던 ftp, telnet, rlogin과 같은 방식은 암호화가 되지 않는 방식으로 원격 호스트와 통신하므로 

스니핑(Sniffing) 공격 기법을 통해 얼마든지 데이터가 노출될 수 있습니다. 

바로 이런 취약한 부분을 대체하기 위해 만들어진 프로토콜 혹은 프로그램입니다.

윈도우에서는 기본적으로 SSH가 설치되어있지 않습니다. 그래서 PuTTY와 같은 SSH클라이언트 프로그램을 별도로 설치를 해야 합니다. 하지만 대부분의 리눅스 배포판는 거의 SSH서버와 SSH클라이언트가 설치되어있습니다. 

기본 사용포트는 22번 포트를 사용하며, SSH는 아래의 기능(출처:한빛미디어 사이트)을 제공합니다.


  • 인증(Authentication)

사용자와 서버를 인증한다. 사용자는 SSH 서버에 접속할 때 신분을 증명해야 하는데, 전통적인 패스워드 인증 방식과 더불어 RSA, DSA등 공개키 방식의 인증 방법도 지원한다. 또한 SSH 클라이언트는 처음 접속한 서버의 키를 저장함으로써 서버가 변경되었을 경우에도 이를 판별할 수 있다.


  • 암호화(Encryption)

보통의 다른 서버/클라이언트 방식의 접속과 달리 SSH는 네트워크를 통해 전달되는 데이터를 암호화한다. 그래서 누군가 중간에서 데이터를 가로채더라도 내용을 알 수가 없다. 3DES, blowfish 등의 대칭키 방식의 암호화 방식을 제공하고 새로운 암호화 기법을 추가할 수 있게 설계되어 있다.


  • 무결성(Integrity)

네트워크를 통해 받은 데이터가 변경되지 않았음을 보장한다. 누군가 데이터를 가로채서 다른 정보를 보내는 것을 방지할 수 있다. MAC(Message Authentication Code)을 통해 이를 구현하고 있다.


  • 압축(Compression)

SSH 연결을 통해 보낸 데이터를 압축 할 수 있다. SSH 클라이언트/서버 사이에서 데이터를 보내기 전에 압축하고 이를 암호화해서 전송한다. 데이터를 받는 쪽에서는 복호화(decryption)한 후 압축을 해제함으로써 구현한다.




SSH 터널링이란 바로 이 SSH를 이용한 터널링 기법을 말하며, SSH 포트포워딩이라고도 합니다. 

특정 포트로 들어오는 접속을 SSH를 통해서 통신하게 하는 방법이죠.

음... 쉽게 말해 (쉬울진 모르겠지만...)

원래의 포트가 아닌 다른 포트가 데이터 송/수신을 대신 처리해주는 것으로,

방화벽에 포트가 차단되어 있을 때, 우회하는 용도로 사용되기도 합니다.

또한, 완벽하지는 않지만 서버와 클라이언트간 데이터 통신의 보안을 위해 SSH 터널링이 사용되기도 하죠.

왜 완벽하지 않은지는 SSH 터널링 동작방식 부분에서 자연스레 아실 수 있으십니다.



Step 2 : SSH 터널링 동작 방식


SSH 터널링 방식에는 두 가지가 있습니다.

로컬(Local) 방식과 리모트(Remote) 방식입니다.

로컬과 리모트방식의 차이는 대기(Listening)포트를 SSH서버와 SSH클라이언트 중 어느 측에 열어두고 있느냐의 차이입니다.


먼저 로컬방식부터 그 동작방식을 살펴볼게요.

호스트A에는 SSH클라이언트가 설치되어있고, 호스트B에는 SSH서버가 설치되어있다고 가정합시다.



우선 로컬포워딩의 사용법은 아래의 명령어 형식으로 사용할 수 있습니다.


# ssh -L대기포트:목적지IP:목적지포트 SSH서버IP


위 그림을 보시면 아시겠지만, 호스트A의 SSH 클라이언트에서 대기포트를 열고 대기(Listening)합니다.

이 대기포트로 Application Client(혹은 다른 호스트)에서 요청이 들어오면 22번 포트를 이용하여 호스트B에 있는 SSH서버와 터널링 연결이 맺어지고, 데이터가 송신됩니다. SSH 터널링을 통해 데이터를 받은 SSH서버는 목적지IP 호스트의 목적지포트로 데이터를 포워딩(Forwarding)하게 됩니다.


리모트방식은 로컬방식과 반대입니다.

아래 그림을 잘 보시면 로컬방식과 비교했을 때 SSH서버와 SSH클라이언트의 위치가 바뀌어있습니다.



즉, SSH서버측에서 포트를 열고 대기(Listening)를 하죠. 사용법은 아래 형식대로 사용하시면 됩니다.


# ssh -R대기포트:목적지IP:목적지포트 SSH서버IP


SSH서버에서 대기(Listening)중인 포트로 데이터가 들어오면 SSH 터널링 구간을 통해 SSH클라이언트에게 데이터를 전해주고, 목적지IP 호스트의 목적지포트로 데이터를 포워딩(Forwarding)합니다.


자, 그럼 왜 완벽히 안전하지 않느냐? 눈치채셨나요?

SSH 터널링을 통한 암호화 구간은 데이터 노출에 있어 안전합니다. 하지만 SSH 터널링 구간의 이전 혹은 이후 구간은 암호화되지 않는 구간으로 공격자가 그 길목에 위치해서 데이터를 스니핑한다면 그대로 노출될 위험이 있죠.

 

SSH 터널링이 이해하기 좀 어렵긴 합니다. 그럼 실습을 통해 확인해보죠..



Step 3 : SSH 실행하기


저는 버추얼박스에서 가상호스트 2대(칼리리눅스 2.0 + CentOS 5.3)로 실습환경을 구성하였습니다.

아래와 같이 CentOS에서는 MySQL을 설치하고, MySQL데몬(mysqld)과 SSH서버(sshd) 서비스를 실행시켜두었습니다.

(MySQL 설치과정은 생략할게요^^)



그럼, 칼리리눅스에서 터미널을 열어 CentOS로 로컬방식의 SSH 터널링을 뚫어 MySQL서버에 접속해보도록 하겠습니다.

아래 명령어를 입력하세요.


# ssh -L3316:127.0.0.1:3306 root@192.168.0.66


-L : 로컬포워딩

3316 : 대기포트, 1024~65535번 포트 사이에서 임의로 선택 

127.0.0.1 : 목적지IP, 최종 목적지인 MySQL서버는 SSH서버가 설치되어있는 CentOS이므로 자기자신(loopback) 주소 지정함

3306 : 목적지포트, 3306은 MySQL 기본포트임

root@192.168.0.66 : MySQL서버(CentOS)의 IP주소 및 접속 계정명


위 명령의 실행 결과를 그림으로 표현하면 아래의 형태로 Connection이 이루어지겠죠.




CentOS의 패스워드를 물어보네요. 접속에 사용된 root 계정의 패스워드를 입력하니 CentOS 로그인에 성공했습니다.



Step 5 : MySQL 접속하기


이전 단계에서 우리는 SSH 터널링을 통해 CentOS에 안전하게 접속하였습니다.

이제 이전 포스팅에서 배운 방법대로 CentOS의 MySQL에 접속을 해볼까요?

아래 링크 참조하세요^^


  해커라면 알아야 할 리눅스 기초-13 : MySQL 다루기


# mysql -u root -p



패스워드 입력하여 MySQL에 정상적으로 접속이 되었습니다. 

'show databases' 명령을 어떤 데이터베이스가 있는지 목록을 출력해볼까요?


mysql> show databases;




위의 스크린샷처럼 데이터베이스 목록이 잘 출력됩니다.


지금까지 SSH터널링 및 SSH터널링을 통한 MySQL 접속방법에 대해 알아보았습니다.

관리적 측면이나, 보안적 측면에서나 유용하게 쓰일 지식이니 꼭 알아두세요. <끝>