MySQL 権限システムは、すべてのユーザがそれぞれ許可された操作だけを実行できるようにします。MySQL サーバに接続すると、ユーザの ID は接続元のホストおよび指定したユーザ名によって特定されます。権限システムは、ユーザ ID と行いたい操作に応じて権限を設定します。
MySQL
では、ホスト名とユーザ名を使用してユーザを認証します。1
つのユーザ名がインターネット上のどこででも同じユーザを示しているという保証がないためです。たとえば、office.com
から接続したユーザ joe
は、elsewhere.com
から接続した
joe
と同一人物とは限りません。
MySQL
では、同じユーザ名でも異なるホストから接続するユーザ間で区別することにより、このことを処理しています。joe
に対して、office.com
から接続した場合の権限セットと、elsewhere.com
から接続した場合の権限セットを別々に設定できます。
MySQL のアクセス制御には 2 段階があります。
段階 1: ユーザに接続する権限があるかどうかサーバがチェックする。
段階 2:
接続できた場合、要求ごとにそれを実行できる権限があるかどうかサーバがチェックする。たとえば、データベースのあるテーブルからレコードを
SELECT したり、データベースのテーブルを DROP
しようとすると、ユーザにそのテーブルの
SELECT
権限があるかどうか、あるいはデータベースの
DROP
権限があるかどうかをサーバがチェックする。
注意: 接続中に権限が変更された場合(ユーザ自身または第三者によって)、必ずしもその変更は次のクエリに反映されません。詳細については、項4.4.3. 「権限の変更はいつ反映されるか」 を参照してください。
サーバはアクセス制御の両方の段階で、mysql
データベースの
user
、db
、host
の各テーブルを使用します。これらの権限テーブルのフィールドを以下に示します。
テーブル名 | user | db | host |
スコープフィールド | Host |
Host |
Host |
User |
Db |
Db |
|
Password |
User |
||
権限フィールド | Select_priv |
Select_priv |
Select_priv |
Insert_priv |
Insert_priv |
Insert_priv |
|
Update_priv |
Update_priv |
Update_priv |
|
Delete_priv |
Delete_priv |
Delete_priv |
|
Index_priv |
Index_priv |
Index_priv |
|
Alter_priv |
Alter_priv |
Alter_priv |
|
Create_priv |
Create_priv |
Create_priv |
|
Drop_priv |
Drop_priv |
Drop_priv |
|
Grant_priv |
Grant_priv |
Grant_priv |
|
References_priv |
References_priv |
References_priv |
|
Reload_priv |
|||
Shutdown_priv |
|||
Process_priv |
|||
File_priv |
|||
Show_db_priv |
|||
Super_priv |
|||
Create_tmp_table_priv |
Create_tmp_table_priv |
Create_tmp_table_priv |
|
Lock_tables_priv |
Lock_tables_priv |
Lock_tables_priv |
|
Execute_priv |
|||
Repl_slave_priv |
|||
Repl_client_priv |
|||
ssl_type |
|||
ssl_cypher |
|||
x509_issuer |
|||
x509_cubject |
|||
max_questions |
|||
max_updates |
|||
max_connections |
アクセス制御の 2
段階目(要求確認)で、要求がテーブルに関連するものである場合、サーバがさらに
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 |
各権限テーブルには、スコープフィールドと権限フィールドがあります。
スコープフィールドは、テーブルの各登録の範囲を特定します。たとえば、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
テーブルには、各エントリに許可されているテーブルまたはテーブルとカラムの組み合わせを示すスコープフィールドが含まれています。
アクセスをチェックする目的において、Host
値は大文字と小文字の区別がありません。User
、Password
、Db
、および
Table_name
の値については大文字と小文字が区別されます。
Column_name
値は、MySQL バージョン
3.22.12
以降では大文字と小文字が区別されなくなっています。
権限フィールドは、テーブル内のエントリごとに設定されている権限、つまり何の操作を実行できるかを示します。サーバはさまざまな権限テーブルの情報を組み合わせて、ユーザの権限についての完全な記述を生成します。 この動作に適用されるルールについては、項4.3.10. 「アクセス制御の段階 2: 要求確認」 を参照してください。
スコープフィールドは文字列です。ここで示されているように、それぞれのデフォルト値は空の文字列です。
フィールド名 | 型 | 注意 |
Host |
CHAR(60) |
|
User |
CHAR(16) |
|
Password |
CHAR(16) |
|
Db |
CHAR(64) |
(tables_priv テーブルおよび
columns_priv テーブルでは
CHAR(60) ) |
Table_name |
CHAR(60) |
|
Column_name |
CHAR(60) |
user
、db
、host
の各テーブルでは、すべての権限フィールドが
ENUM('N','Y')
として宣言されます。それぞれの値は
'N'
または 'Y'
で、デフォルト値は 'N'
です。
tables_priv
テーブルおよび
columns_priv
テーブルでは、権限フィールドは
SET
フィールドとして宣言されます。
テーブル名 | フィールド名 | 設定可能な要素 |
tables_priv |
Table_priv |
'Select', 'Insert', 'Update', 'Delete', 'Create', 'Drop',
'Grant', 'References', 'Index', 'Alter' |
tables_priv |
Column_priv |
'Select', 'Insert', 'Update', 'References' |
columns_priv |
Column_priv |
'Select', 'Insert', 'Update', 'References' |
以下、サーバが権限テーブルをどのように使用するか簡潔に説明します。
user
テーブルのスコープフィールドにより、着信した接続を許可するか拒否するか決定する。許可された接続について、user
テーブルに設定されている権限はいずれも、そのユーザのグローバル(スーパーユーザ)権限になる。
これらの権限は、サーバのすべてのデータベースに適用される。
db
テーブルと
host
テーブルは一緒に使用される。
db
テーブルのスコープフィールドにより、どのユーザがどのホストからどのデータベースにアクセスできるかを決定する。権限フィールドから、何の操作が許可されているか判断する。
host
テーブルは、任意の
db
テーブルエントリをいくつかのホストに適用する場合、db
テーブルを補完するものとして使用される。たとえば、1
人のユーザにネットワーク内のいくつかのホストからデータベースへアクセスすることを許可する場合、ユーザの
db
テーブルエントリの
Host
値を空白のままにしておき、それらのホストの各エントリを
host
テーブルに入力する。このメカニズムの詳細については、項4.3.10. 「アクセス制御の段階 2: 要求確認」を参照のこと。
tables_priv
テーブルおよび
columns_priv
テーブルは
db
テーブルに似ているが、より詳細な設定が可能。データベースレベルではなく、テーブルおよびカラムレベルで適用される。
注意:
管理者権限(RELOAD
、SHUTDOWN
など)は、user
テーブルでのみ指定します。管理操作はデータベース固有ではなく、サーバそのもので行う操作なので、この権限を他の権限テーブルで設定する必要はありません。実際、管理操作を実行できるかどうか決定する際には、user
テーブルを参照するだけで済みます。
FILE
権限も user
テーブルだけで指定します。
これは管理者権限ではありませんが、サーバホスト上でのファイルの読み書きは、アクセスしているデータベースに依存しません。
mysqld
サーバは権限テーブルの内容を、起動時に 1
回読み取ります。権限テーブルへの変更の反映については、項4.4.3. 「権限の変更はいつ反映されるか」
を参照してください。
権限テーブルの内容を変更する場合、その変更によって、目的の権限が適切に設定されていることを確認してください。問題診断のヘルプについては、項4.3.12. 「Access denied
エラーの原因」
を参照してください。セキュリティに関するアドバイスについては、項4.3.2. 「MySQL のクラッカー対策」
を参照してください。
便利な診断ツールとして、mysqlaccess
スクリプトがあります。これは、Yves Carlier が
MySQL
ディストリビューション用に提供したものです。このツールの動作を確認したい場合には、mysqlaccess
を --help
オプションで起動してください。 注意:
mysqlaccess
は
user
、db
、および
host
テーブルだけを使用してアクセスをチェックします。テーブルまたはカラムレベルの権限はチェックしません。
This is a translation of the MySQL Reference Manual that can be found at dev.mysql.com. The original Reference Manual is in English, and this translation is not necessarily as up to date as the English version.