傳輸層加密
- 啟用 SSL/TLS:配置
ssl-ca、ssl-cert、ssl-key,強制加密連線
- SSH 隧道:跨不可信網路連線時,建立 SSH Tunnel 轉發 3306 埠
- 壓縮協議:
--compress 參數可減少流量並增加破解難度(MySQL 3.22+)
帳號與認證管理
| 守則 | 執行方式 |
| 1. 所有用戶設強密碼 | ALTER USER 'user'@'host' IDENTIFIED BY 'StrongP@ssw0rd!'; |
| 2. 移除匿名用戶 | DROP USER ''@'localhost'; DROP USER ''@'%'; |
| 3. 禁止 root 遠端登入 | DELETE FROM mysql.user WHERE User='root' AND Host!='localhost'; FLUSH PRIVILEGES; |
| 4. 密碼用單向雜湊 | MySQL 內建 PASSWORD() / SHA2(),應用層用 bcrypt/Argon2 |
| 5. 避免字典弱密碼 | 啟用 validate_password 元件強制複雜度 |
權限最小化原則
- 應用帳號僅授予必要資料庫、必要操作:
GRANT SELECT,INSERT,UPDATE ON app_db.* TO 'app_user'@'app_server_ip';
- 嚴禁授予 FILE、PROCESS、SUPER、SHUTDOWN 權限給非管理帳號
FILE 權限可讀寫伺服器檔案系統(如 LOAD DATA INFILE '/etc/passwd')
PROCESS 可見 SHOW PROCESSLIST 所有查詢文本(含敏感 SQL)
SUPER 可切斷連線、修改全域變數、控制複寫
網路與存取控制
- 防火牆封鎖 3306 埠:僅允許應用伺服器 IP 存取
bind-address = 127.0.0.1(僅本機)或指定內網 IP
skip-name-resolve:停用 DNS 反向解析,加速連線並避免 DNS 攻擊
- 授權表僅用 IP 地址,不使用主機名(避免 DNS 欺騙)
資料庫層面防護
- 啟用一般查詢日誌 / 慢查詢日誌 / 錯誤日誌,定期審計
max_user_connections 限制單帳號最大連線數,防禦連線耗盡
--skip-show-database:隱藏 SHOW DATABASES 結果
--local-infile=0:禁止 LOAD DATA LOCAL INFILE 客戶端讀取本地檔案
作業系統層面
- 以專用低權限帳號(如
mysql 用戶)運行 mysqld,絕不使用 root
- 資料目錄
/var/lib/mysql 僅 mysql 用戶可讀寫
- 啟動腳本
mysql.server 僅 root 可寫
緊急情況:重置 root 密碼(含安全模式)
# 1. 停止服務
systemctl stop mysqld
# 2. 跳過權限啟動
mysqld_safe --skip-grant-tables --skip-networking & # 關鍵:同時禁用網路
# 3. 本機修改密碼
mysql -u root
ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewStrongP@ssw0rd!';
FLUSH PRIVILEGES;
# 4. 正常重啟
systemctl restart mysqld
🔒 安全審計清單(每季執行):
SELECT User, Host, authentication_string FROM mysql.user; 檢查弱密碼/匿名帳號
SHOW GRANTS FOR 'app_user'@'%'; 核對權限最小化
netstat -tlnp | grep 3306 確認綁定位址
grep -i error /var/log/mysql/error.log 檢視異常
- 備份驗證:定期測試還原可用性