接続が確立すると、サーバは段階 2
に移行します。その接続での要求ごとに、サーバはユーザにそれを実行できる権限があるかどうかを、操作タイプに基づいてチェックします。ここで、権限テーブルの権限フィールドが関係してきます。権限は、user
、db
、host
、tables_priv
、columns_priv
のテーブルで設定できます。権限テーブルの設定は、GRANT
コマンドと REVOKE
コマンドで行います。 See 項4.4.1. 「GRANT
および REVOKE
の構文」。
各権限テーブルのフィールドのリストについては、項4.3.6. 「権限システムはどのように機能するか」
を参照してください。
user
テーブルは、カレントデータベースに関係なく、ユーザに対してグローバルに権限を設定します。たとえば、user
テーブルで DELETE
権限が設定されたユーザは、そのサーバホストのどのデータベースのレコードでも削除できます。つまり、user
テーブルで許可された権限はスーパーユーザ権限です。user
テーブルで権限を設定する対象は、サーバ管理者やデータベース管理者などのスーパーユーザだけにしておくのが賢明です。他のユーザについては、user
テーブルの権限を 'N'
に設定しておき、db
テーブルおよび host
テーブルを使用してデータベース依存で権限を設定してください。
db
テーブルおよび
host
テーブルは、データベース依存の権限を設定します。
スコープフィールドには次の方法で値を指定できます。
ワイルドカード文字の
‘%
’ および
‘_
’ を、両テーブルの
Host
フィールドと
Db
フィールドで使用できる。たとえば、‘_
’
文字をデータベース名の一部として使用するには、GRANT
コマンドで '\_
'
として指定する。
db
テーブルの '%'
Host
値は、``任意のホスト''
を意味する。db
テーブルの空白の Host
値は、``host
テーブルを参照すること'' を意味する。
host
テーブルの
'%'
または空白の
Host
値は、``任意のホスト''
を意味する。
両テーブルにおいて '%'
または空白の Db
値は、``任意のデータベース'' を意味する。
両テーブルにおいて空白の User
値は、匿名ユーザを意味する。
db
テーブルおよび
host
テーブルは、サーバ起動時に読み取られてソートされます(user
テーブル読み込みと同時)。db
テーブルは
Host
、Db
、および
User
のスコープフィールドでソートされ、host
テーブルは Host
と
Db
のスコープフィールドでソートされます。user
テーブルでは、最も具体的な値が最初に、最も抽象的な値が最後にソートされ、サーバによるエントリの突き合わせでは、最初に一致したエントリが使用されます。
tables_priv
テーブルと
columns_priv
テーブルはそれぞれ、テーブル依存およびカラム依存の権限を設定します。スコープフィールドには次の方法で値を指定できます。
ワイルドカード文字の
‘%
’ および
‘_
’ を両テーブルの
Host
フィールドで使用できる。
両テーブルにおいて '%'
または空白の Host
値は、``任意のホスト'' を意味する。
両テーブルの
Db
、Table_name
、Column_name
の各フィールドで、ワイルドカードおよび空白を使用できない。
tables_priv
テーブルおよび
columns_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
テーブルでユーザのテーブル権限とカラム権限をチェックし、これらをユーザの権限に追加します。その結果に基づき、アクセスが許可または拒否されます。
ブール値で表すと、上記のユーザ権限算出法は以下のようにまとめることができます。
グローバル権限 OR (database アクセス権 AND host アクセス権) OR table アクセス権 OR column アクセス権
user
内のグローバル権限が十分ではない場合に、サーバがその不十分なグローバル権限を、データベース、テーブル、およびカラム権限と足し合わせる理由はわかりにくいかもしてません。
その理由は、要求に複数の権限が必要な場合があるからです。たとえば、INSERT
... SELECT
ステートメントを実行するには、INSERT
権限および SELECT
権限の両方が必要です。 そのうち 1 つの権限が
user
テーブル内のエントリにあり、もう 1
つの権限が db
テーブル内のエントリにある場合があります。その場合、要求を実行するのに必要な権限をユーザは持っていますが、サーバはどちらか一方のテーブルだけでは判断できません。この場合、両テーブルのエントリにある権限を組み合わせる必要があります。
host
テーブルを使用して、セキュリティで保護されたサーバのリストを管理することができます。
TcX DataKonsult AB では、host
テーブルに、ローカルネットワーク上のすべてのコンピュータの一覧を入れています。これらにすべての権限を設定しています。
host
テーブルを使用して、セキュリティで保護されていないホストを示すこともできます。
セキュリティで保護されていない公開エリア内に、コンピュータ
public.your.domain
があるとします。以下のように、host
テーブルのエントリを使用して、ネットワーク内のそのコンピュータ以外の全ホストにアクセスを許可することができます。
+--------------------+----+- | Host | Db | ... +--------------------+----+- | public.your.domain | % | ... (全権限を 'N' にセット) | %.your.domain | % | ... (全権限を 'Y' にセット) +--------------------+----+-
当然、権限テーブルは常にテストして(mysqlaccess
などを使用)、アクセス権限が目的どおりに設定されていることを確認してください。
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.