MySQL 権限システムの主な役割は、特定のホストから接続するユーザーを認証すること、およびそのユーザーを、SELECT
、INSERT
、UPDATE
、DELETE
などのデータベースにおける権限に関連付けることです。追加機能として、匿名ユーザーを持つこと、そして、管理操作や LOAD DATA INFILE
などの MySQL 特有の機能についての権限を与えることなどがあります。
MySQL 権限システムでは実行できないこともあります。
特定ユーザーのアクセスを拒否するように明示的に指定することはできません。つまり、ユーザーを明示的に突き合わせて接続を拒否することはできません。
ユーザーがデータベースのテーブルを作成または削除できるが、データベース自体の作成または削除はできないような権限をユーザーが持つように指定することはできません。
パスワードはアカウントに対してグローバルに適用されます。データベース、テーブル、ルーチンなどの特定のオブジェクトにパスワードを関連付けることはできません。
MySQL 権限システムへのユーザーインタフェースは、CREATE USER
、GRANT
、REVOKE
などの SQL ステートメントで構成されます。セクション13.7.1「アカウント管理ステートメント」を参照してください。
内部的には、サーバーは権限情報を mysql
データベース (つまり mysql
という名前のデータベース) の付与テーブルに格納します。MySQL サーバーはこれらのテーブルの内容を起動時にメモリーに読み取り、付与テーブルのインメモリーコピーに基づいてアクセス制御を決定します。
MySQL 権限システムによって、すべてのユーザーは自分に許可された操作のみ実行可能になります。ユーザーとして MySQL サーバーに接続すると、ユーザーの ID は、接続元のホストおよび指定したユーザー名によって決定されます。接続後にリクエストを発行すると、システムは、ユーザー ID と ユーザーが行う操作に応じて権限を付与します。
MySQL ではホスト名とユーザー名の両方を考慮に入れてユーザーを特定しますが、これは、特定のユーザー名がすべてのホストで同一人物に属すると想定する根拠がないためです。たとえば、office.example.com
から接続したユーザー joe
は、home.example.com
から接続した joe
と同一人物とは限りません。MySQL では、たまたま同じ名前を持った異なるホスト上のユーザーを識別できるようにすることによってこれを処理します。つまり、office.example.com
からの joe
による接続に対して 1 つの権限セットを付与し、home.example.com
からの joe
による接続に対して別の権限セットを提供することができます。特定のアカウントが持つ権限を表示するには、SHOW GRANTS
ステートメントを使用します。例:
SHOW GRANTS FOR 'joe'@'office.example.com';
SHOW GRANTS FOR 'joe'@'home.example.com';
サーバーに接続するクライアントプログラムを実行するとき、MySQL アクセス制御には 2 つのステージがあります。
ステージ 1: サーバーは、ユーザーの ID および正しいパスワードを指定することによって ID を検証できるかどうかに基づいて、接続を受け入れるか拒否します。
ステージ 2: 接続できる場合、サーバーはユーザーが発行する各ステートメントを検査して、ステートメントを実行するだけの十分な権限をユーザーが持っているかどうかを判別します。たとえば、データベースのテーブルからレコードを選択したり、データベースのテーブルを削除したりしようとすると、サーバーはユーザーにそのテーブルの SELECT
権限があるかどうか、またはデータベースの DROP
権限があるかどうかを検証します。
各ステージで発生する動作の詳細な説明については、セクション6.2.4「アクセス制御、ステージ 1: 接続の検証」およびセクション6.2.5「アクセス制御、ステージ 2: リクエストの確認」を参照してください。
ユーザーの接続中に (ユーザー自身または別のだれかによって) 権限が変更された場合、それらの変更は、ユーザーが発行する次のステートメントで必ずしもすぐに有効になるわけではありません。サーバーが付与テーブルをリロードする条件についての詳細は、セクション6.2.6「権限変更が有効化される時期」を参照してください。
セキュリティーに関連する一般的な助言については、セクション6.1「一般的なセキュリティーの問題」を参照してください。権限に関連した問題の診断についての支援情報は、セクション6.2.7「アクセス拒否エラーの原因」を参照してください。