MySQL道普請便り

第225回MySQLのProxy Userを使って外部認証ユーザーに権限を移譲する

MySQLではバージョン5.5から認証の仕組みがプラグイン化されており、プラグインを使って外部の認証を用いる場合には、Proxy Userという機能を利用して移譲するユーザーの権限を使って操作することができます。今回はこのProxy Userの機能について紹介します。なお、利用しているMySQLのバージョンは8.4となります。

Proxy User

通常、外部の認証を利用した場合、そのユーザー情報はMySQLのアカウントには存在しません。そのため、アカウントの権限を付与したり、そのアカウントでのDB操作を行うことができません。Proxy Userはそのような認証を利用した場合に、外部ユーザーが別のユーザーとして接続し、その別のユーザーに与えられた権限で操作を行うことができます。

今回は外部の認証の仕組みを別途準備せず、既存のmysql_native_password認証プラグインを利用して、Proxy Userの動作を確認していきます。

準備

まず、権限を持たないユーザーfukamachiと、権限を移譲されるユーザーd1_operationを作成します。移譲されるユーザーd1_operationにはd1データベースへのアクセス権限を付与しておきます。また、権限を持たないユーザーでログインした後にd1_operationユーザーに権限を移譲するために、以下のようにPROXY権限を付与します。

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

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

mysql> GRANT ALL ON d1.* TO 'd1_operation'@'localhost';
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> GRANT PROXY ON 'd1_operation'@'localhost' TO 'fukamachi'@'localhost';
Query OK, 0 rows affected, 2 warnings (0.00 sec)

ログイン後の移譲は、デフォルトの設定では利用できません。check_proxy_usersを有効にする必要があります。また、今回はmysql_native_passwordで有効にするために、mysql_native_password_proxy_usersシステム変数も有効にします。

check_proxy_users
このシステム変数が有効な場合、認証プラグインに対してProxy User mappingを実行します。
mysql_native_password_proxy_users
このシステム変数が有効な場合はmysql_native_passwordでProxy Userをサポートします。

どちらも動的システム変数であるため、再起動せずにSET GLOBALで変更することが可能です。

mysql> SET GLOBAL check_proxy_users = 1;
Query OK, 0 rows affected (0.00 sec)

mysql> SET GLOBAL mysql_native_password_proxy_users = 1;
Query OK, 0 rows affected (0.01 sec)

Proxy Userを試してみる

上記で準備は完了です。実際に権限を持たないユーザーでログインして確認してみましょう。

$ mysql -ufukamachi -p

mysql> SHOW GRANTS;
+--------------------------------------------------------------+
| Grants for d1_operation@localhost                            |
+--------------------------------------------------------------+
| GRANT USAGE ON *.* TO `d1_operation`@`localhost`             |
| GRANT ALL PRIVILEGES ON `d1`.* TO `d1_operation`@`localhost` |
+--------------------------------------------------------------+
2 rows in set (0.00 sec) 

権限を確認すると、権限をもたないはずなのにd1_operationの権限が表示されることが確認できます。実際にd1_operationの持つ権限の範囲内で操作することが可能です。

また、ユーザー情報を確認すると、USER()とCURRENT_USER()の値が異なることが確認できます。USER()はサーバーへ接続時に指定したユーザー、CURRENT_USER()は認証する際にサーバーで使用されたMySQLアカウントであることを示しています。

mysql> SELECT user(), current_user();
+---------------------+------------------------+
| user()              | current_user()         |
+---------------------+------------------------+
| fukamachi@localhost | d1_operation@localhost |
+---------------------+------------------------+
1 row in set (0.00 sec)

Proxy Userへの権限付与

外部ユーザーに別のユーザーの権限を持つことができるようにするには、PROXY権限を付与する必要があります。この権限は、カンマ区切りで複数のユーザーに付与することも可能です。権限を剥奪する場合はREVOKE文を使って剥奪します。

mysql> GRANT PROXY ON 'd1_operation'@'localhost' TO 'fukamachi'@'localhost';
mysql> GRANT PROXY ON 'rw1' TO 'f1', 'f2', 'f3';

mysql> REVOKE PROXY ON 'd1_operation'@'localhost' FROM 'fukamachi'@'localhost';

Proxy Userを制限する

場合によっては、Proxy User用に作成したアカウントが直接利用されないようにする必要があります。直接利用されないために、公式ドキュメントでは以下の3つの方法が紹介されています。

  • mysql_no_loginプラグインを利用する
  • アカウント作成時にACCOUNT LOCKオプションを含める
  • パスワードを他の利用者に教えない

まとめ

今回はProxy Userの利用方法について簡単に説明しました。

Proxy Userは、外部の認証を利用する際に別のユーザーの権限を持つことができる機能です。権限を移譲できるのであれば、ROLEのように権限管理に利用できるのでは、と思った読者の方もいるかもしれません。Proxy Userはあくまで外部の認証を利用した場合に別のユーザーの権限を持つことができる機能であり、ROLEのように権限をグルーピングしたり一元管理することはできません。目的が異なるため、権限を管理する場合はROLEを使用することをおすすめします。

Proxy Userを使うことで、外部認証を利用する場合でもDB操作が可能となります。もしそのような要件がある場合には、Proxy Userの利用を検討してください。より詳細な利用方法については公式ドキュメントの プロキシユーザーをご確認ください。

おすすめ記事

記事・ニュース一覧