DB

[MySQL] (보안설정3️⃣) 데이터 in transit 암호화: 네트워크 구간 보안 설정법

인생아 2025. 7. 16. 17:51
반응형

MySQL에서 클라이언트와 서버 간 통신은 기본적으로 평문(Plain text)이다.
따라서 암호화를 설정하지 않으면 ID, 비밀번호, 쿼리, 결과값까지 그대로 네트워크를 타고 전달된다.
이런 환경에서는 중간자 공격(Man-in-the-Middle)이나 패킷 스니핑에 매우 취약하다.
이를 방지하기 위해 MySQL은 SSL/TLS 기반의 암호화 통신 기능을 제공한다.

이번 글에서는 MySQL에서 데이터를 전송할 때 암호화 통신을 설정하는 방법
SSL 인증서 적용 흐름, 그리고 실무에서 주의할 점까지 정리한다.

✅ in transit 암호화란?

  • 네트워크를 통해 전송 중인 데이터 자체를 암호화하는 방식
  • 공격자가 네트워크를 감청해도 내용을 읽을 수 없도록 보호
  • TLS 기반의 SSL 인증서 연결 설정으로 구현

🔐 MySQL에서 SSL 통신을 사용하려면?

  • 서버와 클라이언트 모두 SSL 인증서를 설정해야 함
  • 최소 3가지 파일이 필요함
    • CA 인증서 (ca.pem)
    • 서버 인증서 (server-cert.pem)
    • 서버 키 (server-key.pem)

이 파일들은 직접 생성할 수도 있고, 내부 인증기관 또는 Let's Encrypt 등에서 발급받을 수도 있다.

반응형

🛠️ 1단계: SSL 인증서 생성

테스트 용도로는 openssl 명령어로 직접 생성 가능

# CA 인증서 생성
openssl genrsa 2048 > ca-key.pem
openssl req -new -x509 -nodes -days 365 -key ca-key.pem -out ca.pem

# 서버 인증서
openssl req -newkey rsa:2048 -nodes -keyout server-key.pem -out server-req.pem
openssl x509 -req -in server-req.pem -days 365 -CA ca.pem -CAkey ca-key.pem -set_serial 01 -out server-cert.pem

# 클라이언트 인증서도 동일 방식으로 생성 가능

🛠️ 2단계: MySQL 서버 설정

my.cnf 또는 mysqld.cnf 설정 파일에 아래 항목 추가

[mysqld]
ssl-ca = /etc/mysql/ssl/ca.pem
ssl-cert = /etc/mysql/ssl/server-cert.pem
ssl-key = /etc/mysql/ssl/server-key.pem

MySQL 재시작 후 적용

sudo systemctl restart mysql

설정 적용 여부는 아래 쿼리로 확인 가능

SHOW VARIABLES LIKE '%ssl%';

have_ssl 값이 YES이면 SSL 통신 활성화 완료된 상태다.

반응형

🛠️ 3단계: 클라이언트 접속 확인

MySQL 클라이언트로 SSL 옵션을 붙여 접속

mysql -u root -p --ssl-ca=ca.pem --ssl-cert=client-cert.pem --ssl-key=client-key.pem

또는 JDBC에서 SSL 옵션을 붙이는 경우

jdbc:mysql://hostname:3306/dbname?useSSL=true&requireSSL=true&verifyServerCertificate=true

접속 후 SSL 사용 여부 확인

SHOW SESSION STATUS LIKE 'Ssl_version';

SSL 버전이 출력되면 암호화 통신이 정상적으로 적용된 것이다.

🧠 실무 적용 팁

  • 서버와 클라이언트 둘 다 인증서를 갖고 있어야 양방향 인증이 가능함
  • 인증서는 파일 권한(600) 설정, 키 유출 방지 필수
  • 클라우드 환경(GCP, AWS)에서는 RDS, Cloud SQL에서 자동 적용 지원
  • SSL 통신은 CPU 사용량이 증가하므로 서버 리소스를 고려해야 함
  • MySQL 8.0 이상에서는 require_secure_transport = ON 설정으로 SSL 강제 가능
[mysqld]
require_secure_transport = ON

이 설정을 하면 일반 연결은 모두 거부되고, 반드시 SSL을 사용해야 접속할 수 있다.

📘 공식 문서 참고

https://dev.mysql.com/doc/refman/8.0/en/using-encrypted-connections.html

 

반응형