MySQL道普請便り

第172回SYSTEM_USERによるアカウントの保護

MySQLはバージョン8.0になってからもさまざまな新機能が日々追加されています。MySQLバージョン8.0.16では権限周りの新しい追加要素としてSYSTEM_USER権限が追加されました。

SYSTEM_USER権限は対象のアカウントをシステムアカウントとして扱い、特定の操作を通常のアカウントから受け付けないようにするための権限です。これを利用することで、重要なアカウントに関して通常アカウントから操作されないよう、保護をすることが可能となります。

今回はこのSYSTEM_USER権限について解説していきます。なお、今回利用しているMySQLのバージョンは8.0.28となります。

SYSTEM_USER権限とは

SYSTEM_USER権限は8.0.16で追加された新しい権限となります。この権限を持っているユーザーはシステムアカウントとして扱われ、この権限を持っていないユーザーは通常のアカウントとして扱われます。

システムアカウントは通常のアカウント及び、システムアカウントに対して以下の操作を行うことができますが、通常アカウントはシステムアカウントに対して以下の操作をできません。

  • アカウントの操作
  • システムアカウントが発行したセッション及び実行中のステートメントのKILL
  • ストアドオブジェクトのDEFINER属性の設定

たとえば、通常のアカウントがWITH GRANT OPTIONをもったアカウントである場合、そのアカウントが持つ指定された任意の権限を他のユーザーに与えることができますが、付与対象のアカウントがシステムアカウントである場合はエラーとなり、付与することができません。

また、SYSTEM_USER権限をもつロールを作成した場合は、それをmandatory_rolesに設定することができません。

mysql> SET PERSIST mandatory_roles = 'system_user_role';
ERROR 3880 (HY000): Cannot set mandatory_roles: AuthId `system_user_role`@`%` has 'SYSTEM_USER' privilege.

試してみる

実際に、SYSTEM_USER権限をもつアカウントと持たないアカウントを作成して、権限の操作をやってみましょう。

mysql> CREATE USER system_fukamachi@localhost IDENTIFIED BY 'fukamachi';
Query OK, 0 rows affected (0.02 sec)

mysql> CREATE USER fukamachi@localhost IDENTIFIED BY 'fukamachi';
Query OK, 0 rows affected (0.00 sec)

mysql> GRANT SELECT,UPDATE,INSERT,DELETE,SYSTEM_USER ON *.* TO system_fukamachi@localhost WITH GRANT OPTION;
Query OK, 0 rows affected (0.00 sec)

mysql> GRANT SELECT,UPDATE,INSERT,DELETE ON *.* TO fukamachi@localhost WITH GRANT OPTION;
Query OK, 0 rows affected (0.00 sec)

上記のようにSYSTEM_USER権限をもつシステムアカウントと、SYSTEM_USER権限を持たない通常のアカウントにWITH GRANT OPTIONをつけて用意しました。

各ユーザーでログインして権限の剥奪を実行してみます。まずはシステムアカウントで、通常アカウントの権限の剥奪を実施してみます。

$ mysql -u system_fukamachi -p
mysql> REVOKE DELETE ON *.* FROM fukamachi@localhost;
Query OK, 0 rows affected (0.02 sec)

いつもどおり権限の剥奪ができました。続いて、通常のアカウントでシステムユーザーのアカウントを剥奪してみます。

$ mysql -u fukamachi -p
mysql> REVOKE DELETE ON *.* FROM system_fukamachi@localhost;
ERROR 1227 (42000): Access denied; you need (at least one of) the SYSTEM_USER privilege(s) for this operation

SYSTEM_USER権限がないため、エラーとなってしまいました。ではSYSTEM_USER権限をもつrootアカウントで、再度システムアカウントの権限を剥奪してみます。

$ mysql -u root -p
mysql> REVOKE DELETE ON *.* FROM system_fukamachi;
Query OK, 0 rows affected (0.01 sec)

今度は剥奪することができました。

このように、システムアカウントはシステムアカウントおよび通常アカウントに対して権限の操作をできますが、通常アカウントはシステムアカウントに対しては操作はできません。

SYSTEM_USER権限のことではないSYSTEM_USER

SYSTEM_USER権限についてざっくりと理解したところで、SYSTEM_USERという単語がでてくるが、SYSTEM_USER権限のことではないものをいくつか紹介いたします。

mysqlクライアントのsyslogオプション

mysqlクライアントでは—syslogオプションを付与することでシステムロギング機能に書き込みを行います。このsyslogは以下のような形式で出力されます。

MySQL :: MySQL 8.0 リファレンスマニュアル :: 4.5.1.3 mysql クライアントロギング
May 25 07:37:25 myhost MysqlClient: SYSTEM_USER:'mysql', MYSQL_USER:'root', CONNECTION_ID:36, DB_SERVER:'--', DB:'--', QUERY:'select sleep(2)'
May 25 07:37:26 myhost MysqlClient: SYSTEM_USER:'mysql', MYSQL_USER:'root', CONNECTION_ID:36, DB_SERVER:'--', DB:'--', QUERY:';'

ここで出力されている、SYSTEM_USERはSYSTEM_USER権限を持つユーザーではなく、オペレーティングシステムのユーザー名 となります。このsyslogオプションについては公式ドキュメントmysql クライアントロギングのsyslog ロギング特性を御覧ください。

performance_schemaのprocesslistテーブル

このUSERのカラムに、稀にsystem userという値が出力されることがあります。

これはタスクを内部的に処理するためにサーバーによって起動される非クライアントスレッドを指し、SYSTEM_USER権限をもつシステムアカウントのユーザーを指すものではありません。

SYSTEM_USER()関数

SYSTEM_USER関数もSYSTEM_USER権限とは無関係であり、USER関数のシノニムとなっております。この関数は少なくともバージョン5.0から存在するもので、関数の実行も通常のアカウントでの実行が可能となっております。

mysql> SELECT SYSTEM_USER();
+---------------------+
| SYSTEM_USER()       |
+---------------------+
| fukamachi@localhost |
+---------------------+
1 row in set (0.00 sec)

まとめ

今回は、SYSTEM_USER権限について簡単に説明しました。システムアカウントと通常のアカウントを明確に管理することでシステムアカウントを保護することが可能になります。不要な権限は付与しないことがよいですが、重要なアカウントに対してシステムアカウントにすることで思いがけない事を防ぐことが可能になるかもしれません。

SYSTEM_USERについてのより詳しい操作方法や、できることについては、公式ドキュメントのアカウントカテゴリを一読してご利用することをおすすめします。

おすすめ記事

記事・ニュース一覧