網路與傳輸層
- 跨非信任網路必須 SSH 隧道 或 SSL 加密。
- 密碼修改:
SET PASSWORD FOR 'user'@'host' = PASSWORD('newpwd'); FLUSH PRIVILEGES;
- 防範竊聽、篡改、重放、拒絕服務;基於 ACL (Access Control List) 控制。
核心權限管控
mysql.user 表僅 root 可讀,密碼雜湊外洩即等同帳號被盜。
- 使用
GRANT/REVOKE 管理權限,避免直接操作授權表。
- 禁用明文密碼,應用層用
SHA2()/BCRYPT 儲存(MySQL 8.0 caching_sha2_password 預設)。
- 拒絕字典弱密碼,啟用
validate_password 外掛。
網路邊界防護
- 防火牆封鎖 3306 對外,資料庫置於 DMZ 或內網。
nmap -p 3306 / telnet host 3306 定期掃描驗證。
- Web 表單參數化:字串用引號包裹,動態 URL 編碼
%22/%27,嚴禁拼接 SQL。
- 輸入長度檢查,防超長載荷攻擊。
應用程式連線帳號
- 專用帳號,最小權限(僅
SELECT/INSERT/UPDATE/DELETE 業務表)。
- 各語言驅動使用專用逃逸函數(
mysqli_real_escape_string、PDO::quote、PreparedStatement)。
傳輸加密驗證
- 網路抓包驗證:
tcpdump -i eth0 -w - port 3306 | strings 不應見明文 SQL/密碼。
- 以普通用戶啟動
mysqld(非 root)。
檔案系統與進階權限
--skip-symbolic-links 禁用符號連結攻擊。
- MySQL 資料目錄僅啟動用戶可讀寫(
chown -R mysql:mysql /var/lib/mysql; chmod 750)。
PROCESS/SUPER 僅授予 DBA,防洩露查詢文本、切斷連線、修改運行參數。
FILE 權限僅 root,防 LOAD DATA INFILE '/etc/passwd' 讀取系統檔案。
DNS 與資源限制
- 不信任 DNS 時,授權表
Host 欄位僅填 IP。
max_user_connections 限制單帳號並發,防單一應用佔滿連線池。
GRANT ... WITH MAX_QUERIES_PER_HOUR ... 資源控制選項。
啟動安全開關
--local-infile=0 禁用 LOAD DATA LOCAL。
--skip-grant-tables 僅緊急救援用,平時嚴禁。
--skip-show-databases 隱藏資料庫列表。
錯誤 1045 急救
mysqld_safe --skip-grant-tables &
mysql -u root mysql
UPDATE user SET authentication_string=PASSWORD('newpass') WHERE User='root';
FLUSH PRIVILEGES;
# 正常重啟