MySQL 8.0 新密碼策略的細節補充

發表於2023-09-19

前情提要

MySQL 8.0 截⽌到⽬前已經發布到了 8.0.34 版本,經過一系列的版本更新,對於密碼方面也做了較多的加強⼯作,這⾥我們不再過多介紹 MySQL 8.0 對於密碼功能的加強,相關的介紹可以移步先前公眾號的⽂章。

新特性解讀 | MySQL 8.0 新密碼策略(上)

新特性解讀 | MySQL 8.0 新密碼策略(中)

新特性解讀 | MySQL 8.0 新密碼策略(下)

新特性解讀 | MySQL 8.0 新密碼策略(終篇)

文章背景

這篇文章主要針對密碼相關的幾個引數的使用細節做一些驗證和分析,給大家分享下實際使用的經驗,首先我們看下 MySQL 8.0 版本的 CREATE USER 語法中 password_option 部分的語法結構。

-- MySQL 8.0(新增了不同維度的密碼控制)
password_option: {
PASSWORD EXPIRE [DEFAULT | NEVER | INTERVAL N DAY]
| PASSWORD HISTORY {DEFAULT | N}
| PASSWORD REUSE INTERVAL {DEFAULT | N DAY}
| PASSWORD REQUIRE CURRENT [DEFAULT | OPTIONAL]
| FAILED_LOGIN_ATTEMPTS N
| PASSWORD_LOCK_TIME {N | UNBOUNDED}
}

-- MySQL 5.7(只包含密碼過期屬性配置)
password_option: {
PASSWORD EXPIRE
| PASSWORD EXPIRE DEFAULT
| PASSWORD EXPIRE NEVER
| PASSWORD EXPIRE INTERVAL N DAY
}

其中 MySQL 8.0 版本 CREATE USER 語法的前 4 個密碼屬性則是本⽂第⼀個討論的細節點,其屬性對應的 MySQL 全域性引數及含義分別為:

引數名預設值mysql.user 表對應欄位含義
default_password_lifetime0password_lifetime全域性設定密碼的有效期
password_history0password_reuse_history全域性設定歷史密碼使用過的密碼不可被重用的條數
password_reuse_interval0password_reuse_time全域性設定歷史密碼要經過多長時間才能被重用
password_require_currentOFFpassword_require_current全域性設定修改密碼時需不需要提供當前密碼

誤區 1

mysql.user 中密碼相關選項對應欄位為 NULL 時的含義。

驗證過程

我們基於這 4 個密碼屬性設定具體的值,設定後配置如下圖所示。

建立⼀個新⽤戶不指定任何⽤戶密碼屬性。

在建立完⽤戶後,檢視 mysql.user 表中對應欄位顯示值均為 NULL。

全域性配置的 4個屬性沒生效?

如果⽣效應該要自動在建立⽤戶時配置為對應值才對。基於這個邏輯去理解還造成了另⼀層誤解:新配置的密碼全域性屬性對於歷史已建立的⽤戶不⽣效。

是不是還需要對已存在的⽤戶⽤ ALTER USER 單獨做處理?

隨著這個疑問越想越不對,如果全域性配置在新建立使用者時還不生效,那什麼時候生效,豈不是失去了意義?進一步檢視官⽅⽂檔mysql.user 表對應欄位值含義的描述後得到了答案。 原⽂描述如下,翻譯過來就是:如果這 4 個值在表中為 NULL,並不是配置未生效,而是表示其繼承全域性密碼策略配置。

小結

官方文件看的不夠仔細,誤解了 NULL 值的含義(關鍵原因),但確實容易踩到這個“坑”。這裡也貼一下全域性引數和單⽤戶屬性配置的生效對應表做參考。

建議使用 PC 端檢視

誤區 2

這裡雖然描述為誤區,其實我理解是文件描述的不完善。我們先看下文件的描述,翻譯過來是:可以⽤這 2 個引數來控制歷史密碼可被重用的策略:一個是基於次數策略,一個是基於時間策略。可以同時配置,如:禁止用最後 6 次密碼或者 365 天內設定過的密碼,可以看到兩個引數是一個或者的邏輯。

實際驗證場景

場景 1

password_history > 0 and password_reuse_interval = 0

結論:歷史密碼次數 控制策略生效,符合預期。

場景 2

password_history = 0 and password_reuse_interval > 0

結論:歷史密碼時間 控制策略生效,符合預期。

場景 3

password_history > 0 and password_reuse_interval > 0

結論:歷史密碼時間 控制策略生效,歷史密碼次數 控制策略不生效,mysql.password_history 將記錄指定時間內的所有密碼且均不能被重用。

小結

  • password_reuse_interval 對於時間的控制策略優先順序⾼於 password_history 對於次數的控制。

    • 兩者並不是同時⽣效,兩個引數同時配置時,取的是更嚴格的那個配置作為⽣效的策略。
  • 策略本質上對使⽤和功能上沒影響。

相關文章