개요
데이터베이스에 저장된 정보는 기업의 핵심 자산입니다. 그러나 MySQL을 기본 설정 그대로 사용하면 클라이언트와 서버 사이를 오가는 데이터가 평문(암호화되지 않은 상태)으로 전송되기 때문에 네트워크 도청이나 중간자 공격에 노출될 위험이 있습니다.
이 글에서는 리눅스 환경에서 OpenSSL을 이용해 인증서를 직접 발급하고, MySQL 서버와 클라이언트 간 통신을 SSL/TLS로 암호화하는 전체 과정을 단계별로 살펴봅니다. SSL 인증서는 서버의 신원을 검증하는 역할도 하므로 피싱(phishing) 공격으로부터도 일정 수준의 보호 효과를 기대할 수 있습니다.
1단계: MySQL SSL 지원 여부 확인
먼저 MySQL 서버에 접속해 현재 SSL이 활성화되어 있는지 확인합니다.
# mysql -u root -p
mysql> SHOW VARIABLES LIKE '%ssl%';
아래처럼 have_ssl과 have_openssl 값이 DISABLED로 표시되면 아직 SSL이 비활성화된 상태입니다.
+---------------+----------+
| Variable_name | Value |
+---------------+----------+
| have_openssl | DISABLED |
| have_ssl | DISABLED |
| ssl_ca | |
| ssl_capath | |
| ssl_cert | |
| ssl_cipher | |
| ssl_key | |
+---------------+----------+
2단계: 인증서 저장 디렉터리 생성
인증서 파일들을 한곳에 모아 관리할 수 있도록 전용 디렉터리를 만듭니다.
# mkdir /etc/certificates
# cd /etc/certificates
3단계: CA(인증 기관) 인증서 생성
자체 서명 인증서 체계를 구축하려면 루트 역할을 할 CA 개인키와 CA 인증서를 먼저 생성해야 합니다. 이후 발급하는 모든 서버·클라이언트 인증서는 이 CA로 서명됩니다.
# openssl genrsa 2048 > ca-key.pem
# openssl req -new -x509 -nodes -days 1000 -key ca-key.pem > ca-cert.pem
명령 실행 중 국가(Country), 조직명(Organization), 일반 이름(Common Name) 등을 입력하라는 메시지가 나타나면 환경에 맞게 입력하거나 Enter로 건너뛰어도 무방합니다.
4단계: 서버 인증서 생성
MySQL 서버가 사용할 개인키, 인증서 요청서(CSR), 그리고 CA로 서명된 최종 인증서를 차례로 생성합니다.
# openssl req -newkey rsa:2048 -days 1000 -nodes -keyout server-key.pem > server-req.pem
# openssl x509 -req -in server-req.pem -days 1000 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 > server-cert.pem
5단계: 클라이언트 인증서 생성
동일한 방식으로 클라이언트용 인증서도 발급합니다.
# openssl req -newkey rsa:2048 -days 1000 -nodes -keyout client-key.pem > client-req.pem
# openssl x509 -req -in client-req.pem -days 1000 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 > client-cert.pem
주의: CA 인증서(ca-cert.pem)를 만들기 전에 서명 명령을 실행하면 "Error opening CA Certificate" 오류가 발생합니다. 반드시 3단계에서 CA 인증서를 먼저 생성한 뒤 서버·클라이언트 인증서에 서명해야 오류 없이 진행됩니다.
6단계: MySQL 서버에 SSL 설정 등록
생성한 인증서 경로를 my.cnf 설정 파일에 추가합니다.
# vi /etc/my.cnf
[mysqld]
ssl-ca=/etc/certificates/ca-cert.pem
ssl-cert=/etc/certificates/server-cert.pem
ssl-key=/etc/certificates/server-key.pem
7단계: MySQL 재시작 후 SSL 적용 확인
# service mysqld restart
# mysql -u root -p
mysql> SHOW VARIABLES LIKE '%ssl%';
have_ssl과 have_openssl이 YES로 변경되고 각 인증서 경로가 정상적으로 표시되면 서버 측 설정이 완료된 것입니다.
+---------------+-----------------------------------+
| Variable_name | Value |
+---------------+-----------------------------------+
| have_openssl | YES |
| have_ssl | YES |
| ssl_ca | /etc/certificates/ca-cert.pem |
| ssl_capath | |
| ssl_cert | /etc/certificates/server-cert.pem |
| ssl_cipher | |
| ssl_key | /etc/certificates/server-key.pem |
+---------------+-----------------------------------+
8단계: SSL 필수 사용자 계정 생성
SSL 연결을 통해서만 접속할 수 있는 사용자를 생성합니다. REQUIRE SSL 옵션이 지정된 계정은 일반(비암호화) 연결로는 로그인할 수 없습니다.
mysql> GRANT ALL PRIVILEGES ON *.* TO 'ssl_user'@'%' IDENTIFIED BY 'password' REQUIRE SSL;
mysql> FLUSH PRIVILEGES;
9단계: 클라이언트로 인증서 복사
클라이언트가 서버에 안전하게 접속하려면 클라이언트 인증서 파일 세 개(client-cert.pem, client-key.pem, client-req.pem)를 서버에서 클라이언트로 복사해야 합니다. scp를 이용하면 간편합니다.
# scp /etc/certificates/client-cert.pem root@192.168.87.158:/etc/certificates
# scp /etc/certificates/client-key.pem root@192.168.87.158:/etc/certificates
# scp /etc/certificates/client-req.pem root@192.168.87.158:/etc/certificates
10단계: 클라이언트에서 SSL 접속 테스트
파일 복사가 끝나면 클라이언트에서 SSL 옵션을 붙여 MySQL에 접속해 봅니다.
# mysql --ssl-ca=ca-cert.pem --ssl-cert=client-cert.pem --ssl-key=client-key.pem -h 192.168.87.156 -u ssl_user -p
접속 후 status 명령으로 연결 상태를 확인할 수 있습니다. SSL 항목에 사용 중인 암호화 방식(예: DHE-RSA-AES256-SHA)이 표시되면 SSL 연결이 정상적으로 성립한 것입니다.
mysql> status
--------------
...
SSL: Cipher in use is DHE-RSA-AES256-SHA
...
11단계: 클라이언트 영구 설정
매번 명령줄에 옵션을 입력하는 것이 번거롭다면 클라이언트 측 my.cnf에도 인증서 경로를 등록해 두세요. 이렇게 하면 이후 모든 접속이 자동으로 SSL을 통해 이루어집니다.
# vi /etc/my.cnf
[client]
ssl-ca=/etc/certificates/ca-cert.pem
ssl-cert=/etc/certificates/client-cert.pem
ssl-key=/etc/certificates/client-key.pem
마무리
여기까지 완료하면 클라이언트는 항상 SSL 암호화 채널을 통해 MySQL 서버에 접속하게 됩니다. 네트워크 구간에서 데이터가 탈취되더라도 내용을 해독할 수 없으며, 인증서 기반 검증을 통해 가짜 서버로의 접속 위험도 크게 줄일 수 있습니다.
운영 환경에서는 자체 서명 인증서 대신 신뢰할 수 있는 인증 기관(CA)에서 발급받은 인증서를 사용하고, 개인키 파일의 소유권과 권한(예: 600)을 철저히 관리하는 것이 좋습니다. 또한 MySQL 5.7 이상 버전에서는 mysql_ssl_rsa_setup 유틸리티로 SSL 인증서를 더 간편하게 생성할 수 있으니 참고하시기 바랍니다.