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

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

validate_password.policy

notion image
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

notion image
要求密碼長度經過以下計算不可以低於此設定

validate_password.number_count

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

validate_password.mixed_case_count

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

validate_password.special_char_count

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

validate_password.dictionary_file

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

測試

  1. 使用 systemctl start mysqld 直接進行初始化,會預設安裝 validate_password 插件。
    1. 從下面可以看到 systemctl 在初始化 mysql 的腳本中寫到會 install validate_password plugin
  1. 使用 /usr/sbin/mysqld --initialize 進行初始化時,讓 mysqld 自行產生 root 的隨機密碼,則 預設安裝 validate_password 插件
    1. 使用 /usr/sbin/mysqld --initialize-insecure 進行初始化時,讓 mysqld 不產生 root 密碼,則不 預設安裝 validate_password 插件

      參考