type
status
date
slug
summary
tags
category
icon
password
前言
在安裝 MySQL 8.0 之後,我們都知道在 error log 中會產生 root 的隨機密碼,並且首次使用 root 進入後會要求我們修改密碼才能進行其他操作:
此例中我將密碼修改為
123
卻被告知不符合 policy 需求,讓我們看一下發生了什麼?Password Validation Component
透過官網找到了相關的參數設定如下:
Password Validation Component 參數
validate_password.check_user_name

當開啟時密碼不可以設置和當前使用者名稱相同或相反,匹配時會以二進制來比對,因此會區分大小寫。
例如:root@localhost 可以為 test@localhost 設定 test 密碼,但不可以設為 root 密碼。
validate_password.policy

check_user_name 以外的參數是否要檢查都由 policy 的設定決定,3種設定如下:
Policy | 會判斷的參數 |
0 或 LOW | length |
1 或 MEDIUM | length, number_count, mixed_case_count, special_char_count |
2 或 STRONG | length, number_count, mixed_case_count, special_char_count, dictionary_file |
validate_password.length

要求密碼長度經過以下計算不可以低於此設定
validate_password.number_count

如果 policy 為 MEDIUM 或 STRON,則密碼必須至少包含此參數數量的數字。
validate_password.mixed_case_count

如果 policy 為 MEDIUM 或 STRON,則密碼必須包含此參數數量的字母。
validate_password.special_char_count

當 policy 為 MEDIUM 或 STRONG 則密碼的特殊字元(非字母數字)的最少數量。
validate_password.dictionary_file

預設為空值不檢查,只有當 policy 設置為 STRONG 且此參數不為空才會進行檢查。
此參數若填入相對路徑,則會以 server data directory 開始解釋。
文件內容需為小寫,且每一行只能有字,其中的 character set 視為 utf8,且文件大小最多只能為 1 MB。
對於長度 4~100 密碼的每個字符串都會和該字典比對,一但有匹配的則密碼被拒絕使用。
看完了上述的參數了解了密碼不能成功修改的原因,但同時上述參數都有一個條件,就是必須安裝這個插件:
因為我的環境不需要此設定,雖然可以選擇調低 policy 層級即可,但這邊選擇進行移除。
移除完畢之後就可以順利修改密碼,但是當我再次初始化一個 MySQL 服務的時候發現這次竟然預設是沒有安裝的:
這就讓我很困惑了,怎麼一下子有預設一下子沒有預設呢? 於是開始了以下測試。
測試
- 使用 systemctl start mysqld 直接進行初始化,會預設安裝 validate_password 插件。
從下面可以看到 systemctl 在初始化 mysql 的腳本中寫到會
install validate_password plugin
- 使用 /usr/sbin/mysqld --initialize 進行初始化時,讓 mysqld 自行產生 root 的隨機密碼,則會 預設安裝 validate_password 插件
- 使用 /usr/sbin/mysqld --initialize-insecure 進行初始化時,讓 mysqld 不產生 root 密碼,則不會 預設安裝 validate_password 插件