개요
클라이언트에서 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을 통해 접속을 진행한 후 연결 정보를 확인한다.