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)
はこれを指しているような気がする- MySQL :: MySQL 8.2 Release Notes :: Changes in MySQL 8.2.0 (2023-10-25, Innovation Release)
- deprecatedって言われてるけど警告も出ず、少なくとも8.2.0現在この動作のまま
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.