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に設定することができません。
試してみる
実際に、SYSTEM_USER権限をもつアカウントと持たないアカウントを作成して、権限の操作をやってみましょう。
上記のようにSYSTEM_USER権限をもつシステムアカウントと、SYSTEM_USER権限を持たない通常のアカウントにWITH GRANT OPTIONをつけて用意しました。
各ユーザーでログインして権限の剥奪を実行してみます。まずはシステムアカウントで、通常アカウントの権限の剥奪を実施してみます。
いつもどおり権限の剥奪ができました。続いて、通常のアカウントでシステムユーザーのアカウントを剥奪してみます。
SYSTEM_USER権限がないため、エラーとなってしまいました。ではSYSTEM_USER権限をもつrootアカウントで、再度システムアカウントの権限を剥奪してみます。
今度は剥奪することができました。
このように、システムアカウントはシステムアカウントおよび通常アカウントに対して権限の操作をできますが、通常アカウントはシステムアカウントに対しては操作はできません。
SYSTEM_USER権限のことではないSYSTEM_USER
SYSTEM_USER権限についてざっくりと理解したところで、SYSTEM_USERという単語がでてくるが、SYSTEM_USER権限のことではないものをいくつか紹介いたします。
mysqlクライアントのsyslogオプション
mysqlクライアントでは—syslogオプションを付与することでシステムロギング機能に書き込みを行います。このsyslogは以下のような形式で出力されます。
ここで出力されている、SYSTEM_USERはSYSTEM_USER権限を持つユーザーではなく、オペレーティングシステムのユーザー名 となります。このsyslogオプションについては公式ドキュメントmysql クライアントロギングのsyslog ロギング特性を御覧ください。
performance_schemaのprocesslistテーブル
このUSERのカラムに、稀にsystem userという値が出力されることがあります。
これはタスクを内部的に処理するためにサーバーによって起動される非クライアントスレッドを指し、SYSTEM_USER権限をもつシステムアカウントのユーザーを指すものではありません。
SYSTEM_USER()関数
SYSTEM_USER関数もSYSTEM_USER権限とは無関係であり、USER関数のシノニムとなっております。この関数は少なくともバージョン5.0から存在するもので、関数の実行も通常のアカウントでの実行が可能となっております。
まとめ
今回は、SYSTEM_USER権限について簡単に説明しました。システムアカウントと通常のアカウントを明確に管理することでシステムアカウントを保護することが可能になります。不要な権限は付与しないことがよいですが、重要なアカウントに対してシステムアカウントにすることで思いがけない事を防ぐことが可能になるかもしれません。
SYSTEM_USERについてのより詳しい操作方法や、できることについては、公式ドキュメントのアカウントカテゴリを一読してご利用することをおすすめします。