権限管理
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が指定されているかどうかによって異なります。
mysql> SET sql_mode=DEFAULT;
Query OK, 0 rows affected (0.00 sec)
mysql> 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)
mysql> SELECT * FROM mysql.user WHERE user='idontexist';
Empty set (0.00 sec)
mysql> GRANT ALL PRIVILEGES ON test.* TO 'idontexist';
ERROR 1105 (HY000): You are not allowed to create a user with GRANT
mysql> SELECT user,host,authentication_string FROM mysql.user WHERE user='idontexist';
Empty set (0.00 sec)
次の例では、SQL モードNO_AUTO_CREATE_USERが設定されていないため、ユーザーidontexistは空のパスワードで自動的に作成されます。これはセキュリティ上のリスクがあるためお勧めできません。ユーザー名のスペルを間違えると、空のパスワードで新しいユーザーが作成されます。
mysql> 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)
mysql> 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)
mysql> SELECT * FROM mysql.user WHERE user='idontexist';
Empty set (0.00 sec)
mysql> GRANT ALL PRIVILEGES ON test.* TO 'idontexist';
Query OK, 1 row affected (0.05 sec)
mysql> SELECT user,host,authentication_string FROM mysql.user WHERE user='idontexist';
+------------+------+-----------------------+
| user | host | authentication_string |
+------------+------+-----------------------+
| idontexist | % | |
+------------+------+-----------------------+
1 row in set (0.01 sec)
GRANTではあいまい一致を使用して、データベースに権限を付与できます。
mysql> GRANT ALL PRIVILEGES ON `te%`.* TO genius;
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT user,host,db FROM mysql.db WHERE user='genius';
+--------|------|-----+
| user | host | db |
+--------|------|-----+
| genius | % | te% |
+--------|------|-----+
1 row in set (0.00 sec)
この例では、 % in te%のため、 teで始まるすべてのデータベースに権限が付与されます。
権限を取り消す
REVOKEステートメントにより、システム管理者はユーザー アカウントから権限を取り消すことができます。
REVOKEステートメントはREVOKEステートメントに対応します。
REVOKE ALL PRIVILEGES ON `test`.* FROM 'genius'@'localhost';
ノート:
権限を取り消すには、完全に一致する必要があります。一致する結果が見つからない場合は、エラーが表示されます。
mysql> REVOKE ALL PRIVILEGES ON `te%`.* FROM 'genius'@'%';
ERROR 1141 (42000): There is no such grant defined for user 'genius' on host '%'
あいまい一致、エスケープ、文字列、識別子について:
mysql> GRANT ALL PRIVILEGES ON `te\%`.* TO 'genius'@'localhost';
Query OK, 0 rows affected (0.00 sec)
この例では、完全一致を使用してte%という名前のデータベースを検索します。 % \エスケープ文字が使用されているため、 %はワイルドカードとはみなされないことに注意してください。
文字列は一重引用符 ('') で囲まれ、識別子はバッククォート (``) で囲まれます。以下の違いを参照してください。
mysql> 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
mysql> GRANT ALL PRIVILEGES ON `test`.* TO 'genius'@'localhost';
Query OK, 0 rows affected (0.00 sec)
特別なキーワードをテーブル名として使用する場合は、キーワードをバッククォート (``) で囲みます。例えば:
mysql> 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.%' |
+------------------------------------------------------------------+
動的な権限
v5.1 以降、TiDB 機能は、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_ADMINSEM が有効な場合、特権所有者が 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表で確認できます。例えば:
mysql> 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.25 では、この場合に必要なのはALTER権限のみです。現在、TiDB のALTER権限は、MySQL の実際の動作と一致しています。
バックアップ
SUPERまたはBACKUP_ADMIN権限が必要です。
データベースの作成
データベースに対するCREATE権限が必要です。
インデックスの作成
テーブルに対するINDEX権限が必要です。
テーブルの作成
テーブルに対するCREATE権限が必要です。
CREATE TABLE...LIKE...ステートメントを実行するには、テーブルに対するSELECT権限が必要です。
ビューの作成
CREATE VIEW権限が必要です。
ノート:
現在のユーザーがビューを作成するユーザーではない場合は、
CREATE VIEWとSUPERの両方の権限が必要です。
データベースを削除
テーブルに対するDROP権限が必要です。
ドロップインデックス
テーブルに対するINDEX権限が必要です。
ドロップテーブル
テーブルに対するDROP権限が必要です。
データを読み込む
テーブルに対するINSERT権限が必要です。 REPLACE INTO使用する場合は、 DELETE権限も必要です。
テーブルの切り捨て
テーブルに対するDROP権限が必要です。
テーブルの名前を変更
名前変更前のテーブルにはALTERおよびDROP権限が必要で、名前変更後のテーブルにはCREATEおよびINSERT権限が必要です。
分析テーブル
テーブルに対するINSERTおよびSELECT権限が必要です。
見せる
SHOW CREATE TABLEは、テーブルに対する任意の 1 つの権限が必要です。
SHOW CREATE VIEWはSHOW VIEW権限が必要です。
SHOW GRANTSは、 mysqlデータベースに対するSELECT権限が必要です。対象ユーザーが現在のユーザーの場合、 SHOW GRANTSは特権は必要ありません。
SHOW PROCESSLIST他のユーザーに属する接続を表示するにはSUPERが必要です。
ロール/ユーザーの作成
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権限が必要です。
特権制度の導入
特権テーブル
次のシステム テーブルは、すべての権限関連データが格納されるため、特別です。
mysql.user(ユーザーアカウント、グローバル権限)mysql.db(データベースレベルの権限)mysql.tables_priv(テーブルレベルの権限)mysql.columns_priv(列レベルの権限。現在サポートされていません)
これらのテーブルには、データの有効範囲と権限情報が含まれています。たとえば、 mysql.userテーブルでは次のようになります。
mysql> 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ユーザが任意のホスト( % )から送信した接続要求を受け付け可能であることが判断される。 Select_privとInsert_priv 、ユーザーがグローバルSelectとInsert権限を持っていることを意味します。表mysql.userの有効範囲はグローバルです。
mysql.dbのHostとUserによって、ユーザーがアクセスできるデータベースが決まります。有効範囲はデータベースです。
ノート:
特権テーブルは、
GRANT、CREATE USER、DROP USERなどの指定された構文を使用してのみ更新することをお勧めします。基礎となる権限テーブルを直接編集しても、権限キャッシュは自動的に更新されないため、FLUSH PRIVILEGESが実行されるまで予測できない動作が発生します。
接続の検証
クライアントが接続リクエストを送信すると、TiDBサーバーはログイン操作を検証します。 TiDBサーバーは最初にmysql.userテーブルをチェックします。レコードUserとHost接続リクエストと一致する場合、TiDBサーバーはレコードauthentication_stringを検証します。
ユーザー ID は 2 つの情報に基づいています。1 Host接続を開始するホスト、 Userはユーザー名です。ユーザー名が空でない場合は、ユーザー名が完全に一致する必要があります。
User + Host userテーブルの複数の行に一致する可能性があります。このシナリオに対処するために、 userのテーブルの行が並べ替えられます。クライアントが接続すると、テーブルの行が 1 つずつチェックされます。最初に一致した行が検証に使用されます。並べ替える場合、ホストはユーザーよりも優先されます。
検証のリクエスト
接続が成功すると、リクエスト検証プロセスによって、操作に権限があるかどうかがチェックされます。
データベース関連のリクエスト ( INSERT 、 UPDATE ) の場合、リクエスト検証プロセスは最初にテーブルmysql.user内のユーザーのグローバル権限をチェックします。権限が付与されている場合は、直接アクセスできます。そうでない場合は、 mysql.db表を確認してください。
userテーブルには、デフォルトのデータベースに関係なくグローバル権限があります。たとえば、 userのDELETE権限は、任意の行、テーブル、またはデータベースに適用できます。
dbの表では、空のユーザーが匿名ユーザー名と一致します。 User列にはワイルドカードを使用できません。 HostとDb列の値には、パターン マッチングを使用できる%と_を使用できます。
テーブルuserとテーブルdbのデータも、メモリにロードされるときにソートされます。
tables_privとcolumns_privでの%の使用は似ていますが、 Db 、 Table_name 、およびColumn_nameの列値に%を含めることはできません。ロード時のソートも同様です。
効果時間
TiDB が起動すると、いくつかの権限チェック テーブルがメモリにロードされ、キャッシュされたデータを使用して権限が検証されます。 GRANT 、 REVOKE 、 CREATE USER 、 DROP USERなどの権限管理ステートメントを実行すると、すぐに有効になります。
mysql.userなどのテーブルをINSERT 、 DELETE 、 UPDATEなどのステートメントで手動で編集しても、すぐには有効になりません。この動作は MySQL と互換性があり、権限キャッシュは次のステートメントで更新できます。
FLUSH PRIVILEGES;