スマートスタイル TECH BLOG

データベース&クラウド技術情報

MySQL8.0のPartial Revokesを試してみる

Partial Revokesとは

Partial RevokesはMySQL8.0.16から追加された機能です。
グローバルに、つまり全てのスキーマに対して権限を付与してから、一部のスキーマから付与した権限を取り消すことができます。
今回は最新バージョンであるMySQL8.0.19で実際にこの機能を試してみます。

MySQL :: MySQL 8.0 Reference Manual :: 6.2.12 Privilege Restriction Using Partial Revokes

まずは、Partial Revokesがどのようなときに役立つのか見ていきましょう。
なお、本記事で、登場するsakilaとworldデータベースは以下からダウンロードできます。
sakila : https://downloads.mysql.com/docs/sakila-db.zip
world : https://downloads.mysql.com/docs/world.sql.zip

使用例

ユーザー(user@localhost)に対して、次のような権限を付与するとします。

– 全てのスキーマに対してSELECT権限を与える
– ただし、mysqlスキーマへのSELECT権限は与えない

スキーマ構成

Partial Revokes機能を使用しない場合

これまで(MySQL8.0.16以前)はGRANTを使用して、mysql以外のスキーマに対して1つ1つ明示的に権限を付与する必要がありました。

Partial Revokes機能を使用する場合

全てのスキーマ*.*に対してSELECT権限を付与した後、mysqlスキーマへの権限を制限します。

これでuser@localhostにmysqlスキーマを除いた全てのスキーマに対してSELECT権限を付与することができました。
このように、Partial Revokes機能を使用すると2行で済みます。

特定のスキーマを除いて、多数のスキーマに権限を与えたいといった場合は、Partial Revokes機能を使用すると便利です。
一方、権限を付与するスキーマの数が少ない場合は、今まで通りGRANTで明示的にスキーマ1つ1つに対して権限を付与していったほうがいいでしょう。

両者の比較はこちらのマニュアルでも説明されています。

Partial Revokes機能の有効化

Partial Revokes機能はpartial_revokes変数で設定します。
デフォルトではOFF(注1)となっています。

設定ファイルの[mysqld]セクションにpartial_revokes = ONを追加して、再起動します。

動的に変更することも可能です。

注1:一度機能を有効化して、Partial Revokes機能を使用したユーザーが存在していると、次回のサーバー起動時には明示的に有効化していなくても、デフォルトで有効化されます。詳しくは後述の[Partial Revokes機能の無効化]で説明します。

Partial Revokes機能の使用方法

新たに作成したユーザーにPartial Revokesを使用してみます。
まず、ユーザーを作成し、グローバルレベル*.*でSELECTとINSERT権限を付与します。

次に、worldスキーマのみINSERT権限を制限(Partial Revokes)します。

user1@localhostの権限を確認すると制限されている状態を表すREVOKEが追加されています。

user1@localhostでログインをして、権限が制限されているかを確認します。

worldスキーマのテーブルに対してSELECTはできますが、INSERTの権限が制限されていることが確認できます。

また、world以外のスキーマに対してはINSERTが実行できます。

Partial Revokesを使用しているユーザーの確認方法

Partial Revokesによって権限が制限されているユーザーはmysql.userテーブルのUser_attributesカラムにRestrictions属性があります。
以下のコマンドでPartial Revokesが使用されているユーザーを確認できます。

Partial Revokesによる制限の取り消し

Partial Revokesを取り消す方法はいくつかあります。
今回はuser1に以下のように権限を制限した状態で、制限の取り消し方法を紹介します。

グローバルに権限を付与する

user1に対して再度グローバルに権限を付与することで、制限を取り消すことができます。

スキーマに権限を付与する

制限されているスキーマに対して権限を付与することで、特定のスキーマに対する制限を取り消すことができます。

グローバルに権限を取り消す

付与されている権限をグローバルでREVOKEすることにより、権限を取り消すことができます。
このときスキーマレベルでの制限もなくなります。

Partial Revokesの制限

スキーマのワイルドカードの使用

