MySQL のユーザー管理
せっかく MySQL をインストールしたのでそれを使ってなにかやってみようと思っているのですが、その前に MySQL の基本操作をまとめておきます。まずは MySQL でのユーザー管理の方法についてご紹介します。phpMyAdmin を使うのもよいのですが、まずは基本となる mysql コマンドを使用した方法でいきたいと思います。今後 Web アプリケーションを紹介するときに、コマンドラインのほうが blog に書きやすいという理由もありますが(^^ゞ
なお、ここでは MySQL 4.1 を前提にします。それ以前のバージョンではいくつか使えない機能があるかもしれません。ちなみに MySQL 5.0 では、だいぶ便利なコマンドが追加されているようです・・・orz
ユーザーの権限
ユーザー管理の方法をご紹介するのに先立って、MySQL の権限システムに関する情報をまとめておきたいと思います。
権限のレベル
ユーザー権限にはその適用範囲によってグローバル、データベース、テーブル、カラムの 4 つのレベルが存在します。それによって、特定のデータベースやテーブルだけを操作できるユーザーを作成することができます。また、同じ権限でもレベルによって若干意味が変わることがあります。例えば、グローバルレベルの CREATE 権限はデータベースの作成を許可しますが、データベースレベルの CREATE 権限はテーブルの作成を許可します。
上位レベルの権限を持っているユーザーには自動的に下位レベルの権限も付与されることに注意してください。つまり、グローバルで CREATE 権限を持っているユーザーはすべてのデータベースでテーブルを作成できます。
権限の種類
MySQL にはさまざまなユーザー権限が存在します。そのうち主なものをリストアップしておきます。
権限名 | 可能な操作 |
---|---|
ALTER | カラムの追加・削除、型の変更など |
CREATE | データベース・テーブルの新規作成 |
DELETE | レコードの削除 |
DROP | データベース・テーブルの削除 |
INDEX | インデックスの作成・削除 |
INSERT | レコードの挿入 |
LOCK TABLES | テーブルのロック(SELECT 権限も必要) |
SELECT | 各種クエリー |
UPDATE | レコード内容の変更 |
GRANT OPTION | 自分の持っている権限を他のユーザーに付与できる |
前述のとおり、一部の権限はレベルによって微妙に意味が違ってきます。このあたりは正式なマニュアルでもきちんと解説されていないので、使って覚えるしかないかもしれません。
完全なリストはリファレンスマニュアルをご覧ください。
実際のユーザーデータの置き場所
MySQL では、ユーザー管理も自身のデータベースで行っています。具体的には、"mysql" というデータベースがデフォルトで作成されており、ここにユーザー情報をはじめとする管理情報がすべて格納されています。ユーザー情報を保存しているのは以下のテーブルです。
テーブル名 | 関連する権限レベル |
---|---|
user | グローバルレベル |
db | データベースレベル |
tables_priv | テーブルレベル |
columns_priv | カラムレベル |
このように権限レベルによって別々のテーブルにユーザー情報が格納されます。例外として、user には権限レベルに関係なく必ずエントリーが作成されるようです。この仕様のおかげで user テーブルを参照するだけですべてのユーザーを把握できます。これらのテーブルを直接参照しなければいけない場面も多いので、覚えておくと便利です。
ユーザー管理
それでは、実際のユーザー管理の方法をご紹介していきましょう。前述のとおり、以下でご紹介しているコマンドは全て mysql で MySQL サーバーに接続した状態で実行してください。接続するには以下のように mysql コマンドを実行します。
mysql -u <ユーザー名> -p
実行後、パスワードを聞いてきますので適切に入力してください。ユーザーは管理権限を持つユーザーである必要があります。
ユーザーの作成
ユーザーの作成には、GRANT ステートメントを使用します。基本的な書式は以下のようになります。
GRANT <権限> ON <適用範囲> TO <ユーザー名>[@<ホスト名>] IDENTIFIED BY '<パスワード>';
- 権限
- ユーザーに与える権限をコンマ区切りで指定します。"ALL" と指定することで全ての権限を付与することができます。
- 適用範囲
- 権限の適用範囲を "<データベース名>.<テーブル名>" で指定します。両方とも指定すればテーブルレベル、"<データベース名>.*" ならデータベースレベル、"*.*" ならグローバルレベルの権限を付与することになります。また、データベース名では "%"と "_" をワイルドカードとして使えます。データベース名の中にそれらが含まれる場合は、"\" でエスケープします。
- ユーザー名
- 作成するユーザーの名前です。
- ホスト名
- MySQL では同じユーザーでもクライアントのホストごとに別々の権限を付与できますので、そのホスト名を指定します。ホスト名と IP アドレスで指定でき、"%" がワイルドカードとして使えます。例えば、"%.sourcewalker.com", "192.168.0.%" などです。省略した場合は、"%" が指定されたのと同等になります。
- パスワード
- 接続に使用するパスワードです。もし省略するとパスワードなしで接続できてしまうので注意してください。
ユーザーへの権限の追加
特定のユーザーに新たな権限を追加するには、ユーザーの作成と同様に GRANT を使います。構文もほぼ同じで、最後にパスワードを指定しないだけです。
GRANT <権限> ON <適用範囲> TO <ユーザー名>[@<ホスト名>]
ホスト名が異なると別のユーザーとして識別されることに注意してください。ホスト名を常に指定する癖を付けたほうがよいでしょう。
ユーザーの権限の削除
特定のユーザーが持っている権限を削除するには、REVOKE ステートメントを使用します。構文は GRANT とほぼ同じです。
REVOKE <権限> ON <適用範囲> FROM <ユーザー名>[@<ホスト名>]
TO が FROM になっている点に注意してください(^^;
ユーザー権限の確認
特定のユーザーが持っている権限を一覧するには、以下のコマンドを使用します。
SHOW GRANTS [FOR <ユーザー名>[@<ホスト名>]];
指定したユーザーの持っている権限が GRANT ステートメントの形で表示されます。ユーザー名を省略すると、現在接続しているユーザーの権限が確認できます。
パスワードの変更
ユーザーのパスワードを変更する方法はいくつかありますが、SET PASSWORD ステートメントを使用するのが簡単です。自分のパスワードを変更するには、以下の構文を使用します。
SET PASSWORD = PASSWORD('<パスワード>');
また、mysql データベースのアクセス権(UPDATE権限?)がある場合は、以下の構文で他のユーザーのパスワードも変更できます。
SET PASSWORD FOR <ユーザー名>[@<ホスト名>] = PASSWORD('<パスワード>');
ユーザーの削除
ユーザーの削除には DROP USER ステートメントを使用します。
DROP USER <ユーザー名>[@<ホスト名>]
ただし、これを実行する前にユーザーの権限をすべて削除しておく必要があります。そのため、実際には以下の手順を踏む必要があります。
- SHOW GRANTS で削除するユーザーの権限を確認します。
- REVOKE を使って全ての権限を削除します。
- DROP USER でユーザーを削除。
ちなみに、MySQL 5.0.2 以降は DROP USER だけで済むらしいです。そういうのは早く実装しておいてほしいですね・・・。
ユーザーの一覧
残念ながら、ユーザーの一覧を表示する機能は特別には用意されていません。そのため、前述の mysql.user テーブルを直接参照する必要があります。とりあえず、ユーザー名とホスト名を一覧するには以下のクエリーを実行します。
SELECT User, Host FROM mysql.user;
その他の情報は SHOW GRANTS などで確認すればよいでしょう。
例
多くの Web アプリケーションでは、インストール前に専用のユーザーとデータベースを手動で作成しておく必要があります。そのような時は、以下のような感じでユーザーを作成するとよいと思います。
grant select,insert,update,delete,create,drop,index,alter on <データベース名>.* to <ユーザー名>@localhost identified by '<パスワード>';
これだけの権限があれば、たいていの Web アプリケーションではじゅうぶんなはずです。具体的なユーザーの作成方法が明記されていないときは、これを使うとよいでしょう。
以上で、MySQL のユーザー管理に必要な操作はだいたいカバーできているんではないでしょうか。次回は、基本的なデータベース・テーブルの管理について書こうと思います。
詳しくはこちらの記事をどうぞ!
この記事にコメントする