通常では、アカウントをセットアップして各アカウントで使用可能な権限を制御するためには、GRANT
や REVOKE
などのステートメントを使用することによって、mysql
データベース内の付与テーブルの内容を間接的に操作します。セクション13.7.1「アカウント管理ステートメント」を参照してください。ここでは付与テーブルの基本構造と、サーバーがクライアントと対話するときに付与テーブルの内容をどのように使用するかについて説明します。
次の mysql
データベーステーブルには付与情報が格納されています。
user
: ユーザーアカウント、グローバル権限、および権限以外のその他のカラムが含まれています。db
: データベースレベルの権限が格納されています。host
: 使用されなくなりました。MySQL 5.6.7 以降の新しい MySQL インストールではこのテーブルが作成されなくなりました。tables_priv
: テーブルレベルの権限が格納されています。columns_priv
: カラムレベルの権限が格納されています。procs_priv
: ストアドプロシージャーおよびストアドファンクションの権限が格納されています。proxies_priv
: プロキシユーザー権限が格納されています。
mysql
データベース内のほかのテーブルには付与情報が保持されておらず、ほかの場所で説明されています。
event
: イベントスケジューラについての情報が格納されています。セクション20.4「イベントスケジューラの使用」を参照してください。func
: ユーザー定義関数についての情報が格納されています。セクション24.3「MySQL への新しい関数の追加」を参照してください。help_
: これらのテーブルはサーバー側のヘルプに使用されます。セクション5.1.10「サーバー側のヘルプ」を参照してください。xxx
plugin
: サーバープラグインについての情報が格納されています。セクション5.1.8.1「プラグインのインストールおよびアンインストール」およびセクション24.2「MySQL プラグイン API」を参照してください。proc
: ストアドプロシージャーおよびストアドファンクションについての情報が格納されています。セクション20.2「ストアドルーチン (プロシージャーと関数) の使用」を参照してください。servers
:FEDERATED
ストレージエンジンによって使用されます。セクション15.8.2.2「CREATE SERVER を使用した FEDERATED テーブルの作成」を参照してください。time_zone_
: これらのテーブルにはタイムゾーン情報が格納されています。セクション10.6「MySQL Server でのタイムゾーンのサポート」を参照してください。xxx
名前に
_log
が付いているテーブルは、ロギングに使用されます。セクション5.2「MySQL Server ログ」を参照してください。
mysql
データベース内のテーブルの変更は、CREATE USER
、GRANT
、CREATE PROCEDURE
などのステートメントの応答としてサーバーによって通常実行されます。INSERT
、UPDATE
、DELETE
などのステートメントを使用してこれらのテーブルを直接変更することは推奨されません。これらの変更の結果として誤った形式となった行を、サーバーは随意で無視します。
各付与テーブルにはスコープカラムと権限カラムがあります。
スコープカラムはテーブル内の各行 (エントリ) のスコープ、つまり行が適用されるコンテキストを決定します。たとえば、
Host
とUser
の値が'thomas.loc.gov'
と'bob'
であるuser
テーブル行は、bob
というユーザー名を指定するクライアントによるホストthomas.loc.gov
からサーバーに対して実行する認証接続のために使用されます。同様に、Host
、User
、およびDb
カラム値が'thomas.loc.gov'
、'bob'
、および'reports'
であるdb
テーブル行は、bob
がthomas.loc.gov
ホストからreports
データベースに接続するときに使用されます。tables_priv
テーブルおよびcolumns_priv
テーブルには、それぞれの行に適用されるテーブルまたはテーブルとカラムの組み合わせを示すスコープカラムがあります。procs_priv
スコープカラムは、それぞれの行に適用されるストアドルーチンを示します。権限カラムは、テーブル行によって付与される権限、つまり実行可能な操作を指定します。サーバーはさまざまな付与テーブル内の情報を組み合わせてユーザーの権限の完全な記述を構成します。この実行に使用されるルールの説明は、セクション6.2.5「アクセス制御、ステージ 2: リクエストの確認」にあります。
サーバーは次の方法で付与テーブルを使用します。
-
user
テーブルのスコープカラムは、入接続を拒否または許可するかを決定します。許可される接続について、user
テーブル内で付与されるすべての権限は、ユーザーのグローバル権限を示します。このテーブル内で付与されるすべての権限は、サーバー上のすべてのデータベースに適用されます。注記あらゆるグローバル権限は、すべてのデータベースに対する権限とみなされるため、あらゆるグローバル権限を持つユーザーは、
SHOW DATABASES
を使用したり、またはINFORMATION_SCHEMA
のSCHEMATA
テーブルを調べたりすることで、すべてのデータベース名を表示できるようになります。 db
テーブルのスコープカラムは、どのユーザーがどのホストからどのデータベースにアクセスできるかを決定します。権限カラムは、許可される操作を決定します。データベースレベルで付与される権限は、データベースのほかテーブルやストアドプログラムなどのデータベース内のすべてのオブジェクトに適用されます。tables_priv
およびcolumns_priv
テーブルはdb
テーブルと似ていますが、これらはさらに粒度が細かく、データベースレベルでなくテーブルレベルおよびカラムレベルに適用されます。テーブルレベルで付与される権限は、テーブルおよびそのすべてのカラムに適用されます。カラムレベルで付与される権限は、特定のカラムにのみ適用されます。procs_priv
テーブルはストアドルーチンに適用されます。ルーチンレベルで付与される権限は、単一ルーチンにのみ適用されます。proxies_priv
テーブルは、ほかのユーザーのプロキシの役割を担うことができるユーザーがだれか、およびプロキシユーザーがPROXY
権限をほかのユーザーに付与できるかどうかを指定します。
サーバーは mysql
データベース内の user
および db
テーブルを、アクセス制御のステージ 1 とステージ 2 の両方で使用します (セクション6.2「MySQL アクセス権限システム」を参照してください)。user
と db
のテーブルのカラムをここで示します。
表 6.3 user テーブルおよび db テーブルのカラム
テーブル名 | user |
db |
---|---|---|
スコープカラム | Host |
Host |
User |
Db |
|
Password |
User |
|
権限カラム | Select_priv |
Select_priv |
Insert_priv |
Insert_priv |
|
Update_priv |
Update_priv |
|
Delete_priv |
Delete_priv |
|
Index_priv |
Index_priv |
|
Alter_priv |
Alter_priv |
|
Create_priv |
Create_priv |
|
Drop_priv |
Drop_priv |
|
Grant_priv |
Grant_priv |
|
Create_view_priv |
Create_view_priv |
|
Show_view_priv |
Show_view_priv |
|
Create_routine_priv |
Create_routine_priv |
|
Alter_routine_priv |
Alter_routine_priv |
|
Execute_priv |
Execute_priv |
|
Trigger_priv |
Trigger_priv |
|
Event_priv |
Event_priv |
|
Create_tmp_table_priv |
Create_tmp_table_priv |
|
Lock_tables_priv |
Lock_tables_priv |
|
References_priv |
References_priv |
|
Reload_priv |
||
Shutdown_priv |
||
Process_priv |
||
File_priv |
||
Show_db_priv |
||
Super_priv |
||
Repl_slave_priv |
||
Repl_client_priv |
||
Create_user_priv |
||
Create_tablespace_priv |
||
セキュリティーカラム | ssl_type |
|
ssl_cipher |
||
x509_issuer |
||
x509_subject |
||
plugin |
||
authentication_string |
||
password_expired |
||
リソース制御カラム | max_questions |
|
max_updates |
||
max_connections |
||
max_user_connections |
mysql.user
テーブルの plugin
および authentication_string
カラムは認証プラグイン情報を格納します。
アカウント行の plugin
カラムが空の場合、サーバーは Password
カラムのパスワードハッシュの形式に応じて、mysql_native_password
または mysql_old_password
プラグインを暗黙的に使用してアカウントを認証します。Password
値が空または 4.1 のパスワードハッシュ (41 文字) である場合、サーバーは mysql_native_password
を使用します。パスワード値が 4.1 より前のパスワードハッシュ (16 文字) の場合、サーバーは mysql_old_password
を使用します。(これらのハッシュ形式についての追加情報は、セクション6.1.2.4「MySQL でのパスワードハッシュ」を参照してください。)クライアントは、アカウント行の Password
カラム内のパスワードと一致する必要があります。
アカウント行で plugin
カラムにプラグインが指定された場合、サーバーはこれを使用して、アカウントに対する接続の試行を認証します。プラグインが Password
カラム内の値を使用するかどうかはプラグインによって異なります。
password_expired
カラムは、DBA がアカウントパスワードを期限切れにして、ユーザーにパスワードをリセットするよう求めることができるようにするために、MySQL 5.6.6 で追加されました。デフォルトの password_expired
値は 'N'
ですが、ALTER USER
ステートメントを使用して 'Y'
に設定できます。アカウントのパスワードの有効期限が切れたあと、サーバーへの以降の接続で、そのアカウントによって実行されるすべての操作は、ユーザーが SET PASSWORD
ステートメントを発行して新しいアカウントパスワードを確立するまで、エラーになります。セクション13.7.1.1「ALTER USER 構文」を参照してください。
パスワードの有効期限が切れたあと、SET PASSWORD
を使用してパスワードを現在の値に設定することによって、パスワードを「リセット」することができます。適切なポリシーとして、別のパスワードを選択することをお勧めします。
MySQL 5.6.6 で、ALTER USER
は Password
カラムを空の文字列に設定するため、このステートメントは 5.6.7 まで使用しないでください。
アクセス制御のステージ 2 で、サーバーはリクエスト検証を実行して、クライアントが発行した各リクエストに対してそれぞれのクライアントが十分な権限を持つことを確認します。user
および db
付与テーブルに加えて、テーブルに関するリクエストの場合、サーバーは tables_priv
および columns_priv
テーブルを参照することもあります。後者のテーブルは、テーブルレベルおよびカラムレベルでの細かい権限制御を提供します。これらには、次の表に示すカラムがあります。
表 6.4 tables_priv テーブルおよび columns_priv テーブルのカラム
テーブル名 | tables_priv |
columns_priv |
---|---|---|
スコープカラム | Host |
Host |
Db |
Db |
|
User |
User |
|
Table_name |
Table_name |
|
Column_name |
||
権限カラム | Table_priv |
Column_priv |
Column_priv |
||
その他のカラム | Timestamp |
Timestamp |
Grantor |
Timestamp
カラムおよび Grantor
カラムは、それぞれ現在のタイムスタンプおよび CURRENT_USER
値に設定されます。ただし、これらは未使用のため、ここではこれ以上説明しません。
ストアドルーチンに関するリクエストを検証するために、サーバーは procs_priv
テーブルを参照することがあり、このテーブルには次の表に示すカラムがあります。
表 6.5 procs_priv テーブルのカラム
テーブル名 | procs_priv |
---|---|
スコープカラム | Host |
Db |
|
User |
|
Routine_name |
|
Routine_type |
|
権限カラム | Proc_priv |
その他のカラム | Timestamp |
Grantor |
Routine_type
カラムは、'FUNCTION'
または 'PROCEDURE'
の値を持つ ENUM
カラムであり、その行が示すルーチンのタイプを指します。このカラムにより、同じ名前を持つ関数とプロシージャーに別々に権限を付与することができます。
Timestamp
カラムと Grantor
カラムは現在未使用のため、ここではこれ以上説明しません。
proxies_priv
テーブルはプロキシユーザーについての情報を記録します。これには次のカラムがあります。
Host
、User
: これらのカラムは、プロキシ設定されるアカウントに対してPROXY
権限を持つユーザーアカウントを示します。Proxied_host
、Proxied_user
: これらのカラムは、プロキシ設定されるユーザーのアカウントを示します。Grantor
: 現在未使用です。Timestamp
: 現在未使用です。With_grant
: このカラムは、プロキシアカウントがPROXY
権限を別のアカウントに付与できるかどうかを示します。
付与テーブルのスコープカラムには文字列が格納されています。これらは次に示すように宣言され、それぞれのデフォルト値は空の文字列です。
表 6.6 付与テーブルのスコープカラムの型
カラム名 | 型 |
---|---|
Host 、Proxied_host
|
CHAR(60) |
User 、Proxied_user
|
CHAR(16) |
Password |
CHAR(41) |
Db |
CHAR(64) |
Table_name |
CHAR(64) |
Column_name |
CHAR(64) |
Routine_name |
CHAR(64) |
アクセスチェックのために、User
、Proxied_user
、Password
、Db
、および Table_name
値の比較は大文字小文字を区別します。Host
、Proxied_host
、Column_name
、および Routine_name
値の比較は大文字小文字を区別しません。
user
および db
テーブルでは、各権限は、ENUM('N','Y') DEFAULT 'N'
として宣言される別個のカラムにリストされます。つまり、各権限は無効または有効にすることができ、デフォルトは無効です。
tables_priv
、columns_priv
、および procs_priv
のテーブルでは、権限カラムは SET
カラムとして宣言されます。これらのカラムの値は、テーブルによって制御されるあらゆる組み合わせの権限を含むことができます。カラム値にリストされている権限のみが入力されます。
表 6.7 Set タイプ権限のカラム値
テーブル名 | カラム名 | 可能な Set 要素 |
---|---|---|
tables_priv |
Table_priv |
'Select', 'Insert', 'Update', 'Delete', 'Create', 'Drop', 'Grant', 'References', 'Index', 'Alter', 'Create View', 'Show view', 'Trigger' |
tables_priv |
Column_priv |
'Select', 'Insert', 'Update', 'References' |
columns_priv |
Column_priv |
'Select', 'Insert', 'Update', 'References' |
procs_priv |
Proc_priv |
'Execute', 'Alter Routine', 'Grant' |
管理者権限 (RELOAD
、SHUTDOWN
など) は、user
テーブルのみで指定されます。管理操作はサーバー自体での操作であって、データベース固有でないため、これらの権限をほかの付与テーブルにリストする理由はありません。したがって、ユーザーが管理操作を実行できるかどうかを判別するには、サーバーは user
テーブルのみ参照する必要があります。
FILE
権限も、user
テーブルでのみ指定されます。これはそもそも管理権限ではありませんが、サーバーホスト上のファイルを読み取りまたは書き込みするための能力は、アクセスするデータベースとは無関係です。
mysqld サーバーは、起動時に付与テーブルの内容をメモリーに読み取ります。FLUSH PRIVILEGES
ステートメントを発行するか、mysqladmin flush-privileges または mysqladmin reload コマンドを実行することによって、テーブルをリロードするようサーバーに指示することができます。付与テーブルへの変更は、セクション6.2.6「権限変更が有効化される時期」で示すように反映されます。
アカウントの権限を変更するとき、変更によって権限が希望どおりにセットアップされるかどうかを確認することをお勧めします。特定のアカウントの権限をチェックするには、SHOW GRANTS
ステートメントを使用します (セクション13.7.5.22「SHOW GRANTS 構文」を参照してください)。たとえば、ユーザー名およびホスト名の値がそれぞれ bob
および pc84.example.com
のアカウントに付与された権限を調べるには、次のステートメントを使用します。
SHOW GRANTS FOR 'bob'@'pc84.example.com';