mita2 database life

主にMySQLに関するメモです

MySQL 8.0 でパスワードのハッシュ値でユーザを作成する構文が変わってた

MySQL では、パスワードのハッシュ値を指定してユーザを作ることが出来ます。

mysql> SELECT authentication_string FROM mysql.user WHERE User = 'usr';
+-------------------------------------------+
| authentication_string                     |
+-------------------------------------------+
| *9DE95B4999920AF052A4DC2BC3D229D4E9D1B676 |
+-------------------------------------------+
1 row in set (0.00 sec)
mysql> CREATE USER usr@'localhost' IDENTIFIED BY PASSWORD '*9DE95B4999920AF052A4DC2BC3D229D4E9D1B676';
Query OK, 0 rows affected, 1 warning (0.00 sec)

この方法は複数のデータベースに同一のパスワードでユーザを作成する時に便利です。

ユーザ作成は、データベース管理者が仮パスワードでユーザを作成し、本人がパスワードを変更する流れが一般的だと思います。 仮パスワードの発行とパスワード変更を複数のデータベースで行うのは面倒です。最初のデータベースだけこの流れでパスワードを設定し、残りはハッシュ値をコピーすれば手間を省けます*1

また、平文のパスワードを含むSQLは取り扱いに非常に注意が必要ですが、ハッシュ値であれば、気軽に取り扱える点もメリットです。

IDENTIFIED BY PASSWORD〜構文が8.0で廃止された

上記のIDENTIFIED BY PASSWORD 構文 はMySQL 5.7 のものです。deprecated になっており廃止が予告されていました。

8.0 からは、IDENTIFIED WITH auth_plugin AS ハッシュ値(authentication_string) に構文が変わっています。

mysql> CREATE USER 'usr'@'localhost' IDENTIFIED WITH 'caching_sha2_password' AS 0x244124303035241F53216C28304B071C573A37015F252C54631B66446E7064626471444E51683766426336377635585A756E6E7A442E497339716942596A2E6D7755514A4C38

ハッシュ値は、mysql.user テーブルもしくは SHOW CREATE USER で確認できます。

mysql> SELECT authentication_string FROM mysql.user WHERE User = 'usr';
+------------------------------------------------------------------------+
| authentication_string                                                                                   |
+------------------------------------------------------------------------+
| $A$005$S!l(0KW:7_%,TcDnpdbdqDNQh7fBc67v5XZunnzD.Is9qiBYj.mwUQJL8 |
+------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> SHOW CREATE USER usr@'localhost' \G
*************************** 1. row ***************************
CREATE USER for usr@localhost: CREATE USER 'usr'@'localhost' IDENTIFIED WITH 'caching_sha2_password' AS '$A$005$S!l(0KW:7_%,TcDnpdbdqDNQh7fBc67v5XZunnzD.Is9qiBYj.mwUQJL8' REQUIRE NONE PASSWORD EXPIRE DEFAULT ACCOUNT UNLOCK PASSWORD HISTORY DEFAULT PASSWORD REUSE INTERVAL DEFAULT PASSWORD REQUIRE CURRENT DEFAULT
1 row in set (0.00 sec)

また、ハッシュ値は16進数で指定することも可能になっています。authentication_string にバイナリが入る可能性を考慮しているのでしょう。 16進数の表記は、print_identified_with_as_hexon で確認できます。

mysql> SET print_identified_with_as_hex = on;
Query OK, 0 rows affected (0.00 sec)

mysql> SHOW CREATE USER usr@'localhost' \G
*************************** 1. row ***************************
CREATE USER for usr@localhost: CREATE USER 'usr'@'localhost' IDENTIFIED WITH 'caching_sha2_password' AS 0x244124303035241F53216C28304B071C573A37015F252C54631B66446E7064626471444E51683766426336377635585A756E6E7A442E497339716942596A2E6D7755514A4C38 REQUIRE NONE PASSWORD EXPIRE DEFAULT ACCOUNT UNLOCK PASSWORD HISTORY DEFAULT PASSWORD REUSE INTERVAL DEFAULT PASSWORD REQUIRE CURRENT DEFAULT
1 row in set (0.00 sec)

*1:Linuxで/etc/shadow をコピーするのと同じ原理です