Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MySQL

วิธีตั้งค่า SSL สำหรับ MySQL Server และ Client บน Linux

เป้าหมาย

เข้ารหัสการเชื่อมต่อ 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-cert Default 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