はじめに
MySQL 8.0.34 より、validate_passwordコンポーネントにchanged_characters_percentageが導入されました。
Changes in MySQL 8.0.34 (2023-07-18, General Availability) より
本記事では、新しく導入されたchanged_characters_percentageの動作確認をするとともに、これを機会に改めてMySQL8.0 におけるユーザーパスワードポリシーの選定、設定についてまとめていきます。
validate_password コンポーネントのパスワードポリシーについて
MySQL 5.7 までは validate_password プラグインを用いてパスワードの検証を行うことができました。
MySQL 8.0 では、validate_password プラグインが validate_password コンポーネントとして再実装されました。
validate_password コンポーネントでは、パスワードチェックのためのポリシーを 3 レベルで設定します。
validate_password.policy 変数に 数値 0
、1
、2
、または対応するシンボリック値 LOW
、MEDIUM
、STRONG
を設定します。
それぞれのポリシーに対して実施されるテストについては下の表に示す通りです。
ポリシー | 実施されるテスト |
---|---|
0 または LOW |
長さ |
1 または MEDIUM |
長さ、数値、小文字、大文字、および特殊文字 |
2 または STRONG |
長さ、数値、小文字、大文字、および特殊文字、辞書ファイル |
長さテストの場合、必要な長さは validate_password.length システム変数で設定します。
他のテストに必要な値も同様に、他の validate_password.xxx 変数(後述)で指定します。
新しく導入された changed_characters_percentage とは?
公式マニュアルにおけるvalidate_password.changed_characters_percentageの紹介(英語)や、リリースノートから、要点を抜粋すると以下になります。
- 既存のMySQL内のユーザーのパスワードを置き換えようとするときに変更しなければならない最小文字数を、全文字に対する割合(0 から 100)で示す
- デフォルト値は0。そのためデフォルト設定では現在のパスワードに使用されているすべての文字を新しいパスワードでも使用できる
- ‘abc’と’ABC’は同じ文字とみなされる
- 100%に設定された場合は、大文字小文字にかかわらず現在のパスワードのすべての文字が拒否される
- 設定した基準を満たさない場合、異なる文字数の最小値を示すエラーを報告する
12345mysql> ALTER USER 'test'@'%' IDENTIFIED BY 'Password1!' REPLACE 'Password1_';ERROR 4165 (HY000): The new password must have at least '10' charactersthat are different from the old password. It has only '1' character(s)different. For this comparison, uppercase letters and lowercase lettersare considered to be equal. - REPLACE句を使わないALTER USER文でパスワードを変更する場合は影響しない。
- 言い換えると、ALTER USER … REPLACE コマンドでパスワードを変更する場合に機能する、ということです。
- パスワード変更時の ALTER USER コマンドに REPLACE 句を必要とするか(パスワード変更時に現在のパスワードを入力する必要があるか)は、対象アカウントの
PASSWORD REQUIRE CURRENT
の設定や、対象MySQLサーバーのpassword_require_current
システム変数の設定により異なります。
詳細については"Password Verification-Required Policy"の公式マニュアル(英語)を参照いただけますと幸いです。
validate_password.changed_characters_percentageの動作確認
ここでは新機能のvalidate_password.changed_characters_percentage がどのように使用できるのか、以下の観点で動作確認をしていきます。
- どのパスワード変更方法で動作するのか
- どのパスワードポリシー(validate_password.policy)でも動作するのか
前提
- MySQL 8.0.35 環境
- テストユーザー(test@%)を事前作成済み
確認方法
-
rootユーザーでログインし、REPLACE句なしのALTER USER文でテストユーザーのパスワードを変更する
1mysql> ALTER USER test IDENTIFIED BY 'Password1_'; -
テストユーザーでログインし、REPLACE句ありのALTER USER文でパスワードを置き換える
1mysql> ALTER USER 'test'@'%' IDENTIFIED BY 'Password1!' REPLACE 'Password1_';※REPLACE句は、自身のパスワード変更時のみ使用することができるオプションです。
-
rootユーザーでログインし、SET PASSWORD文でテストユーザーのパスワードを変更する
1mysql> SET PASSWORD FOR 'test'@'%'='Password1_';確認結果
変更方法 0
またはLOW
1
またはMEDIUM
2
またはSTRONG
REPLACE句なしのALTER USER文 × × × REPLACE句ありのALTER USER文 〇 〇 〇 SET PASSWORD文 × × × 〇:影響する、×:影響しない
動作確認より、validate_password.changed_characters_percentage はどのパスワードポリシーでも動作することが新たに判明しました。
ここからはパスワードポリシーに指定可能な変数について、改めてまとめてみます。
各パスワードポリシーに関連するvalidate_password.xxx 変数の対照表
新しい validate_password.changed_characters_percentage を加えた、validate_password.xxx 変数とパスワードポリシーの対応を改めてまとめてみました。
各ポリシーにて「〇」が付いているパラメータの設定を検討する必要があります。
パラメータ | 0 または LOW |
1 または MEDIUM |
2 または STRONG |
---|---|---|---|
changed_characters_percentage (パスワード内で変更の必要がある文字の割合) | 〇 | 〇 | 〇 |
check_user_name (ユーザー名と一致する文字列をパスワード内に使用できるか) | 〇 | 〇 | 〇 |
length(パスワードの最小文字数) | 〇 | 〇 | 〇 |
mixed_case_count(パスワード内の大文字/小文字の最小数) | – | 〇 | 〇 |
number_count(パスワード内の数字の最小数) | – | 〇 | 〇 |
special_char_count(パスワード内での英数字以外の最小文字数) | – | 〇 | 〇 |
dictionary_file (パスワードチェックで使用する辞書ファイルのパス) | – | – | 〇 |
詳細につきましては、MySQL8.0 公式ドキュメント(英語版)にも記載されておりますので併せて参照いただけますと幸いです。
6.4.3.2 Password Validation Options and Variables
まとめ
今回の記事では、MySQL8.0.34 から新しく追加された validate_password.changed_characters_percentage の紹介を兼ねて動作確認を行ってみました。
既存のパスワードと新パスワード間の使用文字の重複を避けられるパラメータのため、「パスワード変更時に必ず異なる文字列に変更しなければならない」等の要件がある環境の場合に有用なのではないでしょうか。
この記事が皆様のお使いの環境のユーザーパスワードポリシーを検討、変更する際の参考になれば幸いです。