Partial Revokesではワイルドカードでスキーマを指定することはできないとマニュアルに書いてあります。

Partial revokes must name the schema literally. Schema names that contain the % or _ SQL wildcard characters (for example, myschema%) are not permitted.

引用元 : MySQL :: MySQL 8.0 Reference Manual :: 6.2.12 Privilege Restriction Using Partial Revokes

実際に試してみます。
まず、user1にワイルドカードでwo%スキーマに対する権限を制限してみます。

user1@localhostでログインして確認します。
worldスキーマのテーブルに対してSELECTとINSERTが実行できます。
wo%スキーマに対する制限がされていない、つまりワイルドカードが有効になっていないことがわかります。

なおワイルドカードを使用したユーザー名(`test`@`%` など)は有効なままとなっています。 

さらに、現在の最新版8.0.19ではPartial Revokes機能を有効化すると、これまで可能であったGRANT文でのワイルドカードによるスキーマの指定も無効となります。
こちらで報告されています。

どのような動作になるのか確認してみます。
test%(testa,testb,testc)スキーマに対してSELECT権限を持ったuser2@localhostが存在しています。

Partial Revokesを設定ファイルで有効化してから再起動してuser2@localhostでログインします。

SHOW GRANTS;で確認できる権限は変更されていませんが、test%に対する権限がなくなっていること、つまりワイルドカードによるスキーマの指定が無効となっていることがわかります。

ワイルドカードでスキーマを指定している場合は、Partial Revokes機能を有効化する際には注意してください。

Partial Revokes機能の無効化

Partial Revokesを無効化するには、Partial Revokes機能が使われていないことが条件となります。
権限が制限されているユーザーがいる場合は、動的に変更しようとするとエラーとなります。

Partial Revokes機能を無効化したい場合は、前項の[Partial Revokesによる制限の取り消し]で説明した方法で制限を取り消すか、Partial Revokesが使用されているユーザーを削除してください。

また、権限が制限されているユーザーがいる状態では明示的にpartial_revokes=ONとしていなくても自動で有効化され起動します。
このとき、エラーログには以下の内容が出力されます。

2020-03-18T05:46:27.092983Z 0 [Warning] [MY-013368] [Server] At least one partial revoke exists on a database. Turning ON the system variable ‘@@partial_revokes’.

マニュアルでも以下のように説明されています。

For attempts to disable partial_revokes at startup, the server logs an error message and enables partial_revokes.

引用元 : MySQL :: MySQL 8.0 Reference Manual :: 6.2.12 Privilege Restriction Using Partial Revokes
また、設定ファイルで明示的にpartial_revokes=OFFと設定した場合も、同様に自動でPartial Revokes機能を有効化して起動します。

自動で有効化された際の挙動について

前項で説明した通り、Partial Revokes機能を使用したユーザーがいる状態で明示的にPartial Revokes機能を有効化していない場合は、サーバーは自動でPartial Revokes機能を有効化して起動します。
このときpartial_revokesの値を確認するとOFFと表示されてしまいます。

しかし、実際にはサーバーは機能が有効化された状態として動作するようなので注意が必要です。
user1には制限された権限が付与されていて、実際にその制限が機能していることが確認できます。

権限のレベル

GRANTで付与が可能なレベルは権限によって異なりましたが、Partial Revokesはスキーマレベルでしか行えません。
特定のテーブルやカラムの権限を制限することはできません。

ただし、制限されたスキーマの特定のテーブル対して権限を付与することは可能です。

user1でログインするとworldスキーマのテーブルは権限をもつcityテーブルのみ確認できます。

まとめ

これまでも特定のスキーマを除いて権限を付与することは、GRANTを駆使すればできていたことですが、スキーマ数によっては大変な手間がかかっていました。Partial Revokes機能を待ち望んでいた人もいたのではないでしょうか。
一方で、ワイルドカードが使用できなかったり、スキーマレベル以外では使用できなかったりとやや物足りない面もあります。
[使用例]でも紹介した通り、Partial Revokes機能は長短ありますので、使用する環境に合わせて利用を検討してはいかがでしょうか。


MySQL

 

Return Top