この記事では、MySQL8関連の特権システムの新機能であるロールについて説明します。それでは、役割について話しましょう。この記事は完全に役割に専念しています。
他のユーザーは複雑な権限を持っている可能性があります。この一般的な例は、レポートに使用されるユーザーです。このユーザーはデータを書き込む必要はありませんが、すべてのデータを読み取る必要がない可能性もあります。いくつかの特定のテーブルまたは列にのみ使用できるか、特定のビューのセットへのアクセスを選択することしかできない可能性が非常に高いです。
これらの特権はすぐに加算され、非常に長いユーザー定義になってしまう可能性があります。定義は使用しません。また、助成金が増えると、間違いが増える可能性があります。 MySQL 8では、これらの特権セットをロールとして定義でき、基本的なMySQL特権の代わりにロールをユーザーに付与できます。役割は、ユーザーに付与する特権の集まりです。
create userコマンドで作成された新しいユーザーと同じように、以下に説明するようにロールを作成するために使用します。
CREATE ROLE 'reportrole';
以下のクエリのように、一度に複数の役割を作成できます。
CREATE ROLE 'app_ro', 'app_w', 'app_dev';
create roleコマンドで作成された新しいロールには、権限が関連付けられていません。通常のユーザーであるため、このロールに権限を付与できます。
以下の例では、COMPANYデータベース内のすべてのテーブルに対する選択権限を、上記で作成したreportroleロールに付与します。
GRANT SELECT ON company.* to repotrole;
アスタリスク(*)は、会社のデータベース内のすべてのテーブルを表します。
MySQLユーザーに役割を付与できます。以下の例では、ローカルホストユーザーに「company_ro」を作成しています。
CREATE USER IF NOT EXISTS 'company_ro'@'localhost' IDENTIFIED WITH mysql_native_password BY 'company_pass' WITH MAX_QUERIES_PER_HOUR 500 MAX_UPDATES_PER_HOUR 100;
ユーザーは単なるユーザー名ではなく、MySQLのホストのユーザーであることに注意してください。その後、以下に示すように、ユーザーにrepotroleを付与することで、repotroleの役割を付与できます。
GRANT 'repotrole' to 'company_ro'@'localhost';
MySQLの現在の役割機能は、現在のユーザーがどの役割を持っているかを判断するのに役立ちます。
mysql> select current_role(); +----------------+ | current_role() | +----------------+ | NONE | +----------------+
ロールの特権は積み重なっていきます。つまり、ユーザーは、基本特権とそのロールの連合によって記述された特権を持ちます。ユーザーに役割が付与されている場合、デフォルトではアクティブ化されていないことが非常に重要です。この後者については、このセクションの最後で説明します。
必須の役割の定義
必須の役割は、デフォルトですべてのユーザーによって関連付けられる役割であり、必須の変数によって制御されます。
SET PERSIST required_roles =‘role1、role2';
mysql> SET PERSIST required_roles =’dbt3_read23’;
明示的に付与された役割などの必須の役割は、アクティブ化されるまで有効になりません。この投稿の後半で、役割をアクティブ化する方法を説明します。
実践の役割
これを実際に実行してみましょう。ロールを作成して複数のユーザーに割り当て、会社のデータベースのすべてのテーブルに特権を追加し、次に示すようにsysテーブルに別のselect特権を追加します。
mysql> create role 'repotrole';
したがって、レポートユーザーに特権を付与します。
mysql> grant select on company.* to 'repotrole'; mysql> grant select on sys.version to 'repotrole';
異なるパスワードを使用して、ローカルホストのuser1とローカルホストのuser2をユーザーに作成しましょう
mysql> create user 'user1'@'localhost' identified by 'foo'; mysql> create user 'user2'@'localhost' identified by 'bar'; mysql> grant 'repotrole' to 'user1'@'localhost'; mysql> grant 'repotrole' to 'user2'@'localhost';
それらが作成され、それらにrepotroleの役割が割り当てられてから、それらがrepotroleの役割を持っているかどうかをshowgrantsで確認します。
mysql> show grants for 'user1'@'localhost'; +----------------------------------------------+ | Grants for [email protected] | +----------------------------------------------+ | GRANT USAGE ON *.* TO `user1`@`localhost` | | GRANT `repotrole`@`%` TO `user1`@`localhost` | +----------------------------------------------+ mysql> show grants for 'user2'@'localhost'; +----------------------------------------------+ | Grants for [email protected] | +----------------------------------------------+ | GRANT USAGE ON *.* TO `user2`@`localhost` | | GRANT `repotrole`@`%` TO `user2`@`localhost` | +----------------------------------------------+
これにより、repotroleロールを作成したばかりの両方のユーザーの両方の特権を詳しく説明する代わりに、そのロールによって、作成した両方の新しいユーザーに両方の特権が追加されました。
pt-show-grantsでもユーザーを確認してください。
User1
[[email protected] ~]# pt-show-grants | grep user1 -- Grants for 'dbt3_user1'@'%' CREATE USER IF NOT EXISTS 'dbt3_user1'@'%'; ALTER USER 'dbt3_user1'@'%' IDENTIFIED WITH 'mysql_native_password' AS '*2470C0C06DEE42FD1618BB99005ADCA2EC9D1E19' REQUIRE NONE PASSWORD EXPIRE DEFAULT ACCOUNT UNLOCK PASSWORD HISTORY DEFAULT PASSWORD REUSE INTERVAL DEFAULT PASSWORD REQUIRE CURRENT DEFAULT; GRANT USAGE ON *.* TO `dbt3_user1`@`%`; GRANT `dbt3_reader`@`%` TO `dbt3_user1`@`%`; -- Grants for 'user1'@'localhost' CREATE USER IF NOT EXISTS 'user1'@'localhost'; ALTER USER 'user1'@'localhost' IDENTIFIED WITH 'mysql_native_password' AS '*F3A2A51A9B0F2BE2468926B4132313728C250DBF' REQUIRE NONE PASSWORD EXPIRE DEFAULT ACCOUNT UNLOCK PASSWORD HISTORY DEFAULT PASSWORD REUSE INTERVAL DEFAULT PASSWORD REQUIRE CURRENT DEFAULT; GRANT USAGE ON *.* TO `user1`@`localhost`; GRANT `repotrole`@`%` TO `user1`@`localhost`;
User2
[[email protected] ~]# pt-show-grants | grep user2 -- Grants for 'dbt3_user2'@'%' CREATE USER IF NOT EXISTS 'dbt3_user2'@'%'; ALTER USER 'dbt3_user2'@'%' IDENTIFIED WITH 'mysql_native_password' AS '*2470C0C06DEE42FD1618BB99005ADCA2EC9D1E19' DEFAULT ROLE `dbt3_read23`@`%` REQUIRE NONE PASSWORD EXPIRE DEFAULT ACCOUNT UNLOCK PASSWORD HISTORY DEFAULT PASSWORD REUSE INTERVAL DEFAULT PASSWORD REQUIRE CURRENT DEFAULT; GRANT USAGE ON *.* TO `dbt3_user2`@`%`; -- Grants for 'user2'@'localhost' CREATE USER IF NOT EXISTS 'user2'@'localhost'; ALTER USER 'user2'@'localhost' IDENTIFIED WITH 'mysql_native_password' AS '*E8D46CE25265E545D225A8A6F1BAF642FEBEE5CB' REQUIRE NONE PASSWORD EXPIRE DEFAULT ACCOUNT UNLOCK PASSWORD HISTORY DEFAULT PASSWORD REUSE INTERVAL DEFAULT PASSWORD REQUIRE CURRENT DEFAULT; GRANT USAGE ON *.* TO `user2`@`localhost`; GRANT `repotrole`@`%` TO `user2`@`localhost`;
したがって、pt-show-grantsは、両方のユーザーのrepotroleの役割を示します。
pt-show-grantsの使用方法を知りたい場合は、以下のリンクを使用してください
Centos7にPerconaToolkitをインストールして使用する
MySQLクライアントをもう一度起動して、今度はcomp1ユーザーにrepotroleロールを付与しましょう。
mysql> grant 'repotrole' to 'comp1'@'localhost';
MySQLクライアントとLogancomp1ユーザーを終了し、コマンドラインでユーザー名とパスワードを指定するだけです。
実稼働システムのコマンドラインでパスワードを指定することは、履歴に記録されるため、お勧めできません。 showgrantsで権限を確認しましょう。
mysql> show grants; +----------------------------------------------------------------+ | Grants for [email protected] | +----------------------------------------------------------------+ | GRANT USAGE ON *.* TO `comp1`@`localhost` | | GRANT `dbt3_read23`@`%`,`repotrole`@`%` TO `comp1`@`localhost` |
したがって、ユーザーにはrepotroleの役割がありますが、その特権はまだアクティブ化されていません。この役割はPERSIST必須_役割として設定されているため、「dbt3_read23」役割がすでに存在していることがわかります。 、新しいユーザーを作成すると、この役割が自動的に割り当てられます。
ロールのアクティブ化
set role repotroleを使用してロールをアクティブ化してから、showgrantsを確認できます。
mysql> set role 'repotrole'; Query OK, 0 rows affected (0.00 sec) mysql> show grants; +----------------------------------------------------------------+ | Grants for [email protected] | +----------------------------------------------------------------+ | GRANT USAGE ON *.* TO `comp1`@`localhost` | | GRANT SELECT ON `company`.* TO `comp1`@`localhost` | | GRANT SELECT ON `sys`.`version` TO `comp1`@`localhost` | | GRANT `dbt3_read23`@`%`,`repotrole`@`%` TO `comp1`@`localhost` | +----------------------------------------------------------------+
comp1ユーザーがすでにすべての会社のテーブルに対する特権を持っていることがわかります。これが、この演習でこのユーザーに役割を付与した理由ですが、repotroleの役割はシステムバージョンテーブルに新しい特権を追加します。
デフォルトの役割に戻し、権限を再度確認できます。
mysql> set role none; Query OK, 0 rows affected (0.00 sec) mysql> show grants; +----------------------------------------------------------------+ | Grants for [email protected] | +----------------------------------------------------------------+ | GRANT USAGE ON *.* TO `comp1`@`localhost` | | GRANT `dbt3_read23`@`%`,`repotrole`@`%` TO `comp1`@`localhost` | +----------------------------------------------------------------+ This time the user kept the dbt3_read23 role because it had it as base privileges but it won't have the privilege to sys.version table that version anymore because that came from the role.