動的権限と静的権限
「動的権限は、従来の静的権限が細分化されたもの。静的権限を持っていれば、動的権限はREVOKEしても影響はない」と考えていました。 例えば、SUPER 権限 (静的) を持っていれば、BINLOG_ADMIN 権限 (動的) がなくとも、バイナリログをパージできます。
mysql> SHOW GRANTS; +-------------------------------------------+ | Grants for super@localhost | +-------------------------------------------+ | GRANT SUPER ON *.* TO `super`@`localhost` | +-------------------------------------------+ 1 row in set (0.00 sec) mysql> PURGE BINARY LOGS TO 'binlog.000008'; Query OK, 0 rows affected (0.01 sec)
しかし、SYSTEM_USER 権限は、静的権限では満たせない仕様がありました。
SYSTEM_USER 権限によるアカウント保護
簡単に言うと、SYSTEM_USER を持つユーザ(システムユーザ)の権限を変更したり、ユーザを削除するには、SYSTEM_USER 権限を持っている必要があります。 SUPER 等の静的権限では、システムユーザを変更できません。
スマートスタイルさんの記事がわかりやすいです。
https://blog.s-style.co.jp/2020/06/6097/
例
システムユーザを作成する。
mysql> CREATE USER 'system_user'@'localhost'; Query OK, 0 rows affected (0.09 sec) mysql> GRANT SYSTEM_USER ON *.* TO 'system_user'@'localhost'; Query OK, 0 rows affected, 1 warning (0.04 sec)
-- 自分 (root) から SYSTEM_USER を 剥奪 mysql> REVOKE SYSTEM_USER ON *.* FROM 'root'@'localhost'; Query OK, 0 rows affected, 1 warning (0.01 sec)
システムユーザに権限を付与することも、削除することもできなくなりました。
mysql> GRANT SELECT ON *.* TO 'system_user'@'localhost'; ERROR 1227 (42000): Access denied; you need (at least one of) the SYSTEM_USER privilege(s) for this operation mysql> DROP USER 'system_user'@'localhost'; ERROR 1227 (42000): Access denied; you need (at least one of) the SYSTEM_USER privilege(s) for this operation
SYSTEM_USER 権限を復活(付与)する
SYSTEM_USER 権限の付与は SUPER 権限を持っていれば可能です。
mysql> GRANT SYSTEM_USER ON *.* TO 'root'@'localhost'; Query OK, 0 rows affected, 1 warning (0.01 sec)
まとめ
- SYSTEM_USER 権限を REVOKE してしまうと、例え SUPER 権限をもってても、システムユーザの変更はできない
- SUPER権限を持つユーザを持っていれば、SYSTEM_USER権限 を付与することは可能
「マネージドサービスを実装するために、追加された仕組みなんだろうなぁ」と思いました