無料PHPプログラム

MySQL 5.1 リファレンスマニュアル :: 4 データベース管理 :: 4.7 MySQL アクセス権限システム :: 4.7.2 権限システムの機能
« 4.7.1 権限システムの役割

4.7.3 MySQL 提供の権限 »
Section Navigation      [Toggle]
  • 4.7 MySQL アクセス権限システム
  • 4.7.1 権限システムの役割
  • 4.7.2 権限システムの機能
  • 4.7.3 MySQL 提供の権限
  • 4.7.4 MySQL サーバへの接続
  • 4.7.5 アクセス制御の段階 1: 接続確認
  • 4.7.6 アクセス制御の段階 2: 接続確認
  • 4.7.7 権限の変更が反映するタイミング
  • 4.7.8 Access denied エラーの原因
  • 4.7.9 MySQL 4.1 のパスワードハッシュ

4.7.2. 権限システムの機能

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. 「セキュリティ問題」 を参照してください。

Copyright c 1997, 2010, Oracle and/or its affiliates. All rights reserved. Legal Notices
Top / Previous / Next / Up / Table of Contents
© 2010, Oracle Corporation and/or its affiliates

無料CGI PHPスクリプト | 新着情報スクリプト | 営業日カレンダー | PHPマニュアル | MySQLマニュアル | PEARマニュアル

Copyright (c) 2010 jmcodex.com All rights reserved.