核心原則:纏繞式防禦
資料庫安全非單一設定可達成,需從網路傳輸、認證授權、作業系統層面、審計監控四個維度疊加防護。
一、網路傳輸加密
- 預設行為:MySQL 4.1.1+ 密碼交換已加密,但後續資料傳輸為明文。
- 不可信網路:必須使用 SSH Tunnel 或 SSL/TLS 加密 TCP 連線。
範例:ssh -L 3307:localhost:3306 user@db-host 將本地 3307 轉發至遠端 3306。
- 替代方案:啟用
--enable-compression 壓縮協定,增加解讀難度(非替代加密)。
二、帳號與認證鐵律
| 規則 | 執行方式 | 風險若違反 |
| 所有帳號設強密碼 | SET PASSWORD FOR 'user'@'host' = PASSWORD('strongPwd'); | 空密碼帳號任意連線冒用身分 |
| 禁用 root 遠端登入 | DELETE FROM mysql.user WHERE User='root' AND Host NOT IN ('localhost','127.0.0.1','::1'); FLUSH PRIVILEGES; | 暴力破解、提權 |
| 專用帳號、專用權限 | 應用布號僅授 SELECT,INSERT,UPDATE,DELETE;管理帳號隔離 | SQL 注入影響擴大 |
| 定期輪換密碼 | 配合 validate_password 元件強制複雜度與存活期 | 長期洩露未察覺 |
三、作業系統與檔案系統層面
- 以非 root 執行 mysqld:建立專用
mysql 使用者,my.cnf 設定 [mysqld] user=mysql。
- 關閉符號連結:
--skip-symbolic-links 防止任意檔案讀寫(特別是 root 執行時)。
- 資料目錄權限收斂:
chown -R mysql:mysql /var/lib/mysql; chmod 750 /var/lib/mysql。
- 禁用不必要的編譯功能:源碼安裝時
-DWITHOUT_... 精簡攻擊面。
四、權限最小化與高危權限管控
| 高危權限 | 風險 | 管控建議 |
| FILE | 讀寫伺服器任意檔案(如 /etc/passwd) | 僅 DBA 擁有;secure_file_priv 限制目錄 |
| PROCESS | 檢視所有連線執行中的 SQL(含敏感資料) | 僅監控帳號擁有 |
| SUPER | 殺連線、改全域變數、控制複寫 | 極少數 DBA;保留一額外連線槽給 root 緊急介入 |
| SHUTDOWN | 關閉資料庫服務 | 僅自動化部署帳號 |
五、網路與主機名稱防禦
- 授權表使用 IP 而非主機名:避免 DNS 劫持或解析汙染。
- 拒絕萬用字元主機名:
%、192.168.% 易造成非預期存取。
- 連線數限制:
max_user_connections 防單一帳號佔滿連線池。
六、審計與監控
- 啟用
log_error、log_bin、slow_query_log。
- 部署 MariaDB Audit Plugin 或 MySQL Enterprise Audit 記錄 DML/DDL/登入登出。
- 整合 SIEM(Splunk、ELK)即時告警異常模式(大量失敗登入、異常時間段 DDL、大量資料匯出)。
七、快速自檢清單
# 1. 確認無匿名帳號
SELECT User,Host FROM mysql.user WHERE User='';
# 2. 確認 root 僅限本機
SELECT User,Host FROM mysql.user WHERE User='root';
# 3. 確認無過度授權
SHOW GRANTS FOR 'app_user'@'%';
# 4. 確認 SSL 強制
SHOW VARIABLES LIKE 'have_ssl';
# 5. 確認 secure_file_priv
SHOW VARIABLES LIKE 'secure_file_priv';
安全是持續過程,而非一次性配置。建議每季執行滲透測試與權限複核,配合變更管理流程,將風險控制在可接受範圍。
- 上一篇文章: MySQL Cluster 雙複寫通道架構實作:高可用與冗余設計全攻略
- 下一篇文章: 單機多實例實戰:mysqld_multi 部署 MySQL 5.0 雙實例(3306/3307)完整手冊
Copyright ©
程式碼之家 All Rights Reserved