連線與傳輸安全
- 全帳號強制密碼:移除匿名帳號,
DELETE FROM mysql.user WHERE User='';
- 啟用 SSL/TLS:生成憑證,
my.cnf 設定 ssl-ca/ssl-cert/ssl-key,要求 REQUIRE SSL
- 不可信網路走 SSH 隧道:
ssh -L 3307:localhost:3306 user@db-host
- 壓縮協議輔助:
--compress 增加竊聽成本
帳號權限鐵律
- 禁止 root 遠端:
UPDATE mysql.user SET Host='localhost' WHERE User='root';
- 應用專用帳號:僅授予特定庫
SELECT/INSERT/UPDATE/DELETE
- 移除測試庫:
DROP DATABASE test; DELETE FROM mysql.db WHERE Db='test%'
- 嚴控 SUPER/PROCESS/FILE:僅 DBA 持有,防止查詢竊取、任意檔案讀寫
- 禁用符號連結:
--skip-symbolic-links
- 資料目錄權限收斂:僅
mysql 系統用戶可讀寫 datadir
- IP 白名單授權:避免主機名通配符,
CREATE USER 'app'@'10.0.1.%'
- 限制單帳號連線數:
max_user_connections 或 GRANT ... WITH MAX_CONNECTIONS_PER_HOUR
應用層防禦
- 參數化查詢:預處理語句杜絕 SQL 注入
- 輸入驗證與長度限制:拒絕過長、異常字元
- 錯誤訊息不外洩:生產環境關閉詳細錯誤回顯
稽核與監控
- 啟用
audit_log 記錄登入、DDL、DML 關鍵操作
- 定期
pt-query-digest 分析慢查詢與異常模式
- 監控
Aborted_connects、Access_denied_errors 告警
緊急修復:Root 密碼重置
systemctl stop mysqld
mysqld_safe --skip-grant-tables &
mysql -u root
UPDATE mysql.user SET authentication_string=PASSWORD('NewStrongPwd') WHERE User='root';
FLUSH PRIVILEGES;
systemctl restart mysqld