mita2 database life

主にMySQLに関するメモです

MySQL SYSTEM_USER 権限を持ったユーザの操作には SYSTEM_USER 権限 が必要

動的権限と静的権限

「動的権限は、従来の静的権限が細分化されたもの。静的権限を持っていれば、動的権限は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 権限は、静的権限では満たせない仕様がありました。

dev.mysql.com

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権限 を付与することは可能

「マネージドサービスを実装するために、追加された仕組みなんだろうなぁ」と思いました