網路與傳輸層防護
- 加密傳輸:跨非信任網路必須用 SSH Tunnel 或 SSL/TLS 加密連線。
- 防火牆隔離:資料庫放在 DMZ 或內網,禁止 3306 埠直接暴露公網。用
nmap -p 3306、telnet host 3306 驗證封鎖生效。
- 僅綁定內網 IP:
bind-address=10.0.0.10,拒絕公網介面監聽。
認證與密碼策略
- 移除匿名帳號:
DELETE FROM mysql.user WHERE user='';
- Root 遠程登入禁用:
UPDATE mysql.user SET host='localhost' WHERE user='root'; FLUSH PRIVILEGES;
- 強制複雜密碼:啟用
validate_password 插件,設定長度、大小寫、數字、特殊字元要求。
- 定期輪換密碼:
ALTER USER 'app'@'%' PASSWORD EXPIRE INTERVAL 90 DAY;
- 不使用明文密碼:應用端用環境變數/密碼管理器,避免寫在設定檔。
權限最小化原則
- 應用帳號僅授必要權限:
GRANT SELECT, INSERT, UPDATE ON db.* TO 'app'@'app_server_ip';
- 禁止
FILE、PROCESS、SUPER、SHUTDOWN 給非管理帳號。
- 資料庫/表/欄位級精細授權:敏感欄位 (薪資、身分證) 僅授
SELECT (col1, col2)。
- 移除
test 資料庫存取權:REVOKE ALL ON test.* FROM '%';
SQL 注入防禦
- 參數化查詢 / Prepared Statements:所有語言驅動皆支援,杜絕字串拼接。
- 輸入驗證與長度限制:
WHERE id=? + 伺服端檢查 id > 0 AND id < 1000000。
- ORM/查詢建構器:自動處理跳脫字元。
伺服器硬化配置
--skip-symbolic-links:禁用符號連結攻擊。
--local-infile=0:禁用 LOAD DATA LOCAL INFILE 防止任意檔案讀取。
--skip-show-database:隱藏資料庫列表。
- 資料目錄權限:
chown -R mysql:mysql /var/lib/mysql; chmod 750 /var/lib/mysql。
- 以專用低權限帳號 (mysql) 啟動服務,絕不使用 root。
審計與監控
- 啟用 General Log / Audit Plugin 記錄所有連線與 DDL/DML。
- 定期
tcpdump -i eth0 port 3306 -w - | strings 檢查是否有明文密碼/敏感資料外洩。
- 異常連線、失敗登入、權限變更設定告警。
緊急情況:ERROR 1045 重置 Root 密碼
systemctl stop mysqld
mysqld_safe --skip-grant-tables &
mysql -u root mysql
UPDATE user SET authentication_string=PASSWORD('NewPass123!') WHERE user='root';
FLUSH PRIVILEGES;
systemctl restart mysqld