MariaDB 클라언트-서버 TLS/SSL 암호화 연결(1)
MySQL / MaraiDB 서버에 TLS 를 활성화 해서 암호화 통신을 할 수 있다. MySQL (MariaDB도 동일함)에서는 서버-클라이언트 사이에 전송되는 데이터를 TLS (이전 SSL) 프로토콜을 이용하여 암호화하여 DB 정보가 노출되지 않게 방지할 수 있다. SSL을 통해서 Replication Master - Slave 도 가능하다.
글 타래:
- MariaDB 클라언트-서버 TLS/SSL 암호화 연결(1)
- MariaDB 클라언트-서버 TLS/SSL 암호화 연결(2)
- MariaDB 클라언트-서버 TLS/SSL 암호화 연결(3)
글 진행 순서:
- 사설 CA 인증서 생성
- 클라이언트 인증서 생성
- 사설 CA 인증서 설정
시스템 사양
- Armbian 23.8.1 Bullseye / mariadb-server-10.5
1. 사설 CA 인증서 생성
openssl을 사용해서 ssl_cert, ssl_key, ssl_ca 에 사용하는 서버용 사설 인증서를 생성한다.
openssl을 이용한 사설 인증서 생성에 대해서는 HTTPS 를 위한 Private SSL 기사도 참조할 수 있다.
이 글에서는 아래 참고1, 참고2 를 적용했다.
인증서는 사설 CA(Certificate Authority)용 인증서, 서버용, 클라이언트용 총 3가지를 만든다.
인증서 저장 위치 생성
1 | (SERVER) $ sudo mkdir /etc/ssl/mysql |
생성한 TLS 인증서는 MySQL/MariaDB 의 my.cnf 설정파일의 변수를 3가지 설정한다.
ssl_cert
시스템 변수: 서버 인증서(X509) 경로 지정ssl_key
시스템 변수: 서버 개인키 경로 지정ssl_ca
혹은 ssl_capath 시스템 변수: Self-signed CA certificate CA 키 경로
openssl 사설 CA 인증서 생성
저장 위치 /etc/ssl/mysql
에서 관리용 CA 인증서 생성한다.
먼저 openssl에서 rsa 알고리즘으로 4096 크기 비밀키를 생성한다.
1 | (SERVER) $ sudo openssl genrsa -out ca-key.pem 4096 |
비밀키 파일 ca-key.pem 파일을 사용해서 CA인증서 ca.pem 파일로 생성한다. 비밀키로 CA를 위한 CSR(certificate signing request) 과정을 거쳐 ca.pem 을 생성해9서 필요한 인증서 정보를 묻는다.
1 | (SERVER) $ sudo openssl req -new -x509 -nodes -days 365000 -key ca-key.pem -out ca.pem |
현재까지
1 | (SERVER) $ ls -l |
서버 인증서 생성
서버용 인증서 생성한다. 단, openssl 명령 과정에서 Common Name 을 3가지 모두 다르게 해야 검증오류를 피할 수 있다.
1 | (SERVER) $ sudo openssl req -newkey rsa:4096 -days 365000 -nodes -keyout server-key.pem -out server-req.pem |
현재 디렉토리
1 | (SERVER) $ ls -l |
RSA 알고리즘으로
1 | (SERVER) $ sudo openssl rsa -in server-key.pem -out server-key.pem |
CA 비밀키 ca-key.pem 를 사용해 X509 인증서를 사이닝한다.
1 | (SERVER) $ sudo openssl x509 -req -in server-req.pem -days 365000 -CA ca.pem -CAkey ca-key.pem -set_serial 01 -out server-cert.pem |
1 | (SERVER) $ sudo openssl verify -CAfile ca.pem server-cert.pem |
현재 디렉토리
1 | (SERVER) $ ls -l |
2. 클라이언트 인증서 생성
클라이언트 인증서는 다음과 같은 용도로 사용한다. 단, openssl 명령 과정에서 Common Name 을 3가지 모두 다르게 해야 검증오류를 피할 수 있다.
- DB 서버와 별도로 존재하는 웹 서버에서 DB 서버로 SSL 통신을 할 때 웹 서버에 적용
- 접속하고자 하는 DB 서버와 별도의 리눅스 환경에서 mysql 클라이언트 프로그램으로 DB 서버에 접속할 때 클라이언트에 적용
- Replication 에서 Master와 Slave 간의 SSL 통신을 하고자 할 때 Slave 서버에 적용
1 | (SERVER) $ sudo openssl req -newkey rsa:2048 -days 365000 -nodes -keyout client-key.pem -out client-req.pem |
1 | (SERVER) $ sudo openssl rsa -in client-key.pem -out client-key.pem |
1 | (SERVER) $ sudo openssl x509 -req -in client-req.pem -days 365000 -CA ca.pem -CAkey ca-key.pem -set_serial 01 -out client-cert.pem |
1 | (SERVER) $ sudo openssl verify -CAfile ca.pem client-cert.pem |
현재 디렉토리를 접근 권한을 조정한다.
1 | (SERVER) $ sudo chown mysql.mysql *.* |
파일 모드를 644 으로 변경한다.
1 | (SERVER) $ sudo chmod 644 *.* |
인증서의 내용 확인방법
1 | (SERVER) $ openssl x509 -text -in ca.pem |
3. 사설 CA 인증서 설정
my.cnf 에 TLS 를 위한 구성을 해야 한다. 주로 ssl_cert, ssl_key, ssl_ca 에 대한 인증서 파일을 지정해 준다.
- ssl_cert 시스템 변수: X509 인증서 경로 지정
- ssl_key 시스템 변수: 서버 개인키 경로 지정
- ssl_ca 혹은 ssl_capath 시스템 변수: Certificate Authority (CA) 경로
TLS 활성화
참고3 의 mysql 설정파일 my.cnf 에 따르면 아래 변수가 설정되야 한다.
1 | [mariadb] |
서버를 재시작한다.
TLS 가 활성화 되었는지 환경변수로 확인할 수 있다.
1 | MariaDB [(none)]> show variables like '%ssl%'; |
이렇게 구성한 TLS 인증서는 만료기간이 있다. 아래 같이 만료 기간을 확인 할 수 있다.
1 | > SHOW STATUS LIKE 'Ssl_server_not%'; |
mysql client TLS 사용 접속
mysql 클라이언트로 TLS 인증서를 사용해서 접속해 보자.
1 | (SERVER) $ mysql -u root -p -h localhost --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 |
접속한 클라인트에서 status 를 살펴보면 TLS 로 접속한 내역을 SSL: Cipher in use is TLS_AES_256_GCM_SHA384
항목으로 확인할 수 있다.
1 | MariaDB [(none)]> status |