MySQL運営ガイド

MySQLのアクセス権限を設定

ここでは、MySQLの権限システムを詳しく説明しています。設定の仕方は「接続の承認」を参照ください。

MySQL特権システム概要

MySQLには、データベース、ホスト、ユーザ、テーブル、フィールド毎に、データベースを操作(閲覧、挿入、更新、削除など)するための様々な権限を設定することができます。

MySQLでは、データベースにアクセスできるユーザ/パスワード/ホスト名をmysqlというデータベースに登録しているので、そのデータベースを設定していくことになります。

mysqlデータベースに用意されている管理用テーブルは、dbhostusertables_privcolumns_privの5つで、これにより、どのユーザがどのホストからの何のデータベースに対してアクセスできるか指定できます。

mysqlデータベース内のテーブル一覧

データベース名 説明
db 各データベースについてのアクセス制限
host ホストによる制限
user ユーザによりアクセスを制限
tables_priv テーブルについてのアクセス制限
columns_priv フィールドについてのアクセス制限

管理テーブルは MySQL インストール時に自動的に作られます。5つのテーブルはmysqlデータベースにあるので、以下のようにして確認してみましょう。

mysqlデータベースを選択

use mysql

dbテーブルの表示

show fields from db;
select * from db;

hostテーブルの表示

show fields from host;
select * from host;

userテーブルの表示

show fields from user;
select * from user;


MySQLが提供する権限

MySQLの権限には、テーブルへのデータ挿入・削除や、更新などがあります。権限の設定はmysqlデータベースの user、db、host、tables_priv、columns_privで行います。下記のテーブルを参照してください。

権限 Column Context
select Select_priv tables
insert Insert_priv tables
update Update_priv tables
delete Delete_priv tables
index Index_priv tables
alter Alter_priv tables
create Create_priv databases, tables/indexes
drop Drop_priv databases/ tables
grant Grant_priv databases/ tables
reload Reload_priv server administration
shutdown Shutdown_priv server administration
process Process_priv server administration
file File_priv file access on server
  • select, insert, update, deleteの権限は、存在しているデータベースのテーブルに対して許可されています。
  • select権限はテーブルから行を取り出すことができます。
  • index権限はインデックスの作成と破棄(削除)を許可します。
  • alter権限は ALTER TABLE の実行を許可します。
  • createとdrop(※1)権限は、新しいデータベースやテーブルの作成、あるいは既に存在するデータベース、テーブルの破棄(削除)を許可します。
  • grant権限は、他のユーザーに対して自分の権限を持たせる事を許可します。
  • fileの権限を与えると、LOAD DATA INFILE と SELECT ... INTO OUTFILE構文を使用して、サーバーのファイルを読み書きする事ができます。

※mysql データベースに登録されているユーザーにdrop権限を与えると、そのユーザーは MySQL のアクセス権限が格納されているデータベースを破棄できます。

管理者操作に関する許可

残りの権限は管理者操作に関する許可です。この権限により、mysqladminコマンドの実行権が設定されます。mysqladminコマンドのどれが、どの権限に対応しているかは次の表の通りです。

権限 コマンド
reload reload, refresh,
flush-privileges, flush-hosts, flush-logs,
flush-tables
shutdown shutdown
process processlist, kill

各コマンドの詳細

  • reloadはサーバーに権限の設定を再読込させるように伝えます。
  • refreshコマンドは全てのテーブルをフラッシュし、ログファイルを開き直します。
  • flush-privilegesは reload と同義です。
  • その他のflush-*コマンドはrefreshの動作とよく似ているが、適用範囲を絞っており、ちょっとした場合に有効だ。例えば、ログファイルだけをフラッシュしたい場合、refreshを行うよりもflush-logsが効果的な方法です。
  • shutdownコマンドは、。
  • processlistコマンドはサーバーが実行しているスレッドの情報を表示します。killコマンドはサーバーのスレッドをkillしあす。自分のスレッドは常に表示、killできるますが、他人のスレッドをそうするにはprocess権限が必要です。

管理テーブルの項目

全ての管理テーブルに共通することですが、テーブルの各項目を分類すると、適用範囲を指定するスコープフィールドと、許可を定義する権限フィールドがの2種類があります。

スコープフィールド

スコープフィールドは、権限テーブルの登録ごとに、その適用範囲を決めます。
例えば、userテーブルのHostとUserに "domain.co.jp"と"staff"が登録されている場合、サーバーへの接続はホストdomain.co.jpからアクセスしてきたstaffを許可します。同様に、dbテーブルのHost、User、Dbに"domain.co.jp", "staff", "report"が登録されていると、ホスト domain.co.jp から来たstaffに対し report データベースへの接続が許可されます。

フィールド名 タイプ
Host CHAR(60)
User CHAR(16)
Password CHAR(16)
Db CHAR(64)

