網路與傳輸層
- SSH 隧道:跨不可信網路連線必須加密通道
- 密碼管理:
SET PASSWORD 三步驟修改,避免明文傳輸
- 防禦面:防竊聽、篡改、重放、拒絕服務;基於 ACL 存取控制
帳號與權限核心
- user 表隔離:僅 root 可存取
mysql.user,密碼雜湊外洩即帳號淪陷
- GRANT/REVOKE:標準權限管理介面
- 單向雜湊:應用層用
SHA2()、bcrypt,資料庫層不存明文
- 強密碼策略:拒絕字典字、啟用
validate_password
基礎設施防護
- 防火牆:阻擋 50% 外部攻擊,資料庫置於 DMZ 或內網
- 端口掃描驗證:
nmap -p 3306 / telnet host 3306 確認 3306 不對外開放
- SQL 注入防禦:參數化查詢、輸入長度檢查、特殊字元轉義(
%22 %23 %27)
- 傳輸加密:SSL/SSH 加密傳輸,避免明文
作業系統與檔案層
- 專用啟動用戶:非 root 啟動 mysqld,
my.cnf [mysqld] user=mysql
- tcpdump 稽核:
tcpdump -l -i eth0 -w - src or dst port 3306 | strings 檢查明文洩漏
- 禁用符號連結:
--skip-symbolic-links 防止任意檔案讀寫
- datadir 權限收斂:僅 mysqld 用戶可讀寫
高危權限管控
- PROCESS/SUPER:僅 DBA,防止查詢竊取、服務器控制濫用
- FILE:僅 DBA,防止
LOAD DATA '/etc/passwd' 讀取系統檔
- DNS 信任:授權表用 IP,謹慎用通配符主機名
資源限制與啟動選項
- max_user_connections:限制單帳號連線數
- GRANT 資源選項:
MAX_QUERIES_PER_HOUR 等
- 啟動開關:
--local-infile=0 禁用 LOAD DATA LOCAL
--skip-grant-tables 緊急模式(需立即 FLUSH PRIVILEGES 恢復)
--skip-show-databases 隱藏資料庫列表
緊急修復:Error 1045 Access Denied
mysqld_safe --skip-grant-tables &
mysql -u root
UPDATE mysql.user SET authentication_string=PASSWORD('newpwd') WHERE User='root';
FLUSH PRIVILEGES;
systemctl restart mysqld