2009년 11월 11일 수요일

MySQL 보안 - SSH port forwarding

SSH를 사용해서 통신경로를 암호화하는 방법도 있다.

단지, MySQL서버가 동작하고 있는 운영체제에 계정을 가지고 있을 필요가 있다.


[클라이언트]                                  [서버]
mysql-> 3307(ssh) ==(암호화)==> (sshd)->3306(mysqld)


클라이언트로 mysql명령어를 사용한다고 가정하자.
자기가 사용하고 있는 로컬 컴퓨터의 TCP/IP 의 3307번 포트를 ssh가 처리할 수 있도록 한다.
Local의 ssh는 포트 3307로 받아들인 내용을 리모트 컴퓨터의 sshd에 송신, remote의 포트 번호 3306으로 전송하도록 한다.

이 방식을 실현하기 위해서는 -L옵션을 사용해서 클라이언트 머신에서 다음과 같이 ssh를 실행한다.
ssh -L 3307:localhost:3306 remote-server

3307
local 장비에서의 포트 번호이다. mysql명령어나 ssh명령어를 실행하려고 하는 컴퓨터에서의 포트를 말한다.

localhost:3306
remote장비에서 볼 때 어느 호스트, 어느 포트인가 지정한다. 위 표기는 같은 장비 3306를 포워딩하게 된다.

Local에서 조작은 실제로 다음과 같이 될 것이다.

shell$ ssh -L 3307:localhost:3306 mycom@remote.server.name &
shell$ mysql -h 127.0.0.1 -P 3307


mysql명령어에는 -h 127.0.0.1로 TCP/IP를 이용한 접속을 지정하고 -P 3307로 포트 번호를 지정한다.

TCP/IP포트번호 1024이하는 root계정이 아니면 사용할 수 없으므로 주의한다.

MySQL서버(mysqld)에 접속하는 것은 MySQL서버와 같은 컴퓨터에서 동작하고 있는 sshd임으로 mysqld에서 보면 클라이언트는 '사용자명'@'127.0.0.1'이 된다. 따라서 GRANT에 주의해야한다.