第102回ではMySQL 8.0の新機能のROLEについて、ROLEの概要や作成方法を確認していきました。今回は、ROLEのオプションであるmandatory_rolesやactivate_all_roles_on_loginと、運用時にできるようになることを紹介します。
mandatory_roles
mandatory_rolesは文字通り、必須とするROLEのことです。このmandatory_rolesを設定することで、全ユーザーに指定したROLEが付与されます。mandatory_rolesはmy.cnfにて設定するか、SET GLOBALまたはSET PERSISTを用いて設定することができます。複数のROLEを設定する場合はカンマ区切りで指定します。
またmandatory_rolesに設定されているROLEは削除したり、ユーザーから権限を剥奪することはできません。
activate_all_roles_on_login
activate_all_roles_on_loginは、ユーザーがログインしたときに付与されているROLEをすべて自動で有効にするオプションです。デフォルトではOFFになっており、有効にする場合はmy.cnfに記述する、またはSET構文を用いて有効にする必要があります。
もし、個別のユーザーにSET DEFAULT ROLE構文を用いてデフォルトのROLEを指定している場合でも、activate_all_roles_on_loginがONの場合は優先的に設定されます。activate_all_roles_on_loginで有効にするROLEの対象は、GRANT構文を用いて付与したROLEとmandatory_rolesで定義されているROLEが対象となります。設定値の確認はSHOW VARIABLES構文を用いて確認することができます。
ROLEまわりの実行権限
MySQL 8.0.17現在ではROLEに関する権限はCREATE ROLE、DROP ROLE、ROLE_ADMINの3つが存在します。それぞれの権限は以下の通りです。
権限名 |
内容 |
CREATE ROLE |
CREATE ROLE構文でROLEを作成する権限 |
DROP ROLE |
DROP ROLE構文でROLEを削除する権限 |
ROLE_ADMIN |
GRANT構文によるROLEの付与、取り消しとmandatory_rolesの設定権限 |
もし、権限がない状態でROLEを作成しようとすると下記のようなエラーになります。
ただし、mysqlデータベースに書き込み権限がある場合は直接role_edgesテーブルを書き込めてしまうので、注意が必要です。もし、ROLE関連の実行権限を付与しない場合は、あわせてmysqlデータベースのROLE関連のテーブルにも読み書きできない状態であることを確認しましょう。
ROLEの運用
ROLEを運用していくうえでできるようになることを確認していきます。
新たなユーザーへのROLEの付与
MySQL 5.7ではMySQLでは新しいユーザーを作成するときはCREATE USER構文でユーザーを作成し、GRANT構文で権限を付与するという運用をしていたと思います。
MySQL 8.0では、CREATE USER構文でDEFAULT ROLEを指定することができるようになりました。そのため、ユーザー作成時に必要なROLEを指定してユーザー作成時にROLEも付与することが可能になりました。
ROLEの継承について
ROLEに別のROLEを付与することで、付与したROLEを継承することができます。これを用いることでスキーマ単位や読み書き単位でROLEを作成し、組み合わせて利用することが可能です。ただし、細かく分けすぎてしまうとROLEそのものの数が多くなってしまい管理が大変になってしまいます。ROLEを導入する際は、どのような運用方法にしていくかを十分に検討する必要があります。
defaultのROLEの確認
接続したユーザーがデフォルトでどのようなROLEが付与されるかは、mysqlデータベースのdefault_rolesで確認することができます。もし、各ユーザーデフォルトで設定されるROLEを確認したい場合は、default_rolesテーブルを見ましょう。
まとめ
第102回、第104回で、MySQL 8.0で新たに加わったROLEの機能説明と運用時にできるようになることを紹介しました。ROLEは権限を管理する上で大変便利である反面、数が多いと管理が大変になってしまう恐れがあります。導入を検討する際は、運用方法を決定して導入していきましょう。