validate_password 為 MySQL 5.6.6+ 內置插件,強制執行密碼複雜度策略,防止弱密碼導致安全風險。
[mysqld] plugin-load=validate_password.so validate-password=FORCE_PLUS_PERMANENT # 強制載入,不可運行時卸載 validate_password_policy=2 # STRONG 級別
INSTALL PLUGIN validate_password SONAME 'validate_password.so';
| 參數 | 說明 | 默認值 | 建議生產值 |
|---|---|---|---|
| validate_password_policy | 策略等級:0/LOW(僅長度)、1/MEDIUM(長度+字符類)、2/STRONG(含字典) | 1 (MEDIUM) | 2 (STRONG) |
| validate_password_length | 最小長度 | 8 | 12+ |
| validate_password_mixed_case_count | 大小寫字母最小個數(各) | 1 | 2 |
| validate_password_number_count | 數字最小個數 | 1 | 2 |
| validate_password_special_char_count | 特殊字符最小個數 | 1 | 2 |
| validate_password_dictionary_file | 字典文件路徑(STRONG 級生效) | 空 | /etc/mysql/dict.txt |
-- 設置 STRONG 級別
SET GLOBAL validate_password_policy=2;
SET GLOBAL validate_password_length=12;
SET GLOBAL validate_password_mixed_case_count=2;
SET GLOBAL validate_password_number_count=2;
SET GLOBAL validate_password_special_char_count=2;
-- 測試
SET PASSWORD = PASSWORD('abc'); -- ERROR 1819: 長度/類型不足
SET PASSWORD = PASSWORD('Abcdef123!@#'); -- OK (滿足 MEDIUM)
SET PASSWORD = PASSWORD('WeakPass123'); -- ERROR 1819: 無特殊字符
SET PASSWORD = '*0D3CED9BEC10A777AEC23CCC353A8C08A633045E'; -- OK (哈希值繞過檢查)
# 每行一個弱密碼,建議包含: # 1. 常見弱密碼 top 10000 # 2. 公司名、產品名、域名變體 # 3. 鍵盤走勢(qwerty, 1qaz2wsx 等) # 4. 生日、手機號碼片段 # 生成示例 cat > /etc/mysql/dict.txt <監控與審計
-- 查看當前策略 SHOW VARIABLES LIKE 'validate_password%'; -- 審計弱密碼賬戶(需配合 common_schema 或自腳本) SELECT User, Host FROM mysql.user WHERE LENGTH(Password) < 41; -- 老版本短哈希避坑指南
- 現有弱密碼不受影響:插件僅攔截
CREATE USER/SET PASSWORD/GRANT ... IDENTIFIED BY,存量賬戶需定期輪換- 應用層兼容:確保應用註冊/改密邏輯符合策略,否則報錯
ERROR 1819 (HY000)- 主從一致性:主從必須同時啟用且策略一致,否則複製報錯
- 緊急繞過:超級權限用戶可用
SET PASSWORD = 'hash_value'繞過(僅限運維緊急處理)密碼策略是資安合規的基石,**配置文件固化 + 字典文件動態更新 + 定期審計** 三位一體,構建纵深防禦。