こんにちは、@Manabu です。
MySQLでユーザーのパスワードが変更できない
基本的にMySQLでは、ユーザーにログインパスワードを設定することが多いです。
ユーザーの新規作成時やパスワード変更時に、考えたパスワードを設定しようとするとエラーが発生することがあります。
今回は、その中でもパスワードポリシーに違反した時のエラーについて紹介します。
この記事は、以下のような方におすすめです。
エラーの内容
今回発生したエラーの内容についてです。
まず、以下のコマンドでrootユーザーの初期パスワード変更を行う予定でした。
ALTER USER 'root'@'localhost' IDENTIFIED BY 'newpassword';
上記のコマンドを実行することで、発生したエラーの内容は以下になります。
ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
このエラーは、MySQLのパスワードポリシーにより、設定しようとしているパスワードが強度要件を満たしていないことを示しています。
確かに、半角英語だけだと不用心ですよね〜
MySQL8.0では、デフォルトで「validate_password」プラグインが有効になっています。
このプラグインは、パスワードの強度をチェックし、一定の基準を満たさないパスワードの使用を禁止します。
パスワードポリシーを確認し、適切なパスワードを設定することでエラーは解消します。
パスワードポリシー
MySQLのパスワードポリシーは、以下のコマンドを実行することで確認できます。
SHOW VARIABLES LIKE 'validate_password%';
実際に実行してみると、以下のような結果が出力されました。
mysql> 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 |
+-------------------------------------------------+--------+
8 rows in set (0.03 sec)
各設定について簡単に解説します。
changed_characters_percentage
この設定は、パスワード変更時に変更する文字の割合を指定するシステム変数になります。
値は0〜100で設定することができます。
数値が高くなるにつれ、変更前のパスワードの文字を使用することができなくなります。
今回は0のため、影響はありません。
check_user_name
この設定は、パスワードにユーザー名を含めないように確認するためのシステム変数になります。
ONかOFFで設定することができます。
ONの場合、MySQLにログインしているユーザー名をパスワードに使用することができないようです。
今回はONになっているので、rootユーザーでログインしている場合、作成したユーザーのパスワードをrootに設定することはできません。
dictionary_file
この設定は、辞書ファイルを指定するシステム変数になります。
辞書ファイルが指定されていれば、一般的な単語を含むパスワードを防ぎます。
length
この設定は、パスワードの最小文字数を指定するシステム変数になります。
0以上の値を設定することができます。しかし、以下の式より小さい値は設定できないようです。
validate_password.number_count
+ validate_password.special_char_count
+ (2 * validate_password.mixed_case_count)
mixed_case_count
この設定は、大文字・小文字を混在させるかを指定するシステム変数になります。
0以上の値を設定することができます。
値に設定された文字数以上の大文字・小文字を指定する必要があります。
今回は1のため、大文字・小文字それぞれ1文字以上必要です。
number_count
この設定は、数字を含めるかを指定するシステム変数になります。
0以上の値を設定することができます。
値に設定された文字数以上の数字を指定する必要があります。
今回は1のため、1文字以上の数字が必要です。
policy
この設定は、パスワードの厳格さを指定するシステム変数になります。
値は0〜2の値を設定することができます。
それぞれ、0:LOW、1:MEDIUM、2:STRONGという強さを設定することが可能です。
今回は、MEDIUMのため、以下の検証項目を設定する必要があります。
MEDIUM:長さ、数値、小文字、大文字、特殊文字
special_char_count
この設定は、特殊文字を含めるかを指定するシステム変数になります。
0以上の値を設定することができます。
値に設定された文字数以上の特殊文字を指定する必要があります。
今回は1のため、1文字以上の特殊文字が必要です。
適切なパスワードの例
今回設定されているパスワードポリシーですと、以下のような条件をクリアする必要があります。
- 最小8文字以上
- 小文字、大文字、数字、特殊文字がそれぞれ1文字以上含まれる
- ユーザー名が含まれていない
今回の例ですと、以下のようなコマンドを実行することでパスワードの変更をすることができます。
ALTER USER 'root'@'localhost' IDENTIFIED BY 'SecureP@ss1';