MySQL 権限システムでは、すべてのユーザが許可がある操作だけを行います。ユーザは MySQL サーバに接続すると、 接続元のホスト と 指定するユーザ名 でそのアイデンティティ (ID) を認識します。接続後のリクエスト発行では、権限システムが、ユーザ ID と それが行なう操作に応じて権限を設定します。
MySQL
では、ホスト名とユーザ名を使用してユーザを認証します。1
つのユーザ名がインターネット上のどこででも同じユーザを示しているという保証がないためです。たとえば、
office.example.com
から接続したユーザ joe
は、home.example.com
から接続した
joe
と同一人物とは限りません。
MySQL
では、同じユーザ名でも異なるホストから接続するユーザ間で区別して、これを処理します。office.example.com
から接続したjoe
と、home.example.com
から接続した
joe
には別々の権限セットを設定します。
MySQL のアクセス制御には、サーバに接続するクライアント プログラムを実行するときに、 2 段階を踏みます。
段階 1:ユーザに接続する権限があるかどうかサーバがチェックする。
段階
2:接続できた場合、要求ごとにそれを実行できる権限があるかどうかサーバがチェックする。たとえば、データベースのテーブルからレコードを
SELECT したり、データベースのテーブルを DROP
しようとすると、ユーザにそのテーブルの
SELECT
権限があるかどうか、あるいはデータベースの
DROP
権限があるかどうかをサーバがチェックする。
接続中に権限を変更した場合(ユーザ自身または第三者によって)、必ずしもその変更は次のクエリに反映するとは限りません。詳細は、項4.7.7. 「権限の変更が反映するタイミング」 を参照してください。
サーバは、mysql
データベース
(mysql
と名付けられたデータベース)
の権限テーブルに権限情報を保管します。MySQL
サーバは、起動するとこのテーブルの内容をメモリに読み込み、項4.7.7. 「権限の変更が反映するタイミング」
で示すような状況においては、それらを再読み込みします。アクセス制御の決定は、権限テーブルの内部コピーを基に行います。
通常、GRANT
や REVOKE
などのクエリを使用して、権限テーブルの内容を間接的に操作し、アカウントのセットアップや権限のコントロールを行ないます。項12.5.1. 「アカウント管理ステートメント」
も参照してください。ここでは、権限テーブルの根本的なストラクチャと、サーバがクライアントとのやりとりでどのようにそれを使用するかについて説明します。
サーバでは、両方の段階でのアクセス制御で、mysql
データベースの user
、
db
、 そして host
テーブルを使用します。user
と
db
のフィールドをここで示します。host
テーブルは、db
テーブルと類似しますが、項4.7.6. 「アクセス制御の段階 2: 接続確認」
で説明するように特別な使い方をします。
テーブル名 | 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 |
||
セキュリティ フィールド | ssl_type |
|
ssl_cipher |
||
x509_issuer |
||
x509_subject |
||
リソース制御フィールド | max_questions |
|
max_updates |
||
max_connections |
||
max_user_connections |
Event_priv
と
Trigger_priv
のフィールドは MySQL
5.1.6 で追加しました。
アクセス制御の 2 段階目 (要求確認)
で、要求がテーブルに関連する場合、サーバはそれぞれのクライアントに適切な権限があるかどうかを確認します。それに加えて、user
、
db
、 host
の権限テーブルで、サーバが
tables_priv
と
columns_priv
テーブルを参照します。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
のフィールドは現在未使用です。.
ストアド
ルーチンに関わる要求確認では、サーバは
procs_priv
テーブルを参照します。このテーブルには次のようなフィールドがあります。
テーブル名 | procs_priv |
スコープ フィールド | Host |
Db |
|
User |
|
Routine_name |
|
Routine_type |
|
権限フィールド | Proc_priv |
その他のフィールド | Timestamp |
Grantor |
Routine_type
は、'FUNCTION'
または
'PROCEDURE'
の値を伴う
ENUM
フィールドであり、その行が示すルーチンのタイプを指します。このフィールドでは、関数とプロシージャが同じ名前である場合に、別々に権限を与えます。
Timestamp
と Grantor
のフィールドは現在未使用です。.
それぞれの権限テーブルには、スコープ フィールドと権限フィールドがあります。
スコープ フィールドは、テーブルの各登録
(エントリ)
の範囲を特定します。たとえば、Host
と User
の値が
'thomas.loc.gov'
および
'bob'
である
user
テーブル
エントリは、thomas.loc.gov
ホストからサーバに接続しようとする
bob
を認証します。同様に、Host
、User
、Db
のそれぞれのフィールドの値が
'thomas.loc.gov'
、'bob'
'reports'
である
db
テーブル
エントリは、thomas.loc.gov
ホストから reports
データベースに接続しようとする
bob
を認証します。tables_priv
テーブルおよび columns_priv
テーブルには、それぞれのエントリを許可しているテーブルまたはテーブルとカラムの組み合わせを示すスコープフィールドがあります。
procs_priv
スコープ
フィールドはエントリに適用するストアド
ルーチンを示します。
権限フィールドは、テーブル内のエントリごとに設定している権限、つまり何の操作を実行できるかを示します。サーバはさまざまな権限テーブルの情報を組み合わせて、ユーザの権限についての完全な記述を生成します。 この動作に適用できるルールについては 項4.7.6. 「アクセス制御の段階 2: 接続確認」 を参照してください。
スコープフィールドは文字列です。ここで示すように、それぞれのデフォルト値は空文字列です。
フィールド名 | 型 |
Host |
CHAR(60) |
User |
CHAR(16) |
Password |
CHAR(16) |
Db |
CHAR(64) |
Table_name |
CHAR(64) |
Column_name |
CHAR(64) |
Routine_name |
CHAR(64) |
アクセスをチェックでは、Host
値の比較には大文字と小文字を区別します。User
、Password
、Db
、および
Table_name
の値については大文字と小文字を区別します。Column_name
と Routine_name
の値は、大文字と小文字の区別は不要です。
user
、 db
、
host
のテーブルでは、それぞれの権限を別々のカラムにリストしています。これは、ENUM('N','Y')
DEFAULT 'N'
と宣言しています。つまり、それぞれの権限は無効化、および有効化が可能です。
tables_priv
、
columns_priv
、procs_priv
のテーブルでは、権限フィールドは
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' |
ここで、サーバが権限テーブルをどのように使用するかを簡潔に説明します。
user
テーブルのスコープ
フィールドで、着信した接続を許可または拒否のどちらかを決定する。接続を許可すると、user
テーブルに設定している権限はいずれも、そのユーザのグローバル(スーパーユーザ)権限になる。
これらの権限は、サーバのすべてのデータベースに適用となる。
ノート:グローバル権限はいずれも、すべてのデータベースに対する権限として扱うため、グローバル権限を持つユーザは、SHOW
DATABASES
を使用したり、 あるいは
INFORMATION_SCHEMA
の
SCHEMATA
テーブルを調べたりすると、すべてのデータベース名を閲覧できるようになる。
db
テーブルのスコープ
フィールドで、どのユーザがどのホストからどのデータベースにアクセスできるかを決定する。権限フィールドから、何の操作を許可しているか判断する。
データベースのレベルで権限があると、データベースとそのすべてのテーブルにアクセスできる。
host
テーブルを、任意の
db
テーブル
エントリをいくつかのホストに適用する場合、db
テーブルで補完するものとして使用する。たとえば、1
人のユーザに対して、ネットワーク内の複数のホストからデータベースへアクセスすることを許可する場合、ユーザの
db
テーブル エントリの
Host
値を空白のままにして、それらのホストのそれぞれのエントリを
host
テーブルに入力する。このメカニズムの詳細については、項4.7.6. 「アクセス制御の段階 2: 接続確認」
を参照のこと。
ノート:host
テーブルは、INSERT
、
UPDATE
、 DELETE
などのステートメントで直接、変更する必要がある。GRANT
や REVOKE
などのステートメントは、間接的に権限テーブルを修正し、これらのステートメントからは効果がない。MySQL
のインストールでは、このテーブルは、例外を除き、使用しない。
tables_priv
と
columns_priv
のテーブルは、
db
テーブルと類似するが、これらはより詳細な設定が可能。データベース
レベルではなく、テーブルおよびカラム
レベルでの適用となる。テーブルで権限を与えた場合、それはテーブル、およびすべてのカラムでの適用となる。カラム
レベルで権限を与えた場合、特定のカラムにだけの適用となる。
procs_priv
テーブルはストアド
ルーチンへの適用となる。ルーチン
レベルで権限を与えた場合、単一のルーチンにだけの適用となる。
注意: 管理者権限
(RRELOAD
、SHUTDOWN
など)は、user
テーブルで指定します。管理操作はデータベース固有ではなく、サーバそのもので行う操作です。そのため、この権限を他の権限テーブルで設定する必要はありません。実際に、管理操作を実行できるかどうか決定するときには、user
テーブルを参照するだけで済みます。
FILE
権限は user
テーブルで指定します。
これは管理者権限ではありません。サーバ
ホスト上でのファイルの読み書きは、アクセスしているデータベースからは独立しています。
mysqld
サーバは権限テーブルの内容を、起動時に 1
回メモリへ読み取ります。FLUSH
PRIVILEGES
ステートメントを発行するか、または
mysqladmin flush-privileges あるいは
mysqladmin reload
のコマンドを実行して、このテーブルの再読み込みを行なうことも可能です。権限テーブルへの変更してから反映できるまでの詳細は
項4.7.7. 「権限の変更が反映するタイミング」
を参照してください。
権限テーブルの内容を変更するときは、その変更で、目的とする権限を適切に設定したかどうを確認してください。任意のアカウントへの権限をチェックするには、SHOW
GRANTS
ステートメントを使用します。(項12.5.4.16. 「SHOW GRANTS
構文」
を参照のこと。) たとえば、Host
が pc84.example.com
で、User
が bob
のアカウントに与えた権限を確認するには、次のようにステートメントを発行します。
SHOW GRANTS FOR 'bob'@'pc84.example.com';
権限関連問題の追加的な診断ヘルプに関しては、項4.7.8. 「Access denied
エラーの原因」
を参照してください。その他、セキュリティに関連のアドバイスに関しては、項4.6. 「セキュリティ問題」
を参照してください。