権限フィールド

権限フィールドは有効になった許可を示します。

user/db/host テーブルでは、全ての権限フィールドは ENUM('N','Y') で定義されます。この値は 'N' か 'Y' のどちらかで、デフォルト値は 'N' です。tables_privとcolumns_privテーブルは、テーブルか、テーブルとカラムを対にしたスコープフィールドを含みます。
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'

権限の詳細は下段の「MySQL が提供する権限」を参照してください。

管理テーブルの詳細

user/db/hostテーブル

サーバーは mysql データベースの user, db, host3つの管理テーブルから、アクセス制限を決定します。テーブルのフィールドは以下の通りです。

テーブル名 user db host
スコープフィールド Host
User
Password
Host
Db
User
Host
Db
権限フィールド Select_priv
Insert_priv
Update_priv
Delete_priv
Index_priv
Alter_priv
Create_priv
Drop_priv
Grant_priv
Reload_priv
Shutdown_priv
Process_priv
File_priv
Select_priv
Insert_priv
Update_priv
Delete_priv
Index_priv
Alter_priv
Create_priv
Drop_priv
Grant_priv
Select_priv
Insert_priv
Update_priv
Delete_priv
Index_priv
Alter_priv
Create_priv
Drop_priv
Grant_priv

userテーブルのスコープフィールドは、接続要求を受け入れるか拒否するかを決定します。そして、管理テーブルの中でuserの権限許可が最優先されます。たとえば、userテーブルの権限許可が'Y'であれば、DbやHostで'N'となっていても、userで設定した'Y'が優先されます。userテーブルには最低限の許可を与えるようにし、DbやHostごとに、それぞれの権限許可を定義する方が無難です。

tables_priv/columns_privテーブル

tables_privテーブルとcolumns_privテーブルは、基本的にはdbテーブルが提供している機能の集約です。リクエスト承認のために、サーバーはこれらuser/db/hostの 3 つのテーブルによって決められた許可を基本としますが、もしテーブルに対する要求であるならば、tables_privとcolumns_privテーブルをさらに調べます。これらのテーブルのフィールドは以下のようになっています。

テーブル名→ tables_priv columns_priv
スコープフィールド Host
Db
User
Table_name
Host
Db
User
Table_name
Column_name
権限フィールド Table_priv
Column_priv
Type
その他フィールド Timestamp
Grantor
Timestamp

権限の定義に関するノウハウ

権限を許可する際の注意事項

ある権限を欲しがるユーザーだけにその権限を許可するのはよい考えですが、権限を与えるときには、特定の事項を熟知している必要があります。

  • grant権限を許可されたユーザーは、他のユーザーの権限を変える事ができます。
  • alter権限は、テーブル名の変更を行うことにより権限システムを破るために使用されるかもしれません。
  • file権限は、サーバー上にある全ての読み込み可能なファイルをデータベースに取り込むことができ、これはSELECT文でアクセスできます。
  • shutdown権限は、他のユーザーに対するサービスを、サーバーを停止することによって、拒否するようにできます。
  • process権限は実行されているクエリーをプレーンテキストで見ることに使えます。パスワードの設定、変更のクエリーも含みます。
  • mysqlデータベースに対しての権限は、パスワードの変更と他の権限の設定を変更ができます。パスワードは暗号化されて登録されており、読むことはできませんが、パスワードを違うものに変えることができます。

以下は MySQL の権限システムで行うものではありません。

  • アクセスを拒否するユーザーを特定して設定することはできません。
  • データベース内のテーブルの作成、破棄の権限を持ちますが、データベースそのものを作成、破棄でるようなユーザーを設定できません。

管理者権限の設定ノウハウ

reloadやshutdownなどの管理者権限は、userテーブルにだけ定義したほうが良いです。なぜなら、管理者操作はデータベースではなくサーバーへの操作なので、hostやdbテーブルで定義する必要はありません。また、こうしておくと、管理者操作の許可は、userテーブルの定義だけを見ればわかるようになります。
file操作の権限はuserテーブルにだけ定義しましょう。これは管理者操作ではありませんが、アクセスしているデータベースにかかわらず、サーバー内のファイルを読み書きできます。

便利なツールとしてmysqlaccessスクリプトがMySQLの配布に含まれています。 mysqlaccess を --help オプションで起動するとヘルプが表示されます。mysqlaccess は user,db and hostテーブルだけしか検査しません。テーブルレベルの権限、カラムレベルの権限は調べません。

アクセスコントロールの段階

MySQLは接続の際、ホスト名とユーザー名の両方をあわせてチェックします。違うホスト間でユーザ名が重複していても、ユーザは別のものとして扱われます。

アクセスコントロール

  • サーバーは接続許可があるかどうかをチェック
  • 接続許可後、サーバーはそれぞれのリクエストをチェック

関連記事