接続を確立すると、サーバは段階 2
に移行します。その接続での要求ごとに、サーバはユーザに実行できる権限があるかどうかを、操作タイプに基づいてチェックします。ここで、権限テーブルの権限フィールドが関係してきます。権限は、user
、db
、host
、tables_priv
、columns_priv
、procs_priv
のテーブルで設定できます。各権限テーブルのフィールドのリストについては、項4.7.2. 「権限システムの機能」
を参照してください。
user
テーブルは、デフォルト
(カレント)
データベースに関係なく、ユーザに対してグローバル権限を設定します。たとえば、user
テーブルに DELETE
権限があるユーザは、そのサーバ
ホストのどのデータベースのレコードでも削除できます。つまり、user
テーブルに対する権限はスーパーユーザ権限ということです。そのため、user
テーブルで権限を設定になる対象は、サーバ管理者やデータベース管理者などのスーパーユーザだけにしておくのが賢明です。他のユーザについては、user
テーブルの権限を 'N'
に設定しておき、権限の付与は適切なレベルで行なうこととしてください。権限の付与には、データベース、テーブル、カラム、ルーチンなど、データベース依存で設定してください。
db
テーブルおよび
host
テーブルでは、データベース依存の権限を設定します。
スコープ
フィールドには次の方法で値を指定します。
ワイルドカード文字の
‘%
’ および
‘_
’ を、両テーブルの
Host
フィールドと
Db
フィールドで使用できる。これには、LIKE
演算子で実行するマッチングと同様の意味があります。権限付与に、どちらかの文字を使用するときに、それをバックスラッシュでエスケープします。たとえば、‘_
’
文字 (アンダーライン)
をデータベース名の一部として使用するには、GRANT
コマンドでそれを
★‘\_
’★
として指定する。
db
テーブルの 「'%'
Host」 値は、「任意のホスト」
を意味する。db
テーブルの空白の Host
値は、「host
テーブルを参照すること'」
を意味する。(このセクションでプロセスについて後述)
host
テーブルの
'%'
または空白の
Host
値は、「任意のホスト」
を意味する。
両テーブルにおいて host
テーブルの '%'
または空白の Db
「
値は、任意のデータベース」
を意味する。
両テーブルにおいて空白の User
値は、匿名ユーザを意味する。
db
テーブルと host
のテーブルは、サーバ起動時に読み取りとソートを行ないます
(user
テーブル読み込みと同時)。
のスコープ
フィールドでソートします。db
テーブルは
Host
、Db
、
User
のそれぞれのスコープ
フィールドでソートし、host
テーブルは Host
と Dbuser
テーブルでは、最も具体的な値が最初に、最も抽象的な値が最後の順でソートし、サーバによるエントリの突き合わせでは、最初に一致したエントリを使用します。
tables_priv
、columns_priv
、procs_priv
のテーブルではそれぞれ、テーブル依存およびカラム依存の権限を設定します。スコープ
フィールドには次の方法で値を指定します。
ワイルドカード文字の
‘%
’ および
‘_
’ を両テーブルの
Host
フィールドで使用できる。これらには、LIKE
演算子で実行するマッチングと同義です。
両テーブルにおいて '%'
または空白の Host
値は、「任意のホスト」
を意味する。
両テーブルの
Db
、Table_name
、Column_name
のそれぞれのフィールドで、ワイルドカードおよび空白は使用できない。
tables_priv
、columns_priv
、procs_priv
などのテーブルは、Host
、Db
、User
のフィールドでソートが行なわれます。これは
db
テーブルのソートと同様ですが、ワイルドカードの使用が
Host
フィールドだけの限定になるため、よりシンプルです。
サーバは、受け取る要求の妥当性をソートしたテーブルで確認します。SHUTDOWN
または RELOAD
などの管理側の権限が必要な要求では、サーバは
user
テーブル
エントリをチェックします。これは、このテーブルが唯一、管理権限の指定を行なうテーブルであるためです。要求操作を許可していれば、アクセスを認め、そうでない場合は拒否します。たとえば、mysqladmin
shutdown
コマンドを実行するときに、user
テーブル エントリで SHUTDOWN
権限の設定がなければ、db
テーブルや host
テーブルをチェックすることなくアクセスを拒否します。これらのテーブルには
Shutdown_priv
カラムが存在しないため、チェックしません)。
INSERT
、UPDATE
などデータベース関連の要求では、サーバは最初に、user
テーブル
エントリでユーザのグローバル(スーパーユーザ)権限をチェックします。ここで、要求の操作が許可があれば、アクセスを認めます。user
テーブルのグローバル権限が十分ではない場合には、サーバはユーザのデータベースに関する権限を
db
テーブルおよび
host
テーブルでチェックします。
サーバは、db
テーブルの
Host
、Db
、User
のそれぞれのフィールドをチェックする。Host
フィールドと User
フィールドでは、接続ユーザのホスト名と
MySQL
ユーザ名がチェックの対象になる。Db
フィールドでは、ユーザがアクセスしようとしているデータベースをチェックする。Host
および User
に該当するエントリがない場合には、アクセスを拒否する。
db
テーブル
エントリが一致し、その Host
フィールドが空白ではない場合、そのエントリがユーザのデータベース依存の権限を定義する。
一致している db
テーブル
エントリの Host
フィールドが空白の場合、これは
host
テーブルが、データベースにアクセスできるホストを指定することを意味する。このとき、host
テーブルの Host
フィールドと
Db
フィールドがチェックの対象になる。host
テーブル内に一致するエントリがない場合は、アクセスを拒否する。一致するエントリがあれば、ユーザのデータベースに対する権限が、db
および host
テーブル
エントリを、和集合ではなく、共通集合として計算する。つまり、両方のエントリの
'Y'
が権限であることを指す。このように、db
テーブル
エントリで全般的な権限を設定し、host
テーブル
エントリでホストごとに権限を制限することができる。
サーバは、db
および
host
テーブルエントリからデータベースに対する権限の特定が済むと、それらの権限を
user
テーブルのグローバル権限と足し合わせます。その結果が要求の操作を許可するものであれば、アクセスを認めます。そうでない場合、サーバは
tables_priv
と
columns_priv
のテーブルでユーザのテーブル権限とカラム権限をチェックし、これらのテーブルに対するユーザの権限を追加します。その結果に基づき、アクセスの許可または拒否を行ないます。ストアド
ルーチンの操作には、サーバは
tables_priv
や
columns_priv
ではなく、procs_priv
に重点を置きます。
ブール値で表すと、上記のユーザ権限算出法は次のような総括になります。
global privileges OR (database privileges AND host privileges) OR table privileges OR column privileges OR routine privileges
user
内のグローバル権限が十分ではない場合に、サーバがその十分ではないグローバル権限を、データベース、テーブル、およびカラム権限と足し合わせることは不可解です。しかし、これには、要求に複数の権限が必要な場合があるという事情があります。たとえば、INSERT
INTO ... SELECT
ステートメントを実行するには、INSERT
権限および SELECT
権限の両方が必要になります。この権限のうち
1 つの権限が user
テーブル内のエントリにあり、もう 1
つの権限が db
テーブル内のエントリにあるという場合には、要求を実行するために必要な権限をユーザを持っているにも関わらず、サーバがどちらか一方のテーブルだけでは判断できないため、両テーブルのエントリにある権限を組み合わせた結果で、許可/拒否の判断を行ないます。
GRANT
または REVOKE
などのステートメントは、host
テーブルには影響しません。そのため、MySQL
インストレーションではあまり、このステートメントを使用することはありません。直接に変更しなければならない場合、たとえば、セキュリティで保護したサーバ
リストの保守などを行なうときなど、稀に使用します。その例として、TcX
(TcX DataKonsult AB) で、host
テーブルには、ローカル
ネットワークのすべてのマシンをリストしていて、すべての権限をここで設定しています。
host
テーブルを使用して、セキュリティ保護のない
ホストを示すこともできます。
セキュリティ保護のない公開エリア内に、コンピュータ
public.your.domain
があるとします。ここで、次のように、host
テーブルのエントリを使用して、ネットワーク内のそのコンピュータ以外のホストすべてへのアクセスを許可することができます。
+--------------------+----+- | Host | Db | ... +--------------------+----+- | public.your.domain | % | ... (all privileges set to 'N') | %.your.domain | % | ... (all privileges set to 'Y') +--------------------+----+-
ノート:
常に、権限テーブルをテストして(SHOW
GRANTS
などを使用)、アクセス権限を目的どおりに設定していることを確認してください。