網絡傳輸安全
- 跨不可信網絡必用 SSH 隧道或 SSL:加密連接防竊聽/篡改/重放。
- 禁用明文密碼傳輸:驅動層啟用 SSL,
REQUIRE SSL 強制賬號走加密通道。
賬號與權限最小化
- 修改密碼標準流程:
mysql -u root → UPDATE mysql.user SET authentication_string=PASSWORD('newpwd') WHERE user='root'; → FLUSH PRIVILEGES;(5.7+ 用 authentication_string)。
- 非 root 禁止訪問 mysql.user 表:該表存儲密碼哈希,洩露即全庫失陷。
- 用 GRANT/REVOKE 管理權限,避免直接操作權限表。
- 應用賬號最小權限:僅授業務所需
SELECT/INSERT/UPDATE/DELETE,特定庫表,拒絕 DROP/ALTER/GRANT。
- 嚴格控制 SUPER/PROCESS/FILE/SHUTDOWN:僅 DBA 持有,防止殺查詢、讀文件、關庫。
密碼策略與認證
- 不使用字典弱密碼,強制複雜度(長度、大小寫、數字、特殊字符)。
- 密碼哈希存儲:MySQL 內部用 SHA1 雙重哈希,應用層勿自行 MD5/SHA1 再存(雙重哈希無增益)。
- 啟用 validate_password 插件(5.7+ 默認):強制密碼策略、過期輪換。
網絡邊界防護
- 防火牆/安全組僅放行應用服務器 IP 訪問 3306,拒絕 0.0.0.0/0。
- 數據庫放 DMZ 或內網專用段,不直接暴露公網。
- 掃描驗證:
nmap -p 3306 host、telnet host 3306 確認端口不可達。
SQL 注入防範
- 參數化查詢/預編譯語句:所有語言驅動均支持,徹底隔離代碼與數據。
- 輸入長度/類型/格式校驗:白名單驗證,拒絕超長/異常字符。
- 動態 SQL 拼接時轉義:驅動提供
escape_string/real_escape_string,或框架 ORM 自動處理。
- URL 參數編碼:
%22(", %23#、%27' 防繞過。
文件系統與進程隔離
- 以專用低權限用戶運行 mysqld(mysql 用戶),禁止 root 運行。
- 數據目錄權限 750,屬主 mysql:mysql,僅運行用戶可讀寫。
- 禁用符號鏈接:
--skip-symbolic-links 防止繞過目錄限制。
- local-infile 控制:
--local-infile=0 禁用 LOAD DATA LOCAL 防任意文件讀取。
審計與監控
- 啟用審計日誌插件:記錄登入、DDL、DML、失敗嘗試。
- 監控異常連接/失敗登入/慢查詢/權限變更,接入 SIEM 告警。
- 定期輪換密碼、審計賬號權限、清理無用賬號。
緊急密碼重置(錯誤 1045)
# 1. 跳過權限表啟動
mysqld --skip-grant-tables --skip-networking &
# 2. 免密登入
mysql -u root mysql
# 3. 更新密碼
UPDATE user SET authentication_string=PASSWORD('newpass') WHERE user='root';
FLUSH PRIVILEGES;
# 4. 正常重啟
mysqladmin shutdown
systemctl start mysqld