一:什麼是密碼校驗外掛
validate_password
是 MySQL 提供的一個外掛(外掛名稱為validate_password
),用於加強密碼的安全性。它透過設定密碼複雜度要求,強制使用者在設定密碼時遵守一定的規則,從而提高資料庫系統的安全性。它可以提供密碼長度、字元組合、字典檢查、密碼策略等要求限制。
(一):問題引出
我記得以前在Centos7安裝MySQL5.7以後透過grep 'temporary password' /var/log/mysqld.log
命令來獲取登入的臨時密碼,但透過臨時密碼登入後必須修改root的密碼,當時我想更新密碼‘123’;但當我執行更新密碼語句時懵了,怎麼還報錯了;我記得以前MySQL5.6更新密碼都是直接成功的;當我仔細閱讀提示後才知道我的密碼不符合策略。記得當時就是報如下錯誤:
透過後面的資料查詢才知道引入了validate_password
密碼校驗外掛,它是在MySQL 5.6中引入的。但它是作為一個可選的安全功能外掛,幫助管理員強制執行更嚴格的密碼策略,以提高資料庫系統的安全性。到了MySQL 5.7及更高版本中,此外掛預設是啟用的。
常見密碼修改命令:ALTER USER 'root'@'localhost' IDENTIFIED BY '新密碼';
(二):安裝解除安裝密碼校驗外掛
在MySQL5.7以後預設會自動安裝和啟用密碼校驗功能,我們可以先透過下面的命令檢視是否安裝和啟用了密碼校驗功能後再選擇安裝對應的外掛或元件。
安裝密碼校驗功能有兩種方式:外掛方式、元件方式;其實兩種方式都是差不多的,安裝完都會有密碼校驗功能,但是又有細微的差異。需要注意的是MySQL5.7版本只能透過外掛的方式安裝。
'MySQL5.7及更早版本:只能使用外掛,因為元件的概念還未引入。' 'MySQL8.0及更高版本:推薦使用元件,因為元件概念是MySQL8.0中引入的,且提供了更靈活的管理和擴充套件能力。' '===================== 以MySQL外掛的方式安裝MySQL密碼校驗功能 =====================' 命令: INSTALL PLUGIN validate_password SONAME 'validate_password.so'; 說明:該命令用於將validate_password外掛註冊到後設資料,也就是mysql.plugin表中,所以不用擔心 MySQL重啟後外掛會失效。載入後,MySQL會對新建立或修改的密碼進行驗證,以確保它們符合預設 的密碼策略。 注意:外掛一旦安裝,就會在MySQL伺服器啟動時自動載入,除非明確解除安裝。 檢視外掛安裝是否成功: SHOW PLUGINS; +-------------------+--------+-------------------+---------------------+---------+ | Name | Status | Type | Library | License | +-------------------+--------+-------------------+---------------------+---------+ |....... | | validate_password | ACTIVE | VALIDATE PASSWORD | validate_password.so| GPL | +-------------------+--------+-------------------+---------------------+---------+ 說明: Name: 外掛的名稱。 Status: 外掛的狀態,比如ACTIVE表示外掛正在執行。 Type: 外掛的型別,比如VALIDATE PASSWORD(密碼驗證)。 Library:外掛的共享庫檔名。 License:外掛的許可證資訊。 '===================== 以MySQL元件的方式安裝MySQL密碼校驗功能 =====================' 命令: INSTALL COMPONENT 'file://component_validate_password'; 說明:該命令用於將validate_password功能作為MySQL元件安裝。元件在MySQL 8.0中引入。 與外掛類似,元件也是用來增強MySQL的功能,但它們可能以不同的方式整合和管理。 注意:元件與外掛的載入機制不同,元件可以在MySQL執行時動態新增或刪除,且不需要伺服器重新啟動。 檢視元件安裝是否成功: SELECT * FROM mysql.component; +--------------+--------------------+------------------------------------+ | component_id | component_group_id | component_urn | +--------------+--------------------+------------------------------------+ | 1 | 1 | file://component_validate_password | +--------------+--------------------+------------------------------------+ '===================== 在MySQL中解除安裝這外掛或元件方式的校驗功能 =====================' '一旦解除安裝此外掛或者元件後,則代表放棄密碼校驗功能' # 解除安裝MySQL密碼強度校驗外掛(若報錯應該是外掛之前沒安裝) UNINSTALL PLUGIN validate_password; # 解除安裝MySQL密碼強度校驗元件 UNINSTALL COMPONENT 'file://component_validate_password';
二:細聊MySQL密碼校驗
完成了安裝後我們就可以檢視一些預設的密碼校驗配置了,但是需要注意的是以元件方式的安裝和外掛方式的安裝列印出的配置方式是不一樣的喲,但表示的意思是一樣的,下面我們就來一起看看吧:
透過SHOW VARIABLES LIKE 'validate_password%'
命令檢視密碼校驗配置。
MySQL8.4中透過'外掛方式'安裝後的配置項: >> show variables like 'validate_password%'; +--------------------------------------+--------+ | Variable_name | Value | +--------------------------------------+--------+ | validate_password_check_user_name | ON | | validate_password_dictionary_file | | | validate_password_length | 8 | | validate_password_mixed_case_count | 1 | | validate_password_number_count | 1 | | validate_password_policy | MEDIUM | | validate_password_special_char_count | 1 | +--------------------------------------+--------+ MySQL8.4中透過'元件方式'安裝後的配置項: >> show variables like 'validate_password%'; +-------------------------------------------------+--------+ | Variable_name | Value | +-------------------------------------------------+--------+ | validate_password.changed_characters_percentage | 0 | | validate_password.check_user_name | ON | | validate_password.dictionary_file | | | validate_password.length | 8 | | validate_password.mixed_case_count | 1 | | validate_password.number_count | 1 | | validate_password.policy | MEDIUM | | validate_password.special_char_count | 1 | +-------------------------------------------------+--------+ '透過上面的配置可以看出基本上都是一樣的,只不過外掛方式和元件方式中間的分割符從‘_’變爲了‘.’;' 下面以元件方式介紹(除了第一條配置是MySQL 8.0.13引入的,其它都是MySQL 5.7.8引入的): '1:validate_password.changed_characters_percentage' 作用:強制要求使用者在更改密碼時,新的密碼與舊的密碼之間有一定比例的字元不同。這個設定可以防止使用者 透過僅修改少數幾個字元來滿足密碼更改的要求,從而確保密碼更為安全。 預設值:預設情況下,該引數的值為0,即不強制要求新舊密碼之間的字元變化。 配置示例: SET GLOBAL validate_password.changed_characters_percentage = 50; 設定要求新密碼與舊密碼至少有 50%(一半)的字元不同。 '2:validate_password.check_user_name' 作用:檢查使用者密碼是否包含使用者名稱,防止使用者在密碼中包含自己的使用者名稱。 取值:ON(啟用)、OFF(關閉) 使用場景:防止使用使用者名稱作為密碼的一部分,增強密碼的不可預測性。 配置示例: SET GLOBAL validate_password.check_user_name = OFF; 關閉檢查以允許使用者名稱作為密碼的一部分。 '3:validate_password.dictionary_file' 作用:指定一個包含常用詞彙的字典檔案路徑,用於檢查密碼是否包含常見的弱密碼詞彙。 預設值:未指定字典檔案 使用場景:透過使用字典檔案,防止使用者設定包含常見詞彙的弱密碼。 配置示例: SET GLOBAL validate_password.dictionary_file = '/dictionary.txt'; 指定字典檔案路徑用於密碼檢查。 檔案內容要求: 每行一個詞彙、無特殊分隔符、不區分大小寫;如下檔案內容: password 123456 qwerty ... '4:validate_password.length' 作用:設定密碼的最小長度,確保密碼有足夠的字元數以提高安全性。 預設值:8(代表至少8位字元的密碼) 使用場景:透過強制密碼長度要求,防止使用過短的密碼,提升密碼強度。 配置示例: SET GLOBAL validate_password.length = 12; 設定最小密碼長度為 12 個字元。 '5:validate_password.mixed_case_count' 作用:規定密碼中必須包含的大寫字母、小寫字母的最小數量。 預設值:1(代表密碼中至少出現一次大寫字母和小寫字母) 使用場景:透過要求大小寫字母的混合,增強密碼的複雜性。 配置示例: SET GLOBAL validate_password.mixed_case_count = 2; 設定密碼中至少包含2個大寫字母和小寫字母。 '6:validate_password.number_count' 作用:規定密碼中必須包含的數字字元的最小數量。 預設值:1 配置示例: SET GLOBAL validate_password.number_count = 2; 設定密碼中至少包含 2 個數字字元。 '7:validate_password.policy' 作用:定義密碼的複雜性策略。主要有三種策略級別: LOW 或 0:僅檢查密碼長度。 MEDIUM 或 1:檢查密碼長度、字元型別組合(如大小寫字母、數字和特殊字元)。 STRONG 或 2:除了MEDIUM級別的檢查外,還要求密碼不能包含字典中的詞彙(如果字典檔案被配置)。 預設值:MEDIUM(只檢查是否包含大寫、小寫、數字、特殊字元) 配置示例: SET GLOBAL validate_password.policy = 'LOW'; 只檢查密碼長度。 '8:validate_password.special_char_count' 作用:規定密碼中必須包含的特殊字元(如 @, #, $)的最小數量。 預設值:1(至少包含一個特殊字元) 配置示例: SET GLOBAL validate_password.special_char_count = 2; 設定密碼中至少包含 2 個特殊字元。
透過上面的示例我們基本上可以對每個配置進行修改了,但是有個問題,一旦MySQL重啟,那麼配置將被清除,若想恢復只能手動一個個單獨設定了(重複之前的操作),但是我們也可以透過配置my.cnf的方式來進行持久配置。如下:
配置檔案: Linux配置檔案則一般在:/etc/mysql/my.cnf 或 /etc/my.cnf Windows配置檔案是安裝MySQL的目錄,配置檔名為:my.ini '修改配置項:' '使用元件方式安裝的密碼校驗配置(選擇需要的配置寫上即可):' [mysqld] validate_password.changed_characters_percentage = 50 validate_password.check_user_name = ON validate_password.dictionary_file = xxx.txt validate_password.length = 12 validate_password.mixed_case_count = 2 validate_password.number_count = 2 validate_password.policy = STRONG validate_password.special_char_count = 2 '使用外掛方式安裝的密碼校驗配置(選擇需要的配置寫上即可):' [mysqld] validate_password_check_user_name = ON validate_password_dictionary_file = xxx.txt validate_password_length = 12 validate_password_mixed_case_count = 2 validate_password_number_count = 2 validate_password_policy = STRONG validate_password_special_char_count = 2 '設定好重啟即可!'