重要
このページは英語版のページを機械翻訳しています。原文はこちらからご覧ください。

ロールベースのアクセス制御

TiDBの役割ベースのアクセス制御(RBAC)システムの実装は、MySQL8.0の実装と似ています。 TiDBは、MySQLのほとんどのRBAC構文と互換性があります。

このドキュメントでは、TiDBRBAC関連の操作と実装を紹介します。

RBAC操作

ロールは、一連の特権のコレクションです。次の操作を実行できます。

  • 役割を作成します。
  • ロールを削除します。
  • ロールに特権を付与します。
  • 別のユーザーに役割を付与します。そのユーザーは、役割を有効にした後、その役割に関連する特権を取得できます。

役割を作成する

たとえば、次のステートメントを使用して、ロールapp_developer 、およびapp_readを作成できapp_write

CREATE ROLE 'app_developer', 'app_read', 'app_write';

ロールの命名形式とルールについては、 TiDBユーザーアカウント管理を参照してください。

ロールはmysql.userテーブルに格納され、ロール名のホスト名部分(省略されている場合)のデフォルトは'%'です。作成しようとしているロールの名前は一意である必要があります。それ以外の場合は、エラーが報告されます。

ロールを作成するには、 CREATE ROLEまたはCREATE USERの特権が必要です。

役割に特権を付与する

ロールに特権を付与する操作は、ユーザーに特権を付与する操作と同じです。詳細については、 TiDB権限管理を参照してください。

たとえば、次のステートメントを使用して、 app_readの役割にapp_dbのデータベースを読み取る特権を付与できます。

GRANT SELECT ON app_db.* TO 'app_read'@'%';

次のステートメントを使用して、 app_writeの役割にapp_dbのデータベースにデータを書き込む特権を付与できます。

GRANT INSERT, UPDATE, DELETE ON app_db.* TO 'app_write'@'%';;

次のステートメントを使用して、 app_developerの役割にapp_dbのデータベースに対するすべての特権を付与できます。

GRANT ALL ON app_db.* TO 'app_developer';

ユーザーに役割を付与する

ユーザーdev1app_dbのすべての特権を持つ開発者の役割を持っていると仮定します。 2人のユーザーread_user1read_user2は、 app_dbに対する読み取り専用特権を持っています。そして、ユーザrw_user1は、 app_dbに対する読み取りおよび書き込み特権を有する。

CREATE USERを使用してユーザーを作成します。

CREATE USER 'dev1'@'localhost' IDENTIFIED BY 'dev1pass';
CREATE USER 'read_user1'@'localhost' IDENTIFIED BY 'read_user1pass';
CREATE USER 'read_user2'@'localhost' IDENTIFIED BY 'read_user2pass';
CREATE USER 'rw_user1'@'localhost' IDENTIFIED BY 'rw_user1pass';

次に、 GRANTを使用してユーザーに役割を付与します

GRANT 'app_developer' TO 'dev1'@'localhost';
GRANT 'app_read' TO 'read_user1'@'localhost', 'read_user2'@'localhost';
GRANT 'app_read', 'app_write' TO 'rw_user1'@'localhost';

別のユーザーに役割を付与したり、役割を取り消したりするには、 SUPERの特権が必要です。

ユーザーに役割を付与することは、その役割をすぐに有効にすることを意味するわけではありません。ロールを有効にすることは別の操作です。

次の操作は「関係ループ」を形成する可能性があります。

CREATE USER 'u1', 'u2';
CREATE ROLE 'r1', 'r2';

GRANT 'u1' TO 'u1';
GRANT 'r1' TO 'r1';

GRANT 'r2' TO 'u2';
GRANT 'u2' TO 'r2';

TiDBは、このマルチレベルの認証関係をサポートしています。これを使用して、特権の継承を実装できます。

ロールの権限を確認してください

SHOW GRANTSステートメントを使用して、ユーザーに付与されている特権を確認できます。

別のユーザーの特権関連情報を確認するには、 mysqlのデータベースでSELECTの特権が必要です。

