Computer >> 컴퓨터 >  >> 프로그래밍 >> MySQL

리눅스에서 MySQL 서버·클라이언트 SSL 암호화 연결 설정하는 방법

개요

데이터베이스에 저장된 정보는 기업의 핵심 자산입니다. 그러나 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 인증서를 더 간편하게 생성할 수 있으니 참고하시기 바랍니다.