MySQL 資料庫安全強化 23 項關鍵檢查清單
資料庫安全是系統防護的最後一道防線。以下整理 23 項 MySQL 安全配置與操作建議,涵蓋網路傳輸、帳號權限、密碼策略、防火牆、審計追蹤等面向,助你建立纏深防禦體系。
網路傳輸與連線安全
- 跨非信任網路連線必須加密:使用 SSH Tunnel 或 SSL/TLS 加密 Client-Server 通訊,防止竊聽與竄改。
- 禁用明文密碼傳輸:啟用 SSL 連線(
REQUIRE SSL),或透過 VPN/SSH 隔離資料庫網段。
- 限制 3306 埠存取:防火牆僅允許應用伺服器 IP 存取 3306,禁止公網直連。可用
nmap 或 telnet 驗證埠口暴露狀況。
帳號與權限管理
- 嚴守最小權限原則:應用程式使用專用帳號,僅授予必要資料表的 SELECT/INSERT/UPDATE/DELETE 權限,禁止 GRANT ALL。
- 根帳號隔離:root 僅供管理維護使用,禁止應用程式使用。生產環境建議重命名 root 帳號(
RENAME USER root TO admin_xxx)。
- 移除匿名帳號與測試資料庫:執行
mysql_secure_installation 刪除匿名用戶、test 資料庫、遠端 root 登入。
- 禁止非管理員存取 mysql 系統庫:user 表儲存密碼雜湊,洩露即意味著帳號被盜用。
- 使用 GRANT/REVOKE 精細控制:按資料庫、資料表、欄位層級授權,定期審核權限清單。
- 嚴控高危權限:FILE、PROCESS、SUPER、SHUTDOWN 僅授予 DBA 帳號,防止
LOAD DATA INFILE 讀取系統檔案或 mysqladmin processlist 洩露查詢文本。
密碼與認證策略
- 強制複雜密碼策略:安裝
validate_password 插件,設定長度、大小寫、數字、特殊字元要求,拒絕字典字詞。
- 密碼儲存使用單向雜湊:MySQL 內部使用 SHA256(8.0+)或 mysql_native_password,應用層切勿自行使用 MD5/SHA1。
- 定期輪換密碼:設定
default_password_lifetime 強制週期性更換,配合密碼歷史記錄防止重複使用。
- 避免在指令稿/程式碼硬編碼密碼:使用設定檔、環境變數或密碼管理工具(Vault、AWS Secrets Manager)。
防禦 SQL 注入與輸入驗證
- 參數化查詢/預處理語句:所有動態 SQL 必須使用 PreparedStatement,嚴禁字串拼接。
- 輸入長度與型別驗證:應用層限制欄位長度、數值範圍、格式(如正則驗證 Email、手機號)。
- 轉義特殊字元:若無法使用參數化,必須呼叫驅動程式提供的逃脫函數(
mysql_real_escape_string、PDO::quote 等)。
稽核與監控
- 啟用審計日誌:安裝 MariaDB Audit Plugin 或 MySQL Enterprise Audit,記錄登入、DDL、DML、失敗嘗試。
- 監控異常連線與慢查詢:設定
long_query_time、log_queries_not_using_indexes,配合 Pt-query-digest 分析。
- 限制單一帳號最大連線數:使用
max_user_connections 防止單一帳號佔滿連線池造成拒絕服務。
- 資源控制選項:GRANT 支援
MAX_QUERIES_PER_HOUR、MAX_UPDATES_PER_HOUR 等配額限制。
緊急應變與備份
- 根密碼遺失重置流程:
--skip-grant-tables 啟動 → 更新 user 表 password 欄位 → FLUSH PRIVILEGES → 重啟正常模式。演練此流程確保關鍵時刻可恢復存取。
實施建議
- 將上述清單納入資料庫上線驗收標準,每季執行一次安全基線掃描。
- 配合資料庫防火牆(如 MariaDB MaxScale、ProxySQL)實現查詢攔截與動態遮罩。
- 建立資料分級分類制度,核心敏感資料啟用透明加密(TDE)與欄位級加密。