権限管理
TiDBは、 MySQL 5.7の権限管理システム(構文と権限タイプを含む)をサポートしています。また、MySQL 8.0の以下の機能もサポートされています。
- TiDB 3.0 以降の SQL ロール。
- 動的権限(TiDB 5.1 以降)。
このドキュメントでは、権限関連の TiDB 操作、TiDB 操作に必要な権限、および権限システムの実装について説明します。
特権関連の操作
権限を付与する
GRANTステートメントは、ユーザー アカウントに権限を付与します。
たとえば、次のステートメントを使用して、 xxxユーザーにtestデータベースを読み取る権限を付与します。
GRANT SELECT ON test.* TO 'xxx'@'%';
次のステートメントを使用して、 xxxユーザーにすべてのデータベースに対するすべての権限を付与します。
GRANT ALL PRIVILEGES ON *.* TO 'xxx'@'%';
デフォルトでは、指定されたユーザーが存在しない場合、 GRANTステートメントはエラーを返します。この動作は、 SQLモード NO_AUTO_CREATE_USERが指定されているかどうかによって異なります。
SET sql_mode=DEFAULT;
Query OK, 0 rows affected (0.00 sec)
SELECT @@sql_mode;
+-------------------------------------------------------------------------------------------------------------------------------------------+
| @@sql_mode |
+-------------------------------------------------------------------------------------------------------------------------------------------+
| ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |
+-------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
SELECT * FROM mysql.user WHERE user='idontexist';
Empty set (0.00 sec)
GRANT ALL PRIVILEGES ON test.* TO 'idontexist';
ERROR 1105 (HY000): You are not allowed to create a user with GRANT
SELECT user,host,authentication_string FROM mysql.user WHERE user='idontexist';
Empty set (0.00 sec)
以下の例では、SQLモードNO_AUTO_CREATE_USER設定されていないため、ユーザーidontexist空のパスワードで自動的に作成されます。これはセキュリティリスクを伴うため推奨されません。ユーザー名のスペルミスにより、空のパスワードで新規ユーザーが作成されます。
SET @@sql_mode='ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';
Query OK, 0 rows affected (0.00 sec)
SELECT @@sql_mode;
+-----------------------------------------------------------------------------------------------------------------------+
| @@sql_mode |
+-----------------------------------------------------------------------------------------------------------------------+
| ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION |
+-----------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
SELECT * FROM mysql.user WHERE user='idontexist';
Empty set (0.00 sec)
GRANT ALL PRIVILEGES ON test.* TO 'idontexist';
Query OK, 1 row affected (0.05 sec)
SELECT user,host,authentication_string FROM mysql.user WHERE user='idontexist';
+------------+------+-----------------------+
| user | host | authentication_string |
+------------+------+-----------------------+
| idontexist | % | |
+------------+------+-----------------------+
1 row in set (0.01 sec)
GRANTのあいまい一致を使用して、データベースに権限を付与できます。
GRANT ALL PRIVILEGES ON `te%`.* TO genius;
Query OK, 0 rows affected (0.00 sec)
SELECT user,host,db FROM mysql.db WHERE user='genius';
+--------|------|-----+
| user | host | db |
+--------|------|-----+
| genius | % | te% |
+--------|------|-----+
1 row in set (0.00 sec)
この例では、 te%の%により、 teで始まるすべてのデータベースに権限が付与されます。
権限を取り消す
REVOKEステートメントにより、システム管理者はユーザー アカウントから権限を取り消すことができます。
REVOKEステートメントはGRANTステートメントに対応しています。
REVOKE ALL PRIVILEGES ON `test`.* FROM 'genius'@'localhost';
注記:
権限を取り消すには、完全に一致する文字列が必要です。一致する結果が見つからない場合は、エラーが表示されます。
REVOKE ALL PRIVILEGES ON `te%`.* FROM 'genius'@'%';
ERROR 1141 (42000): There is no such grant defined for user 'genius' on host '%'
あいまい一致、エスケープ、文字列、識別子について:
GRANT ALL PRIVILEGES ON `te\%`.* TO 'genius'@'localhost';
Query OK, 0 rows affected (0.00 sec)
この例では、完全一致を使用してte%という名前のデータベースを検索します。3 %エスケープ文字\使用されているため、 %ワイルドカードとして認識されないことに注意してください。
文字列は一重引用符('')で囲みますが、識別子はバッククォート(``)で囲みます。以下の違いをご確認ください。
GRANT ALL PRIVILEGES ON 'test'.* TO 'genius'@'localhost';
ERROR 1064 (42000): You have an error in your SQL syntax; check the
manual that corresponds to your MySQL server version for the right
syntax to use near ''test'.* to 'genius'@'localhost'' at line 1
GRANT ALL PRIVILEGES ON `test`.* TO 'genius'@'localhost';
Query OK, 0 rows affected (0.00 sec)
テーブル名に特別なキーワードを使用する場合は、それらをバッククォート (``) で囲みます。例:
CREATE TABLE `select` (id int);
Query OK, 0 rows affected (0.27 sec)
ユーザーに付与された権限を確認する
SHOW GRANTSステートメントを使用すると、ユーザーに付与されている権限を確認できます。例:
SHOW GRANTS; -- show grants for the current user
+-------------------------------------------------------------+
| Grants for User |
+-------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION |
+-------------------------------------------------------------+
SHOW GRANTS FOR 'root'@'%'; -- show grants for a specific user
たとえば、ユーザーrw_user@192.168.%を作成し、そのユーザーにtest.write_tableテーブルへの書き込み権限とグローバル読み取り権限を付与します。
CREATE USER `rw_user`@`192.168.%`;
GRANT SELECT ON *.* TO `rw_user`@`192.168.%`;
GRANT INSERT, UPDATE ON `test`.`write_table` TO `rw_user`@`192.168.%`;
rw_user@192.168.%のユーザーに付与された権限を表示します:
SHOW GRANTS FOR `rw_user`@`192.168.%`;
+------------------------------------------------------------------+
| Grants for rw_user@192.168.% |
+------------------------------------------------------------------+
| GRANT Select ON *.* TO 'rw_user'@'192.168.%' |
| GRANT Insert,Update ON test.write_table TO 'rw_user'@'192.168.%' |
+------------------------------------------------------------------+
動的権限
TiDB v5.1以降、MySQL 8.0から導入された動的権限がサポートされています。動的権限は、特定の操作に対するよりきめ細かなアクセス制御を実装することで、 SUPER権限を置き換えることを目的としています。例えば、動的権限を使用することで、システム管理者はBACKUPとRESTORE操作のみを実行できるユーザーアカウントを作成できます。
動的権限には次のものが含まれます。
BACKUP_ADMINRESTORE_ADMINSYSTEM_USERSYSTEM_VARIABLES_ADMINROLE_ADMINCONNECTION_ADMINPLACEMENT_ADMINの場合、権限所有者は配置ポリシーを作成、変更、削除できます。DASHBOARD_CLIENT権限所有者が TiDB ダッシュボードにログインすることを許可します。RESTRICTED_TABLES_ADMIN、SEM が有効な場合に権限所有者がシステム テーブルを表示できるようにします。RESTRICTED_STATUS_ADMIN、SEM が有効な場合に、権限所有者がSHOW [GLOBAL|SESSION] STATUSのすべてのステータス変数を表示できるようにします。RESTRICTED_VARIABLES_ADMIN場合、SEM が有効なときに権限所有者はすべてのシステム変数を表示できます。RESTRICTED_USER_ADMIN、SEM が有効な場合に、特権所有者のアクセスが SUPER ユーザーによって取り消されることを禁止します。RESTRICTED_CONNECTION_ADMIN場合、権限所有者はRESTRICTED_USER_ADMINユーザーの接続を切断できます。この権限はKILLとKILL TIDBステートメントに影響します。RESTRICTED_REPLICA_WRITER_ADMINでは、TiDB クラスタで読み取り専用モードが有効になっている場合でも、権限所有者は影響を受けずに書き込みまたは更新操作を実行できます。詳細については、tidb_restricted_read_only参照してください。
動的権限の全セットを確認するには、 SHOW PRIVILEGESステートメントを実行してください。プラグインは新しい権限を追加できるため、割り当て可能な権限のリストはTiDBのインストール状況によって異なる場合があります。
SUPER特権
SUPER権限を持つユーザーは、ほぼすべての操作を実行できます。デフォルトでは、この権限はrootユーザーにのみ付与されます。他のユーザーにこの権限を付与する場合は注意してください。SUPER権限はMySQL 8.0で非推奨みなされ、よりきめ細かいアクセス制御を提供するために動的権限に置き換えることができます。
TiDB操作に必要な権限
TiDBユーザーの権限はINFORMATION_SCHEMA.USER_PRIVILEGESテーブルで確認できます。例:
SELECT * FROM INFORMATION_SCHEMA.USER_PRIVILEGES WHERE grantee = "'root'@'%'";
+------------+---------------+-------------------------+--------------+
| GRANTEE | TABLE_CATALOG | PRIVILEGE_TYPE | IS_GRANTABLE |
+------------+---------------+-------------------------+--------------+
| 'root'@'%' | def | Select | YES |
| 'root'@'%' | def | Insert | YES |
| 'root'@'%' | def | Update | YES |
| 'root'@'%' | def | Delete | YES |
| 'root'@'%' | def | Create | YES |
| 'root'@'%' | def | Drop | YES |
| 'root'@'%' | def | Process | YES |
| 'root'@'%' | def | References | YES |
| 'root'@'%' | def | Alter | YES |
| 'root'@'%' | def | Show Databases | YES |
| 'root'@'%' | def | Super | YES |
| 'root'@'%' | def | Execute | YES |
| 'root'@'%' | def | Index | YES |
| 'root'@'%' | def | Create User | YES |
| 'root'@'%' | def | Create Tablespace | YES |
| 'root'@'%' | def | Trigger | YES |
| 'root'@'%' | def | Create View | YES |
| 'root'@'%' | def | Show View | YES |
| 'root'@'%' | def | Create Role | YES |
| 'root'@'%' | def | Drop Role | YES |
| 'root'@'%' | def | CREATE TEMPORARY TABLES | YES |
| 'root'@'%' | def | LOCK TABLES | YES |
| 'root'@'%' | def | CREATE ROUTINE | YES |
| 'root'@'%' | def | ALTER ROUTINE | YES |
| 'root'@'%' | def | EVENT | YES |
| 'root'@'%' | def | SHUTDOWN | YES |
| 'root'@'%' | def | RELOAD | YES |
| 'root'@'%' | def | FILE | YES |
| 'root'@'%' | def | CONFIG | YES |
| 'root'@'%' | def | REPLICATION CLIENT | YES |
| 'root'@'%' | def | REPLICATION SLAVE | YES |
+------------+---------------+-------------------------+--------------+
31 rows in set (0.00 sec)
変更
- すべての
ALTERステートメントについて、ユーザーは対応するテーブルに対するALTER権限を持っている必要があります。 ALTER...DROPとALTER...RENAME TO以外のステートメントの場合、ユーザーは対応するテーブルに対してINSERTとCREATE権限を持っている必要があります。ALTER...DROPステートメントの場合、ユーザーは対応するテーブルに対するDROP権限を持っている必要があります。ALTER...RENAME TOステートメントの場合、ユーザーは名前変更前のテーブルに対してDROP権限を持っている必要があり、名前変更後のテーブルに対してCREATE権限とINSERT権限ている必要があります。
注記:
MySQL 5.7のドキュメントでは、テーブルに対して
ALTER操作を実行するには権限INSERTとCREATEが必要であると記載されています。しかし、 MySQL 5.7では実際には、この場合ALTER権限のみが必要です。現在、TiDBにおけるALTERの権限は、MySQLの実際の動作と一致しています。
バックアップ
SUPERまたはBACKUP_ADMIN権限が必要です。
インポートジョブをキャンセル
他のユーザーが作成したジョブをキャンセルするには、権限SUPER必要です。権限がない場合、現在のユーザーが作成したジョブのみをキャンセルできます。
データベースの作成
データベースに対してCREATE権限が必要です。
インデックスの作成
テーブルに対するINDEX権限が必要です。
テーブルの作成
テーブルに対するCREATE権限が必要です。
CREATE TABLE...LIKE...ステートメントを実行するには、テーブルに対するSELECT権限が必要です。
ビューを作成
CREATE VIEW権限が必要です。
注記:
現在のユーザーがビューを作成したユーザーでない場合は、権限
CREATE VIEWとSUPER両方が必要です。
データベースの削除
データベースに対してDROP権限が必要です。
インデックスの削除
テーブルに対するINDEX権限が必要です。
テーブルを削除する
テーブルに対するDROP権限が必要です。
インポート先
対象テーブルに対してSELECT 、 UPDATE 、 INSERT 、 DELETE 、 ALTER権限が必要です。TiDBにローカルに保存されているファイルをインポートするには、 FILE権限も必要です。
データをロード
テーブルに対するINSERT権限が必要です。 REPLACE INTO使用する場合は、 DELETE権限も必要です。
テーブルを切り捨てる
テーブルに対するDROP権限が必要です。
テーブル名の変更
名前を変更する前のテーブルに対してALTERとDROP権限が必要であり、名前を変更した後のテーブルに対してCREATEとINSERT権限が必要です。
テーブルを分析する
テーブルに対してINSERTおよびSELECT権限が必要です。
ロック統計
テーブルに対してINSERTおよびSELECT権限が必要です。
統計情報をアンロック
テーブルに対してINSERTおよびSELECT権限が必要です。
見せる
SHOW CREATE TABLE 、テーブルに対する単一の権限が必要です。
SHOW CREATE VIEWはSHOW VIEW権限が必要です。
SHOW GRANTS mysqlデータベースに対するSELECT権限を必要とします。対象ユーザーが現在のユーザーである場合、 SHOW GRANTS権限を必要としません。
SHOW PROCESSLIST他のユーザーに属する接続を表示するにはPROCESS権限が必要です。
SHOW IMPORT JOB 、他のユーザーの接続を表示するにはSUPER権限が必要です。権限がない場合は、現在のユーザーが作成したジョブのみが表示されます。
SHOW STATS_LOCKED mysql.stats_table_lockedテーブルに対するSELECT権限が必要です。
ロール/ユーザーの作成
CREATE ROLEはCREATE ROLE権限が必要です。
CREATE USERはCREATE USER権限が必要です。
ロール/ユーザーの削除
DROP ROLEはDROP ROLE権限が必要です。
DROP USERはCREATE USER権限が必要です。
ユーザーの変更
CREATE USER権限が必要です。
付与
GRANTによって付与される権限とともにGRANT権限が必要です。
ユーザーを暗黙的に作成するには、追加の権限がCREATE USER必要です。
GRANT ROLEはSUPERまたはROLE_ADMIN権限が必要です。
取り消す
GRANT権限とREVOKEステートメントの対象となる権限が必要です。
REVOKE ROLEはSUPERまたはROLE_ADMIN権限が必要です。
グローバル設定
グローバル変数を設定するには、 SUPERまたはSYSTEM_VARIABLES_ADMIN権限が必要です。
管理者
SUPER権限が必要です。
デフォルトロールの設定
SUPER権限が必要です。
殺す
他のユーザー セッションを終了するには、 SUPERまたはCONNECTION_ADMIN権限が必要です。
リソースグループの作成
SUPERまたはRESOURCE_GROUP_ADMIN権限が必要です。
リソースグループの変更
SUPERまたはRESOURCE_GROUP_ADMIN権限が必要です。
リソースグループの削除
SUPERまたはRESOURCE_GROUP_ADMIN権限が必要です。
リソースの調整
SUPERまたはRESOURCE_GROUP_ADMIN権限が必要です。
リソースグループの設定
システム変数tidb_resource_control_strict_mode ONに設定されている場合、このステートメントを実行するにはSUPER 、 RESOURCE_GROUP_ADMIN 、またはRESOURCE_GROUP_USER権限が必要です。
特権制度の導入
権限テーブル
次のmysqlシステムテーブル 、権限に関連するすべてのデータが格納されているため特別です。
mysql.user(ユーザーアカウント、グローバル権限)mysql.db(データベースレベルの権限)mysql.tables_priv(テーブルレベルの権限)mysql.columns_priv(列レベルの権限。現在はサポートされていません)
これらのテーブルには、データの有効範囲と権限情報が含まれています。例えば、テーブルmysql.userでは次のようになります。
SELECT User,Host,Select_priv,Insert_priv FROM mysql.user LIMIT 1;
+------|------|-------------|-------------+
| User | Host | Select_priv | Insert_priv |
+------|------|-------------|-------------+
| root | % | Y | Y |
+------|------|-------------|-------------+
1 row in set (0.00 sec)
このレコードでは、 HostとUser 、 rootユーザーが任意のホスト( % )から送信した接続要求を受け入れることができることを示しています。9とInsert_priv Select_privユーザーがグローバル権限SelectとInsert持っていることを意味します。17 mysql.userテーブルにおける有効範囲はグローバルです。
mysql.dbのHostとUser 、ユーザーがアクセスできるデータベースを決定します。有効範囲はデータベースです。
注記:
権限テーブルの更新は、
GRANT、CREATE USER、DROP USERなどの指定構文のみで行うことをお勧めします。基盤となる権限テーブルを直接編集しても権限キャッシュは自動的に更新されず、FLUSH PRIVILEGESが実行されるまで予期しない動作が発生します。
接続検証
クライアントが接続要求を送信すると、TiDBサーバーはログイン操作を検証します。TiDBサーバーはまずmysql.userテーブルをチェックします。3 UserとHostのレコードが接続要求と一致する場合、TiDBサーバーはauthentication_stringレコードを検証します。
ユーザーIDは、2つの情報に基づいています。1 Hostは接続を開始するホスト、もうUserはユーザー名です。ユーザー名が空でない場合、ユーザー名は必ず一致する必要があります。
User + Hostテーブルuserの複数の行に一致する可能性があります。このシナリオに対処するため、テーブルuserの行はソートされます。クライアントが接続すると、テーブルの行が1つずつチェックされ、最初に一致した行が検証に使用されます。ソートの際、Host は User よりも上位にランク付けされます。
確認をリクエストする
接続が成功すると、要求検証プロセスによって、操作に権限があるかどうかがチェックされます。
データベース関連のリクエスト( INSERT UPDATEの場合、リクエスト検証プロセスはまずmysql.userテーブルでユーザーのグローバル権限を確認します。権限が付与されている場合は直接アクセスできます。権限が付与されていない場合は、 mysql.dbテーブルを確認します。
userテーブルは、デフォルトのデータベースに関係なく、グローバル権限を持ちます。例えば、 userのテーブルのDELETE権限は、任意の行、テーブル、またはデータベースに適用できます。
db番目のテーブルでは、空のユーザーが匿名ユーザー名と一致します。3 Userの列ではワイルドカードは使用できません。5 HostとDb番目の列の値には、パターンマッチングが可能な%と_使用できます。
テーブルuserとdbのデータも、メモリにロードされるときにソートされます。
tables_privとcolumns_privにおける%の使用法は似ていますが、 Db 、 Table_name 、 Column_name列値には%含めることはできません。ロード時のソートも同様です。
効果時間
TiDBが起動すると、いくつかの権限チェックテーブルがメモリにロードされ、キャッシュされたデータGRANT使用して権限が検証されます。1、3、5、7 REVOKEの権限管理ステートメントCREATE USER実行すると、すぐに有効DROP USERなります。
mysql.userのようなテーブルをINSERT 、 DELETE 、 UPDATEようなステートメントで手動で編集しても、すぐには反映されません。この動作はMySQLと互換性があり、権限キャッシュはFLUSH PRIVILEGESなステートメントで更新できます。