เป้าหมาย
เข้ารหัสการเชื่อมต่อ MySQL ด้วย SSL/TLS ป้องกันการดักฟังข้อมูล (Eavesdropping) และ Verify Identity ป้องกัน Phishing/Man-in-the-Middle
1. ตรวจสอบสถานะ SSL ปัจจุบัน
mysql> SHOW VARIABLES LIKE '%ssl%'; +---------------+----------+ | Variable_name | Value | +---------------+----------+ | have_openssl | DISABLED | | have_ssl | DISABLED | | ssl_ca | | | ssl_cert | | | ssl_key | | +---------------+----------+
2. สร้าง SSL Certificates (Self-Signed สำหรับ Dev/Test)
# mkdir /etc/mysql/certs && cd /etc/mysql/certs # CA Private Key openssl genrsa 2048 > ca-key.pem # CA Certificate openssl req -new -x509 -nodes -days 3650 -key ca-key.pem -out ca-cert.pem -subj "/CN=MySQL-CA" # Server Key & CSR openssl req -newkey rsa:2048 -days 3650 -nodes -keyout server-key.pem -out server-req.pem -subj "/CN=mysql-server" # Server Certificate (Signed by CA) openssl x509 -req -in server-req.pem -days 3650 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 -out server-cert.pem # Client Key & CSR openssl req -newkey rsa=2048 -days 3650 -nodes -keyout client-key.pem -out client-req.pem -subj "/CN=mysql-client" # Client Certificate (Signed by CA) openssl x509 -req -in client-req.pem -days 3650 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 02 -out client-cert.pem # Verify openssl verify -CAfile ca-cert.pem server-cert.pem client-cert.pem
3. กำหนดค่า MySQL Server (my.cnf)
[mysqld] ssl_ca=/etc/mysql/certs/ca-cert.pem ssl_cert=/etc/mysql/certs/server-cert.pem ssl_key=/etc/mysql/certs/server-key.pem # บังคับ SSL (Optional) # require_secure_transport=ON
4. Restart MySQL และตรวจสอบ
# systemctl restart mysqld mysql> SHOW VARIABLES LIKE '%ssl%'; +---------------+-----------------------------------+ | Variable_name | Value | +---------------+-----------------------------------+ | have_openssl | YES | | have_ssl | YES | | ssl_ca | /etc/mysql/certs/ca-cert.pem | | ssl_cert | /etc/mysql/certs/server-cert.pem | | ssl_key | /etc/mysql/certs/server-key.pem | +---------------+-----------------------------------+
5. สร้าง User ที่บังคับ SSL
mysql> CREATE USER 'ssl_user'@'%' IDENTIFIED BY 'password' REQUIRE SSL; mysql> GRANT ALL PRIVILEGES ON *.* TO 'ssl_user'@'%'; mysql> FLUSH PRIVILEGES;
6. กำหนดค่า Client (my.cnf)
คัดลอก ca-cert.pem, client-cert.pem, client-key.pem ไป Client Machine
[client] ssl_ca=/etc/mysql/certs/ca-cert.pem ssl_cert=/etc/mysql/certs/client-cert.pem ssl_key=/etc/mysql/certs/client-key.pem
7. ทดสอบการเชื่อมต่อ SSL
# ระบุ Certificate ตรงๆ mysql --ssl-ca=ca-cert.pem --ssl-cert=client-cert.pem --ssl-key=client-key.pem -h server_ip -u ssl_user -p # หรือใช้ Config File (ถ้าวางไว้ที่ ~/.my.cnf หรือ /etc/my.cnf) mysql -h server_ip -u ssl_user -p
8. ตรวจสอบว่าเชื่อมต่อ SSL จริง
mysql> STATUS; ... SSL: Cipher in use is TLS_AES_256_GCM_SHA384 ... # หรือ mysql> SHOW SESSION STATUS LIKE 'Ssl_cipher'; +---------------+-----------------------+ | Variable_name | Value | +---------------+-----------------------+ | Ssl_cipher | TLS_AES_256_GCM_SHA384| +---------------+-----------------------+
Production Considerations
- CA สำหรับ Production: ใช้ CA จริง (Let's Encrypt, DigiCert, Internal PKI) ไม่ใช่ Self-Signed
- Certificate Rotation: ตั้ง Expire ไม่เกิน 1 ปี มีกระบวนการ Renew อัตโนมัติ
- TLS Version: บังคับ TLS 1.2+
tls_version=TLSv1.2,TLSv1.3 - Cipher Suites: จำกัด Cipher ที่ปลอดภัย
ssl_cipher=ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256 - Verification: Client ต้อง Verify Server Cert (
--ssl-verify-server-certDefault ON ใน MySQL 8.0+)
สรุป
SSL MySQL ต้อง: 1) สร้าง CA/Server/Client Certs 2) Config Server my.cnf 3) Restart 4) Create User REQUIRE SSL 5) Config Client my.cnf 6) Test ด้วย STATUS/SHOW SESSION STATUS