MySQL8.0.18でランダムパスワードによるユーザ生成を試す

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