連線層防護
- 強制密碼:所有帳號必須設定強密碼,禁止空密碼
- 加密傳輸:MySQL 4.1.1+ 支援 SSL/TLS;不可信網路必須啟用 SSH 隧道或 MySQL 原生 SSL
- 壓縮協議:啟用
--compress 增加竊聽難度(非加密替代品)
帳號與權限鐵律
- 禁止 root 遠端登入:
UPDATE mysql.user SET Host='localhost' WHERE User='root'; FLUSH PRIVILEGES;
- 專用帳號:應用、備份、監控、開發各用獨立帳號,最小權限
- 移除匿名帳號:
DROP USER ''@'%'; DROP USER ''@'localhost';
- 限制 SUPER/PROCESS/FILE:僅 DBA 持有,防止查詢竊取、檔案讀寫濫用
- 禁用符號連結:
--skip-symbolic-links 防止任意檔案讀寫
- 資料目錄權限:僅 mysqld 執行身分可讀寫
datadir
- DNS 信任風險:授權表使用 IP 而非主機名,謹慎使用通配符
- 連線數限制:
max_user_connections 防止單帳號佔滿連線池
作業系統層面
- 以非 root 使用者(如
mysql)啟動 mysqld,my.cnf 設定 user=mysql
- 防火牆僅開放 3306 至應用伺服器 IP
- 啟用 audit_log 元件記錄關鍵操作
密碼管理現代化(MySQL 5.7+)
-- 使用 caching_sha2_password(預設)
ALTER USER 'app'@'%' IDENTIFIED BY 'StrongP@ssw0rd!';
-- 密碼過期策略
ALTER USER 'app'@'%' PASSWORD EXPIRE INTERVAL 90 DAY;
-- 密碼歷史與重複使用限制
ALTER USER 'app'@'%' PASSWORD HISTORY 5 PASSWORD REUSE INTERVAL 365 DAY;
緊急修復:Root 密碼遺失
# 1. 停止服務
systemctl stop mysqld
# 2. 跳過授權表啟動
mysqld_safe --skip-grant-tables &
# 3. 免密登入重設
mysql -u root
UPDATE mysql.user SET authentication_string=PASSWORD('NewPwd') WHERE User='root';
FLUSH PRIVILEGES;
# 4. 正常重啟
systemctl restart mysqld