モヒカンメモ

髪色が定期的に変わることに定評のある(比較的)若者Webエンジニアの備忘録

MySQLにパスワードポリシーで怒られるときの回避策

MySQL5.7.8以降で、ゆるいパスワードでユーザを作成しようとした際に下記のようなエラーで怒られる

mysql> create user "user_name"@"localhost" identified by "some_weak_password";
ERROR 1819 (HY000): Your password does not satisfy the current policy requirements

MySQL :: MySQL 5.7 Release Notes :: Changes in MySQL 5.7.8 (2015-08-03, Release Candidate)

5.7.8以降では validate_password プラグインがデフォルトでインストールされるようになっており、その影響で脆弱なパスワードはプラグインによって怒られるようになっている

現状確認

MySQL :: MySQL 5.7 Reference Manual :: 6.4.3 The Password Validation Plugin

mysql> show global variables like '%validate%';
+--------------------------------------+--------+
| Variable_name                        | Value  |
+--------------------------------------+--------+
| 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      |
+--------------------------------------+--------+
7 rows in set (0.01 sec)

ドキュメントと上記設定を見る限り、デフォルトでは

  • パスワード長 8文字以上
  • 大文字小文字 1文字以上
  • 数字 1文字以上
  • 記号 1文字以上

でないと怒られるらしい

2020/07/04 追記

prefixが validate_password. ではなく validate_password_ の場合もあるらしい。自分の環境ではドットとアンスコどちらが正しいかは上記コマンドで確認できるので、実行前に確認してほしい。

回避策

1. validate_password.policyをLOWに下げる

MySQL :: MySQL 5.7 Reference Manual :: 6.4.3.2 Password Validation Plugin Options and Variables

によると validate_password.policyMEDIUM のときは、長さ、数字、大文字小文字、記号の4項目で制約がかかるが、 LOW にすると長さのみの制約になるようだ

オンラインで実行する場合のクエリ

mysql> set global validate_password.policy = "LOW";
Query OK, 0 rows affected (0.00 sec)

2. 各種制約文字数を下げる

*_count 系の設定値を変更することで、最低文字数の条件を緩和することができる

例えば「記号は必須にしたくないなー」というときは validate_password.special_char_count0 にしてやれば、パスワードに記号が含まれていなくてもエラーにはならなくなる

オンラインで実行する場合のクエリ

mysql> set global validate_password.special_char_count = 0;
Query OK, 0 rows affected (0.01 sec)

注意

文中で紹介したオンラインで実行する場合のクエリを実行してもDBサーバが再起動するとデフォルトに戻るので、永久的な設定としたい場合は my.cnf の mysqld ディレクティブとかに設定を書いておく必要がある

おまけ

参考にした資料、記事等

yoku0825.blogspot.com

MySQL :: MySQL 5.7 Release Notes :: Changes in MySQL 5.7.8 (2015-08-03, Release Candidate)

MySQL :: MySQL 5.7 Reference Manual :: 6.4.3 The Password Validation Plugin

MySQL :: MySQL 5.7 Reference Manual :: 6.4.3.2 Password Validation Plugin Options and Variables