首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 資料庫安全解決方案(三):SSL/TLS 加密連線配置與 GRANT REQUIRE 子句完整指南

     編輯:MySQL 資料庫相關知識

本系列第三篇,聚焦傳輸層加密。MySQL 4.1+ 內建 OpenSSL 支援,透過 GRANT ... REQUIRE SSL/X509/SUBJECT/ISSUER/CIPHER 強制特定帳號走加密通道,防止帳號密碼與敏感資料在網路明文傳輸。

前置檢查:確認 OpenSSL 支援

SHOW VARIABLES LIKE 'have_openssl';
-- Value = YES 表示已編入 OpenSSL;NO 需重新編譯或安裝支援版本

Windows 官方安裝包通常已內建;Linux 發行版套件多預設開啟。

GRANT REQUIRE 子句完整語法與場景

子句語法範例適用場景驗證邏輯
REQUIRE SSLGRANT ALL ON db.* TO 'u'@'%' IDENTIFIED BY 'p' REQUIRE SSL;最低要求:任何加密連線即可僅檢查連線是否使用 SSL/TLS
REQUIRE X509... REQUIRE X509;要求客戶端提供有效 X.509 憑證(不驗證具體主體)驗證憑證鏈有效性、未過期
REQUIRE SUBJECT... REQUIRE SUBJECT '/C=US/ST=NY/L=Albany/O=Widgets/CN=client/email=...';指定**客戶端憑證主體 DN**(Distinguished Name)嚴格匹配 Subject 字串
REQUIRE ISSUER... REQUIRE ISSUER '/C=US/ST=NY/L=Albany/O=Widgets/CN=ca/email=...';指定**簽發者 CA 憑證主體**信任特定 CA 簽發的所有客戶端憑證
REQUIRE CIPHER... REQUIRE CIPHER 'EDH-RSA-DES-CBC3-SHA';指定允許的加密套件僅允許列出的 Cipher Suite
組合使用... REQUIRE SUBJECT '...' AND ISSUER '...' AND CIPHER '...';多重驗證,最高安全等級所有條件同時滿足

完整部署步驟(生產級)

  1. 產生 CA 憑證:openssl req -new -x509 -keyout ca-key.pem -out ca-cert.pem -days 3650
  2. 產生伺服器憑證/金鑰:openssl req -new -keyout server-key.pem -out server-req.pem → openssl x509 -req -in server-req.pem -CA ca-cert.pem -CAkey ca-key.pem -out server-cert.pem
  3. 產生客戶端憑證/金鑰:同上,Common Name 設為客戶端識別名(如 app-server-1)。
  4. 配置 MySQL 伺服器 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
    require_secure_transport=ON  -- 5.7+ 全域強制加密
    
  5. 重啟 MySQL,驗證 SHOW VARIABLES LIKE 'have_ssl'; = YES。
  6. 建立強制 SSL 帳號:
    CREATE USER 'secure_app'@'%' IDENTIFIED BY 'strongPass' REQUIRE SSL;
    GRANT SELECT, INSERT, UPDATE ON app_db.* TO 'secure_app'@'%';
    FLUSH PRIVILEGES;
    
  7. 客戶端連線驗證:
    mysql -u secure_app -p -h db-host \
      --ssl-ca=/path/ca-cert.pem \
      --ssl-cert=/path/client-cert.pem \
      --ssl-key=/path/client-key.pem
    

    或 PHP PDO:PDO::MYSQL_ATTR_SSL_CA、PDO::MYSQL_ATTR_SSL_CERT、PDO::MYSQL_ATTR_SSL_KEY。

常見坑與排查

  • ERROR 2026 (HY000): SSL connection error → 憑證路徑錯誤、權限不足、CN 不匹配、CA 不信任。
  • require_secure_transport=ON 會拒絕**所有**非加密連線(含 root 本地),確保已有加密管理通道再開啟。
  • 憑證過期會導致連線失效,建立憑證輪換自動化流程(Certbot/ACME 或內部 PKI)。
  • 效能影響:TLS 握手增加首次連線延遲(~1-5ms),長連線/連線池可攤銷;CPU 開銷極低(AES-NI 硬體加速)。

最佳實踐清單

  1. **全環境強制加密**:require_secure_transport=ON + 所有帳號 REQUIRE SSL。
  2. **生產核心帳號升級**:REQUIRE X509 + REQUIRE ISSUER(信任企業 CA),實現雙向認證(mTLS)。
  3. **自動化部署**:Ansible/Terraform 管理憑證生命週期、MySQL 配置、帳號權限。
  4. **審計日誌**:啟用 log_connections、log_disconnections,記錄 SSL 協商資訊。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved