MySQL 作為全球最流行的開源關係型資料庫,其安全性直接關係到企業核心資產的安危。本文系統整理了 23 項關鍵安全配置與最佳實踐,涵蓋網路傳輸加密、存取控制、權限最小化、審計監控等核心維度,助您構建纏深防禦體系。
當客戶端與伺服器需跨越不可信網路(如公網)通訊時,務必透過 SSH 隧道或 SSL/TLS 加密連線,防止資料被竊聽、竄改或重放攻擊。
禁止在腳本、配置檔或命令列中使用明文密碼。應採用單向雜湊函式(如 SHA-256)儲存密碼雜湊值,並啟用 MySQL 原生的 caching_sha2_password 認證外掛。
使用防火牆或路由器規則,僅允許應用伺服器 IP 存取 3306 連接埠。可透過 nmap -p 3306 或 telnet host 3306 驗證封鎖成效。
在生產環境強制要求 SSL 連線(REQUIRE SSL),並在程式碼層面使用參數化查詢搭配預處理語句,徹底杜絕 SQL 注入風險。
skip-networking 或 bind-address=127.0.0.1)RENAME USER 'root'@'localhost' TO 'admin_xyz'@'localhost')SELECT, INSERT, UPDATE, DELETE 等必要權限PROCESS, SUPER, FILE, SHUTDOWN 等高危權限給非管理帳號mysql.user 表,移除無用帳號與匿名帳號除管理帳號外,任何使用者不得存取 mysql.user、mysql.db 等系統表。密碼雜湊值一旦洩露,攻擊者可直接離線破解或利用 Pass-the-Hash 攻擊。
max_user_connections 限制單一帳號並發連線數GRANT ... WITH MAX_QUERIES_PER_HOUR 等資源控制選項wait_timeout、interactive_timeout 快速回收閒置連線以專用 mysql 使用者/群組(無 Shell、無家目錄)啟動 mysqld,並配合 --chroot 參數限制檔案系統可見範圍。
--skip-symbolic-links 禁止符號連結攻擊--local-infile=0 禁用 LOAD DATA LOCAL INFILE--skip-show-database 隱藏資料庫列表--skip-grant-tables 僅用於緊急救援,平時嚴禁啟用確保 MySQL 資料目錄(datadir)僅 mysql 使用者可讀寫,防止惡意寫入 UDF 惡意共享庫或竄改資料檔。
MariaDB Audit Plugin 或 MySQL Enterprise Audit 記錄所有 DDL/DML 操作tcpdump -i eth0 port 3306 | strings 定期抽查網路流量是否為明文所有動態 SQL 必須使用預處理語句(Prepared Statements),嚴禁字串拼接。對輸入長度、型別、格式進行嚴格白名單驗證。
生產環境關閉詳細錯誤回顯(display_errors=Off),避免洩露資料庫結構、版本等敏感資訊。
mysqldump 導出資料時使用 --single-transaction --routines --triggers 確保一致性,備份檔案需加密(GPG/AES-256)並存放於異地離線儲存。
--skip-grant-tables --skip-networking 啟動FLUSH PRIVILEGES; ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewComplexPass!';GRANT ALL ON *.* TO 'user'@'%' → ✅ 指定具體庫表與 IP--skip-grant-tables 長期運行 → ✅ 僅救援時臨時使用mysql 系統庫檔案 → ✅ 使用 DROP USER、REVOKE 管理權限資料庫安全非一次性設定,而是持續的「防護-檢測-響應」循環。建議每季度執行:權限收斂審查、弱密碼掃描、日誌異常分析、滲透測試驗證。唯有纏深防禦,方能守住數據生命線。