mysql密碼策略和登錄失敗處理
等保對mysql有兩個整改要求:設置密碼復雜度策略和登錄失敗處理功能。記得之前我們沒去整改,說版本不支持(用的是5.6.15),當時覺得過等保的分數已經足夠了,且有別的事忙,所以就沒管。
最近領導叫提前了解等保三級的安全規范,就順便去做測試。沒錯,5.6.15版本確實不支持登錄失敗處理,寫入配置文件里無法啟動(如下圖),但支持設置密碼復雜度策略:

總的來說,都需要在配置文件加插件加載的配置,對於網上說的什么“mysql >= 5.6.6 才能設置密碼策略”,我覺得大家測試過再下定論比較好,不然還是抱着懷疑態度去看待(5.6.51和5.6.15我都試過了,設置密碼策略是可行的)
一、密碼復雜度策略
用到這個插件:validate_password 插件
1、編輯配置文件:my.cnf
[mysqld]
...
## 密碼復雜度插件
plugin-load-add=
validate_password.so
validate-password=force_plus_permanent
2、重啟mysql
登錄,運行:show variables like 'plugin_dir";
應該會看到插件目錄:

也能看到插件相關參數(沒加到配置文件前是空的):
默認值剛好是等保建議的設置值
mysql> show variables like 'validate_password%';

字段說明:
(1)validate_password_check_user_name:默認關閉,設置為ON時可以將密碼設置成當前用戶名
(2)validate_password_dictionary_file:插件用於驗證密碼強度的字典文件路徑。
(3)validate_password_length:密碼最小長度。
(4)validate_password_mixed_case_count:密碼至少要包含的小寫字母個數和大寫字母個數。
(5)validate_password_number_count:密碼至少要包含的數字個數。
(6)validate_password_special_char_count:密碼至少要包含的特殊字符數。
(7)validate_password_policy: validate_password強制執行的密碼策略
validate_password_policy的值可以使用數值0、1、2或相應的符號值LOW、MEDIUM、STRONG來指定。
0/LOW:只檢查長度。對於長度測試,所需的長度是validate_password_length系統變量的值
1/MEDIUM:檢查長度、數字、大小寫、特殊字符。
2/STRONG:檢查長度、數字、大小寫、特殊字符字典文件。
3、測試:
密碼不符合要求的:1234ha、123456789、1235%AAAAK
(授權的時候會報錯:不符合當前的策略要求)
密碼符合要求:1235%AAAAk
grant all privileges on db_20220311.* to "test"@"localhost" identified by 'xxx';

二、登錄失敗處理
參考:
https://www.cnblogs.com/zhenxing/p/11050823.html
里面文章提到mysql >= 5.7.17 以后提供了Connection-Control插件,用來控制客戶端在登錄操作連續失敗一定次數后的響應的延遲,我用5.6.51的mysql也是支持的,不過做測試的時候,用“show processlist”查看數據庫線程的時候,Time這個字段會為空,而5.7.28的這個字段是有值的。

按照參考文檔設置就好了。假設我設置的參數如下:
mysql> SET GLOBAL connection_control_failed_connections_threshold = 5; ## 失敗嘗試次數為:5次 mysql> SET GLOBAL connection_control_min_connection_delay = 20000; ## 單位默認為毫秒, 設置為:20秒 mysql> SET GLOBAL connection_control_max_connection_delay = 30000; ## 單位默認為毫秒,設置為:30秒
字段說明:
(1)connection_control_failed_connections_threshold:
失敗嘗試的次數,默認為3,表示當連接失敗3次后啟用連接控制,0表示不開啟(這個我持保留意見,暫時沒測試過)
(2)connection_control_min_connection_delay:失敗上限之后再次嘗試登錄前,最小延遲(以毫秒為單位)。
(3)connection_control_max_connection_delay:失敗上限之后再次嘗試登錄前,最大延遲(以毫秒為單位)
我特意講下參考鏈接2的測試過程:
未登錄前或正常登錄(密碼輸入正確),運行命令返回為空:select * from information_schema.connection_control_failed_login_attempts;
然后我開另一個終端模擬爆破份子(輸入錯誤密碼),上面截圖的終端再次運行命令,這個connection_control_failed_login_attempts相當於一個計數器,如下圖:
直到我設置的閾值:5次。第6次開始再過來搞事的時候,一直卡着(只要后續沒有輸入正確密碼,每一次再去試圖爆破都會卡着,除非后續有一次輸對了,這個計數器會清零,重新統計失敗的次數),卡着的時間視乎你設置的:connection_control_min_connection_delay的值。

運行:show processlist;
當Time到達20的時候,就會返回響應,錯誤提示:
最后引用文章的話:
正常情況下,輸錯密碼是即刻返回錯誤的,當連續失敗次數達到閾值后,再次進行連接嘗試,則會延遲響應,具體表現就是一直卡着,到延遲結束后才返回錯誤。
所以這玩意不能避免被試圖爆破的問題,但是一定程度上能緩解,就好像linux系統也無法做到不被暴力破解,但可以通過修改常見賬號名、修改ssh默認端口號、設置強密碼來加固,不讓壞人那么容易猜到。。。