GA

2023/10/30

MySQLの user@'%' にまつわる謎仕様

TL;DR

  • 昔から user@'%'user@'xxx'両方があって 認証が ‘xxx’ の方で行われた場合 、そのセッションは user@'%'user@'xxx' の両方の権限を持つ謎仕様があった
  • MySQL 8.2.0のリリースノートにある In addition, the treatment of %by the server as a synonym for localhost when checking privileges (that is, privileges granted to 'myuser'@'%' are also granted to 'myuser'@'localhost') is now also deprecated as of MySQL 8.2.0 and thus also subject to removal in a future version of MySQL. (WL #14280, WL #15676) はこれを指しているような気がする

yoku0825@'%'yoku0825@192.168.122.1 で比較してみる。
yoku0825@'%' アカウントには percent スキーマに(だけ)、 yoku0825@192.168.122.1 アカウントには ipaddr スキーマに(だけ) 権限を足す。

mysql82 9> CREATE USER yoku0825@'%';
Query OK, 0 rows affected (0.01 sec)

mysql82 9> CREATE USER yoku0825@192.168.122.1;
Query OK, 0 rows affected (0.00 sec)

mysql82 9> GRANT ALL ON percent.* TO yoku0825@'%';
Query OK, 0 rows affected (0.01 sec)

mysql82 9> GRANT ALL ON ipaddr.* TO yoku0825@192.168.122.1;
Query OK, 0 rows affected (0.01 sec)

192.168.122.1の方のアカウントを使うようにログインする。

$ mysql82 -h192.168.122.1 -uyoku0825

mysql82 12> SHOW GRANTS;
+------------------------------------------------------------------+
| Grants for yoku0825@192.168.122.1                                |
+------------------------------------------------------------------+
| GRANT USAGE ON *.* TO `yoku0825`@`192.168.122.1`                 |
| GRANT ALL PRIVILEGES ON `ipaddr`.* TO `yoku0825`@`192.168.122.1` |
+------------------------------------------------------------------+
2 rows in set (0.00 sec)

見た目上は192.168.122.1を使っていて、 ipaddr スキーマにしか権限はない。ところがどっこい

mysql82 12> CREATE DATABASE percent;
Query OK, 1 row affected (0.01 sec)

mysql82 12> CREATE TABLE percent.t1 (num INT);
Query OK, 0 rows affected (0.03 sec)

mysql82 12> DROP DATABASE percent;
Query OK, 1 row affected (0.02 sec)

mysql82 12> SHOW GRANTS;
+------------------------------------------------------------------+
| Grants for yoku0825@192.168.122.1                                |
+------------------------------------------------------------------+
| GRANT USAGE ON *.* TO `yoku0825`@`192.168.122.1`                 |
| GRANT ALL PRIVILEGES ON `ipaddr`.* TO `yoku0825`@`192.168.122.1` |
+------------------------------------------------------------------+
2 rows in set (0.00 sec)

percent スキーマにALL相当の権限が当たっている。 SHOW GRANTS は何も表示しない。

ちなみにこれ yoku0825@127.0.0.1 (= 存在しないので ‘%’の方のアカウント ) を使おうとすると

$ mysql82 -h127.0.0.1 -uyoku0825

mysql82 13> SHOW GRANTS;
+-------------------------------------------------------+
| Grants for yoku0825@%                                 |
+-------------------------------------------------------+
| GRANT USAGE ON *.* TO `yoku0825`@`%`                  |
| GRANT ALL PRIVILEGES ON `percent`.* TO `yoku0825`@`%` |
+-------------------------------------------------------+
2 rows in set (0.00 sec)

mysql82 13> CREATE DATABASE ipaddr;
ERROR 1044 (42000): Access denied for user 'yoku0825'@'%' to database 'ipaddr'

想像した通り ( yoku0825@'%'yoku0825@192.168.122.1 は別人として ) 扱われる。
ホスト部分が 192.168.% みたいなやつとどう干渉するのかは試していない。

で、これがなくなるのかしら。。


前にsh2さんがレポートしてたよなって思ったら俺も登場していた。

MySQL Bugs: #68436: user@127.0.0.1 is authorized partly as user@localhost.