개요

클라이언트에서 MySQL 서버에 접속할 때 기본적으로 평문 통신을 한다. 이 경우 서버와 클라이언트 사이에 오가는 데이터들은 그대로 네트워크상에 노출되며, 이로인해 스니핑과 같은 공격으로 인해 중요 정보가 외부에 유출될 수 있다.

여기서, MySQL 서버-클라이언트 관계는 MySQL 서버 - 개발자 PC도 있지만 Replication Master - Slave 관계도 포함된다.

MySQL (MariaDB도 동일함)에서는 서버-클라이언트 사이에 전송되는 데이터를 SSL/TLS (이하 SSL) 프로토콜을 이용하여 암호화하여 DB 정보가 노출되지 않게 방지할 수 있다.

테스트 환경

  • CentOS 7
  • OpenSSL 1.1.1i
  • MySQL 5.6.48 / MySQL 5.7.32
  • MariaDB 10.4.17

버전별 SSL 지원 현황

MySQL 5.6

  • 5.6.5까지 : SSL을 지원하지 않음 (옵션 : no)
  • 5.6.6~5.6.45 : mysql 소스에 포함된 SSL 라이브러리를 사용 (옵션 : bundled)
  • 5.6.46 ~ : 시스템에 설치되어 있는 (yum install openssl-devel) OpenSSL 라이브러리를 이용 (기본 옵션 : system)
  • MySQL 컴파일 설치 시, -DWITH_SSL 옵션으로 지정된 컴파일 설치한 OpenSSL의 라이브러리를 사용할 수 있다.
    • ex : “-DWITH_SSL=/usr/local/openssl”
  • 공식사이트 설명 : https://dev.mysql.com/doc/refman/5.6/en/source-configuration-options.html#option_cmake_with_ssl

MySQL 5.7

  • ~ 5.7.27 : mysql 소스에 포함된 SSL 라이브러리를 사용 (기본 옵션 : bundled)
  • 5.7.28 ~ : 시스템에 설치되어 있는 (yum install openssl-devel) OpenSSL 라이브러리를 이용 (기본 옵션 : system)
  • MySQL 컴파일 설치 시, -DWITH_SSL 옵션으로 지정된 컴파일 설치한 OpenSSL의 라이브러리를 사용할 수 있다.
    • ex : “-DWITH_SSL=/usr/local/openssl”
  • 공식사이트 설명 : https://dev.mysql.com/doc/refman/5.7/en/source-configuration-options.html#option_cmake_with_ssl

MariaDB 10.2.x 이상

  • 기본적으로 시스템에 설치되어 있는 GnuTLS 라이브러리를 이용
    • 그래서 설치 전 “yum -y install gnutls-devel” 명령어로 라이브러리 설치
    • -DWITH_SSL 의 기본 옵션 : system
  • yum으로 openssl-devel과 gnutls-devel이 같이 설치되어있을 경우 openssl-devel을 우선 사용
  • MariaDB 컴파일 설치 시, -DWITH_SSL 옵션으로 지정된 컴파일 설치한 OpenSSL의 라이브러리를 사용할 수 있다.
    • ex : “-DWITH_SSL=/usr/local/openssl”

사설 인증서 생성

아래의 링크 참고

[MySQL/MariaDB] MySQL/MariaDB에서 사용할 사설 인증서 생성하기

GnuTLS를 이용하여 설치한 MariaDB 10.4.18 이후 버전은 GnuTLS로 사설 인증서를 생성해야 한다.

  • 해당 버전부터 wolfSSL 버전이 4.4.0에서 4.6.0으로 변경되었으며 위 링크에서 생성한 OpenSSL로 생성한 사설 인증서를 정상적으로 인식하질 않는다.

인증서 설정

서버 측 설정

인증서 파일과 경로에 mysql 권한 설정

[root@localhost mysql]# chown mysql. *
[root@localhost mysql]# ls -al
drwxr-xr-x  2 root  root   172  7월 18 11:35 .
drwxr-xr-x. 3 root  root    32  7월 18 11:17 ..
-rw-r--r--  1 mysql mysql 1675  7월 18 11:26 ca-key.pem
-rw-r--r--  1 mysql mysql 1314  7월 18 11:27 ca.pem
-rw-r--r--  1 mysql mysql 1168  7월 18 11:27 server-cert.pem
-rw-------  1 mysql mysql 1679  7월 18 11:27 server-key.pem
-rw-r--r--  1 mysql mysql  993  7월 18 11:27 server-req.pem

my.cnf 에 아래의 내용 추가

[root@localhost mysql]# vi /etc/my.cnf
[mysqld]
~
### SSL/TLS
ssl_cert = /etc/ssl/mysql/server-cert.pem
ssl_key = /etc/ssl/mysql/server-key.pem
ssl_ca = /etc/ssl/mysql/ca.pem

mysql 서비스 재실행

[root@localhost mysql]# systemctl restart mysqld.service 

SSL 적용 상태 확인




클라이언트 측 설정

해당 내용은 리눅스 환경에서 mysql 클라이언트 프로그램을 이용하여 원격 서버에 접속하는 경우 설정한다. 윈도우 환경에서 mysql 서버로 원격 접속할 경우에는 SSL 인증서 등록이 필요 없다.

테스트 환경

서버 환경
- CentOS 7.9
- MariaDB 10.4.17
	
클라이언트 환경
- CentOS 7.9
- MySQL 5.6.48 (클라이언트 프로그램 기준)
[root@localhost mysql]# ls -al /etc/ssl/mysql/
합계 16
drwxr-xr-x  2 root  root    87  2월  9 14:44 .
drwxr-xr-x. 3 root  root    32  2월  9 14:42 ..
-rw-r--r--  1 mysql mysql 1310  2월  9 14:43 ca.pem
-rw-r--r--  1 mysql mysql 1164  2월  9 14:43 client-cert.pem
-rw-------  1 mysql mysql 1679  2월  9 14:43 client-key.pem
-rw-r--r--  1 mysql mysql  989  2월  9 14:43 client-req.pem
	
[root@localhost mysql]# /usr/local/mysql/bin/mysql -u root -p -h 203.231.238.121 --ssl=TRUE --ssl-ca=/etc/ssl/mysql/ca.pem --ssl-cert=/etc/ssl/mysql/client-cert.pem --ssl-key=/etc/ssl/mysql/client-key.pem



윈도우 환경에서 SSL로 서버에 접속하기 (HeidiSQL)

일반적인 접속 방법



아래와 같이 MySQL 접속 정보가 평문으로 나온다.


아래와 같이 쿼리를 입력했을 때 해당 쿼리는 물론이거니와 결과값도 평문으로 나온다.

use mysql;

SHOW TABLES;


SSL 적용

접속 정보에서부터 TLS 1.2로 암호화되는 것을 알 수 있다.

‘SSL 사용’ 체크 이외에 다른 설정 할 필요 없다.



특정 계정에 대해 무조건 SSL 접속을 하도록 설정

MySQL 서버 (또는 Replication의 마스터 서버) 에서 아래와 같이 REQUIRE SSL 옵션을 추가한다.

MariaDB [mysql]> grant all privileges on *.* to 'root'@'클라이언트IP' identified by 'asdf1234' REQUIRE SSL;

Heidi에서 원격 접속 시 ‘SSL 사용’을 설정하지 않으면 아래와 같이 접속 실패 메시지가 나타난다.


SSL을 통해 접속을 진행한 후 연결 정보를 확인한다.