SHOW GRANTS FOR 'dev1'@'localhost';
+-------------------------------------------------+
| Grants for dev1@localhost                       |
+-------------------------------------------------+
| GRANT USAGE ON *.* TO `dev1`@`localhost`        |
| GRANT `app_developer`@`%` TO `dev1`@`localhost` |
+-------------------------------------------------+

SHOW GRANTSUSINGオプションを使用して、役割の特権を確認できます。

SHOW GRANTS FOR 'dev1'@'localhost' USING 'app_developer';
+----------------------------------------------------------+
| Grants for dev1@localhost                                |
+----------------------------------------------------------+
| GRANT USAGE ON *.* TO `dev1`@`localhost`                 |
| GRANT ALL PRIVILEGES ON `app_db`.* TO `dev1`@`localhost` |
| GRANT `app_developer`@`%` TO `dev1`@`localhost`          |
+----------------------------------------------------------+
SHOW GRANTS FOR 'rw_user1'@'localhost' USING 'app_read', 'app_write';
+------------------------------------------------------------------------------+
| Grants for rw_user1@localhost                                                |
+------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO `rw_user1`@`localhost`                                 |
| GRANT SELECT, INSERT, UPDATE, DELETE ON `app_db`.* TO `rw_user1`@`localhost` |
| GRANT `app_read`@`%`,`app_write`@`%` TO `rw_user1`@`localhost`               |
+------------------------------------------------------------------------------+
SHOW GRANTS FOR 'read_user1'@'localhost' USING 'app_read';
+--------------------------------------------------------+
| Grants for read_user1@localhost                        |
+--------------------------------------------------------+
| GRANT USAGE ON *.* TO `read_user1`@`localhost`         |
| GRANT SELECT ON `app_db`.* TO `read_user1`@`localhost` |
| GRANT `app_read`@`%` TO `read_user1`@`localhost`       |
+--------------------------------------------------------+

SHOW GRANTSまたはSHOW GRANTS FOR CURRENT_USER()を使用して、現在のユーザーの特権を確認できます。 SHOW GRANTSSHOW GRANTS FOR CURRENT_USER()は、次の点で異なります。

  • SHOW GRANTSは、現在のユーザーに対して有効になっているロールの特権を示します。
  • SHOW GRANTS FOR CURRENT_USER()は、有効なロールの特権を示しません。

デフォルトの役割を設定する

ロールがユーザーに付与された後、すぐには有効になりません。ユーザーがこのロールを有効にした後でのみ、ユーザーはロールが所有する特権を使用できます。

ユーザーのデフォルトの役割を設定できます。ユーザーがログインすると、デフォルトの役割が自動的に有効になります。

SET DEFAULT ROLE
    {NONE | ALL | role [, role ] ...}
    TO user [, user ]

たとえば、次のステートメントを使用して、デフォルトの役割をrw_user1@localhostからapp_readおよびapp_writeに設定できます。

SET DEFAULT ROLE app_read, app_write TO 'rw_user1'@'localhost';

次のステートメントを使用して、デフォルトの役割dev1@localhostをすべての役割に設定できます。

SET DEFAULT ROLE ALL TO 'dev1'@'localhost';

次のステートメントを使用して、 dev1@localhostのすべてのデフォルトの役割を無効にすることができます。

SET DEFAULT ROLE NONE TO 'dev1'@'localhost';

ノート:

デフォルトの役割をこの役割に設定する前に、ユーザーに役割を付与する必要があります。

現在のセッションで役割を有効にする

現在のセッションでいくつかの役割を有効にすることができます。

SET ROLE {
    DEFAULT
  | NONE
  | ALL
  | ALL EXCEPT role [, role ] ...
  | role [, role ] ...
}

たとえば、 rw_user1がログインした後、次のステートメントを使用して、現在のセッションでのみ有効なロールapp_readapp_writeを有効にできます。

SET ROLE 'app_read', 'app_write';

次のステートメントを使用して、現在のユーザーのデフォルトの役割を有効にすることができます。

SET ROLE DEFAULT

次のステートメントを使用して、現在のユーザーに付与されているすべてのロールを有効にすることができます。

SET ROLE ALL

次のステートメントを使用して、すべての役割を無効にすることができます。

SET ROLE NONE

