2019/10/14に、MySQL8.0系の最新バージョンである8.0.18がリリースされました。
https://mysqlserverteam.com/the-mysql-8-0-18-maintenance-release-is-generally-available/
"Maintenance Release"と銘打たれていますが、最早いつも通り多くの新機能が盛り込まれており、今回の目玉としては
- Hash Joinのサポート
- EXPLAIN ANALYZE(実際のクエリ実行に即した、より詳細な実行計画の出力)
などが挙げられます。
その中で、比較的地味ではありますが新たに追加されたランダムパスワードによるユーザ生成を試したいと思います。
- MySQL公式ドキュメント
https://dev.mysql.com/doc/refman/8.0/en/password-management.html#random-password-generation
ランダムパスワードによるユーザ生成について
以下の構文により、ランダムパスワードによるユーザ生成を実行できます。
CREATE USER user IDENTIFIED BY RANDOM PASSWORD;
また、以下の構文により、既存ユーザのランダムパスワードによるパスワード変更を実行できます。
ALTER USER user IDENTIFIED BY RANDOM PASSWORD;
SET PASSWORD [FOR user] TO RANDOM;
試してみた
実際に試してみます。
# mysql -uroot
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 11
Server version: 8.0.18 MySQL Community Server - GPL
Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.
...
mysql> CREATE USER hoge@localhost IDENTIFIED BY RANDOM PASSWORD;
+------+-----------+----------------------+
| user | host | generated password |
+------+-----------+----------------------+
| hoge | localhost | EfHaU:q+,GvXd3g_g1b: |
+------+-----------+----------------------+
1 row in set (0.01 sec)
ユーザを作成した瞬間に、"generated password"として生成されたパスワードがドカッと表示されます。
上記ユーザでログインしてみます。
# mysql -u hoge -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 12
Server version: 8.0.18 MySQL Community Server - GPL
Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.
...
mysql> show grants;
+------------------------------------------+
| Grants for hoge@localhost |
+------------------------------------------+
| GRANT USAGE ON *.* TO `hoge`@`localhost` |
+------------------------------------------+
1 row in set (0.00 sec)
当然ですが、出力されたパスワードでログインできます。
ALTER USERも試してみます。
mysql> ALTER USER hoge@localhost IDENTIFIED BY RANDOM PASSWORD;
+------+-----------+----------------------+
| user | host | generated password |
+------+-----------+----------------------+
| hoge | localhost | NqZ(udGqTnkTKB.D6SrI |
+------+-----------+----------------------+
1 row in set (0.02 sec)
ALTERでも概ね一緒です。
コマンドラインで-eオプションを使っても以下のように出力されます。
# mysql -uroot -e'CREATE USER fuga@localhost IDENTIFIED BY RANDOM PASSWORD'
+------+-----------+----------------------+
| user | host | generated password |
+------+-----------+----------------------+
| fuga | localhost | K]T6eu7dPhDR[i++,9WE |
+------+-----------+----------------------+
標準出力にパイプするとタブ区切りでの出力になるので、以下のようなコマンドでパスワードのみ出力することができます。
# mysql -uroot -s -e'CREATE USER piyo@localhost IDENTIFIED BY RANDOM PASSWORD' | awk '{print $NF}'
pnx]txV0x;oxL@cg]u,k
雰囲気的に、 validate_password.policy=MEDIUM
の「文字種」(数値、アルファベット大文字および小文字、特殊文字の4種すべてを含む)は満たすように生成されるようです。が、 validate_password.length
はどれだけ高い値を設定しても(最大100ですが)無視して文字列が生成されるようです。
(追記)公式ドキュメントに記載がありますが、 validate_password
コンポーネントの設定には影響されないとのことです。
mysql> set global validate_password.length=100;
Query OK, 0 rows affected (0.00 sec)
mysql> CREATE USER foo@localhost IDENTIFIED BY RANDOM PASSWORD;
+------+-----------+----------------------+
| user | host | generated password |
+------+-----------+----------------------+
| foo | localhost | hDn[u)mlb.kE:5J*T7f[ |
+------+-----------+----------------------+
1 row in set (0.02 sec)
上記で生成されたパスワードを手動設定するとエラーが返ってきます。(正常な動作)
mysql> CREATE USER bar@localhost IDENTIFIED BY 'hDn[u)mlb.kE:5J*T7f[';
ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
(10/16追記)ランダムパスワードの文字列長について
生成されるランダムパスワードの文字列長は generated_random_password_length
というシステム変数によって制御されており、デフォルトでは20となっているため必ず20文字のパスワードが生成されるようです。
https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_generated_random_password_length