2009년 11월 13일 금요일

MySQL 보안 - stone with SSL

stone은 심플한 패킷 리피터로 TCP나 UDP를 릴레이 하는 것이 가능하다.

작고 가볍기 때문에 간단한 벽에 구멍을 내거나 패킷 내용 취득등에 많이 사용되고 있다.

OpenSSL를 같이 쓸 수 있기때문에 SSL통신을 할 수 있다.

MySQL클라이언트나 서버를 SSL통신을 시킬려면 stone은 1개(또는 0개)여도 충분하지만 여기에서는 MySQL클라이언트와 서버 둘다 SSL가 설치되지 않았다고 가정하고 이야기한다.

stone사용예

[Local] ------------------------------------[Remoe]
mysql-> 3308(stone) ==(암호화)==> 3307(stone)->3306(mysqld)



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에 주의해야한다.



2009년 11월 9일 월요일

MySQL 보안 - TCP Wrapper

MySQL에 TCP Wrapper가 되게 하려면 configure옵션에 --with-libwrap을 지정한다.

shell$ ./configure --with-libwrap=/usr

디렉토리가 지정된 경우, 지정된 디렉토리 밑에 TCP Wrapper 헤더파일과 라이브러리가 필요하다.

컴파일과 인스톨이 끝난 뒤는 다른 TCP Wrapper설정과 마찬가지로 hosts.allow와 hosts.deny파일을 편집해야한다.

hosts.{allow,deny}의 최초 컬럼은 프로그램이름이다. 보통은 mysqld이지만 만약 바이너리 파일의 이름을 변경했을 경우에는 그것으로 해야한다.

hosts.deny파일의 편집예

mysqld: .my.domain
mysqld-5.1: 192.168.0.0/255.255.255.240


libwrap를 추가하면 클라이언트가 접속할 때마다 서버는 TCP Wrapper를 이용해서 클라이언트의 접속의 허가, 거부를 수행한다.




2009년 11월 4일 수요일

MySQL 보안 - SSL통신7

SSL통신을 필수로 하기

어떤 유저의 통신에는 반드시 SSL을 사용하는 경우는 GRANT문에 REQUIRE를 지정한다.

mysql>GRANT .... TO 'mycom'@'192.168.0.1' REQUIRE SSL;

또한 어떤 유저는 반드시 올바른 인증을 받지 않으면 안되는 경우에는 GRANT문에 REQUIRE X509를 지정한다.

mysql>GRANT .... TO 'mycom'@'192.168.0.1' REQUIRE X509;


Subject고정

어떤 사용자의 Subject를 고정하고픈 경우는 GRANT문에 SUBJECT를 추가한다.
클라이언트 키의 Subject가 다른 경우, 서버는 접속을 거부한다.

mysql>GRANT .... TO 'mycom'@'192.168.0.1' REQUIRE SUBJECT '/C=KR/L=Basel/O=MYCOM/OU=DB Comms/CN=whatever'

키의 Subject를 표시하고 싶은 경우에는 다음과 같이 한다.

shell$ openssl x509 -text -in client-cert.pem


Issuer의 고정

어떤 유저의 Issuer를 고정하고픈 경우는 GRANT문에 ISSUER를 추가한다.
클라이언트 키의 Issuer가 다른 경우는 서버는 접속을 거부한다.

mysql>GRANT .... TO 'mycom'@'192.168.0.1' REQUIRE ISSUER '/C=KR/O=MYCOM/OU=Certificate Authority/CN=whatever';

Cipher의 고정

어떤 유저의 암호화방식을 고정하고픈 경우는 GRANT문에 CIPHER를 추가한다.

mysql> GRANT .... TO 'mycom'@'192.168.0.1' REQUIRE CIPHER 'DHE-RSA-AES256-SHA:AES128-SHA';

Cipher 리스트는 복수의 암호화를 「:」로 구분짓는다. 특별한 지정으로 「ALL」 하고 「-」이 있다.
예를 들어 , 다음처럼 한 경우 모든 암호화 방식에서 DHE-RSA-AES256-SHA:를 제거한 암호화 방식을 채용한다.
CIPHER 'ALL:DHE-RSA-AES256-SHA'

지원되는 Cipher확인하려면 다음과 같은 조작을 한다.

shell$ openssl ciphers