次のステートメントを使用して、 app_read以外の役割を有効にできます。

SET ROLE ALL EXCEPT 'app_read'

ノート:

SET ROLEを使用して役割を有効にする場合、この役割は現在のセッションでのみ有効です。

現在有効な役割を確認してください

現在のユーザーは、 CURRENT_ROLE()機能を使用して、現在のユーザーによって有効にされている役割を確認できます。

たとえば、デフォルトの役割をrw_user1'@'localhostに付与できます。

SET DEFAULT ROLE ALL TO 'rw_user1'@'localhost';

rw_user1@localhostログインした後、次のステートメントを実行できます。

SELECT CURRENT_ROLE();
+--------------------------------+
| CURRENT_ROLE()                 |
+--------------------------------+
| `app_read`@`%`,`app_write`@`%` |
+--------------------------------+
SET ROLE 'app_read'; SELECT CURRENT_ROLE();
+----------------+
| CURRENT_ROLE() |
+----------------+
| `app_read`@`%` |
+----------------+

役割を取り消す

次のステートメントを使用して、ユーザーread_user1@localhostおよびread_user2@localhostに付与されたapp_readの役割を取り消すことができます。

REVOKE 'app_read' FROM 'read_user1'@'localhost', 'read_user2'@'localhost';

次のステートメントを使用して、 rw_user1@localhostのユーザーに付与されたロールapp_readおよびapp_writeを取り消すことができます。

REVOKE 'app_read', 'app_write' FROM 'rw_user1'@'localhost';

ユーザーからロールを取り消す操作はアトミックです。ロールの取り消しに失敗した場合、この操作はロールバックされます。

特権を取り消す

REVOKEステートメントはGRANTと逆になります。 REVOKEを使用して、 app_writeの特権を取り消すことができます。

REVOKE INSERT, UPDATE, DELETE ON app_db.* FROM 'app_write';

詳細については、 TiDB権限管理を参照してください。

役割を削除する

次のステートメントを使用して、役割app_readおよびapp_writeを削除できます。

DROP ROLE 'app_read', 'app_write';

この操作により、 mysql.user表のapp_readapp_writeの役割レコードと許可表の関連レコードが削除され、2つの役割に関連する許可が終了します。

ロールを削除するには、 DROP ROLEまたはDROP USERの権限が必要です。

承認テーブル

4つのシステム特権テーブルに加えて、RBACシステムは2つの新しいシステム特権テーブルを導入します。

  • mysql.role_edges :ロールとユーザーの承認関係を記録します。
  • mysql.default_roles :各ユーザーのデフォルトの役割を記録します。

mysql.role_edges

mysql.role_edgesには次のデータが含まれます。

SELECT * FROM mysql.role_edges;
+-----------+-----------+---------+---------+-------------------+
| FROM_HOST | FROM_USER | TO_HOST | TO_USER | WITH_ADMIN_OPTION |
+-----------+-----------+---------+---------+-------------------+
| %         | r_1       | %       | u_1     | N                 |
+-----------+-----------+---------+---------+-------------------+
1 row in set (0.00 sec)
  • FROM_HOSTFROM_USERは、それぞれロールのホスト名とユーザー名を示します。
  • TO_HOSTTO_USERは、ロールが付与されているユーザーのホスト名とユーザー名を示します。

mysql.default_roles

mysql.default_rolesは、各ユーザーに対してデフォルトで有効になっている役割を示します。

SELECT * FROM mysql.default_roles;
+------+------+-------------------+-------------------+
| HOST | USER | DEFAULT_ROLE_HOST | DEFAULT_ROLE_USER |
+------+------+-------------------+-------------------+
| %    | u_1  | %                 | r_1               |
| %    | u_1  | %                 | r_2               |
+------+------+-------------------+-------------------+
2 rows in set (0.00 sec)
  • HOSTUSERは、それぞれユーザーのホスト名とユーザー名を示します。
  • DEFAULT_ROLE_HOSTDEFAULT_ROLE_USERは、それぞれデフォルトの役割のホスト名とユーザー名を示します。

参考文献

RBAC、ユーザー管理、および特権管理は密接に関連しているため、次のリソースで操作の詳細を参照できます。