MySQLもセキュリティー面はかなりしっかりしているのでユーザーと権限という概念があります。ここら辺りに関してはかなりシビアなMySQLであります。ここではユーザーの作成・削除、権限の付与・剥奪とその権限の使い方などを説明しています。
このMySQLユーザーというのはMySQLとして独立したユーザー概念であって例えばサーバーのシステムユーザーなどとは全く関係ありません。レンタルサーバーなどですと、そのまま申込みユーザーIDみたいなものがデータベース名になっていたりといろいろですが、自分でMySQLを構築している限りは自分自身でそのユーザーと権限を管理できます。
グローバルレベルの権限はつまりはすべての権限です。すべての権限というのは、MySQLを根本からまるまる削除できる権限ってことです。MySQLの操作なら何でもできます。できないのはMySQL自体のインストールぐらいなもので、その他は何でもできます。システム構築の際の権限になることが多いです。
データベースレベルの権限は、各データベースの一部を操作できる権限です。これは逆にいうとある特定のデータベースの全権限を与えるということになります。そのデータベースに限っては、作成・更新・削除など自由に行うことができます。このデータベースを使用する本人に与える権限となることが多いです。
テーブルレベルの権限は、いわゆるデータベースに含まれるテーブル(エクセルのシートみたいなもの)においてすべての権限が与えられます。データベース全体にはその権限は及びませんが、そこにある縦横のスプレットシートみたいなものに関して、作成・更新・削除が可能になります。テーブルの集合体であるDBには何もすることはできません。この権限はいわゆる個々のデータの保守管理をしている方々の権限レベルであることが多いです。
カラムレベルは、テーブル内の特定のカラムにしかアクセスできないし操作もできないというレベルです。これは、データ入力アルバイトさんなんかに与えられる権限です。つまり、名前と電話番号と住所だけ入力していってくださいね、というレベル。
all privileges(すべての権限)ってことらしいです。*.*という変な感じのところが肝でして、これは「すべてのデータベース」.「すべてのテーブル」という意味ですので、ここでもってすべての権限を与えていることになります。
このMySQLユーザーというのはMySQLとして独立したユーザー概念であって例えばサーバーのシステムユーザーなどとは全く関係ありません。レンタルサーバーなどですと、そのまま申込みユーザーIDみたいなものがデータベース名になっていたりといろいろですが、自分でMySQLを構築している限りは自分自身でそのユーザーと権限を管理できます。
| 権限 | 説明 | 権限の保存先 |
|---|---|---|
| グローバルレベル | 特定のサーバ上にある全データベースに適用されます。GRANT ALL ON *.*は、グローバル権限の付与のみを行います。 | mysql.userテーブル |
| データベースレベル | 指定したデータベースの全テーブルに適用されます。GRANT ALL ON db.*は、データベース権限の付与のみを行います。 | mysql.dbテーブル及びmysql.hostテーブル |
| テーブルレベル | 指定したテーブルの全カラムに適用されます。GRANT ALL ON db.tableは、テーブル権限の付与のみを行います。 | mysql.tables_privテーブル |
| カラムレベル | 指定したテーブルの特定のカラムに適用されます。 | mysql.columns_privテーブル |
グローバルレベルの権限はつまりはすべての権限です。すべての権限というのは、MySQLを根本からまるまる削除できる権限ってことです。MySQLの操作なら何でもできます。できないのはMySQL自体のインストールぐらいなもので、その他は何でもできます。システム構築の際の権限になることが多いです。
データベースレベルの権限は、各データベースの一部を操作できる権限です。これは逆にいうとある特定のデータベースの全権限を与えるということになります。そのデータベースに限っては、作成・更新・削除など自由に行うことができます。このデータベースを使用する本人に与える権限となることが多いです。
テーブルレベルの権限は、いわゆるデータベースに含まれるテーブル(エクセルのシートみたいなもの)においてすべての権限が与えられます。データベース全体にはその権限は及びませんが、そこにある縦横のスプレットシートみたいなものに関して、作成・更新・削除が可能になります。テーブルの集合体であるDBには何もすることはできません。この権限はいわゆる個々のデータの保守管理をしている方々の権限レベルであることが多いです。
カラムレベルは、テーブル内の特定のカラムにしかアクセスできないし操作もできないというレベルです。これは、データ入力アルバイトさんなんかに与えられる権限です。つまり、名前と電話番号と住所だけ入力していってくださいね、というレベル。
グローバルユーザーの作成
と言っていますが、実はユーザーの作成と権限の作成は同時です。なので、ユーザーの作成時にはすでにcreate databaseでもってDBを作成しておきます。というのは、ユーザーの作成とその権限、またその権限の及ぶ範囲というもの結びつけて設定するので最低一つのDBが必要です。mysql> grand all privileges on *.* to <ユーザー名>@<DBホスト名> identified by '<パスワード>';
mysql> grant all privileges on *.*
-> to user@localhost
-> identified by '*******';
all privileges(すべての権限)ってことらしいです。*.*という変な感じのところが肝でして、これは「すべてのデータベース」.「すべてのテーブル」という意味ですので、ここでもってすべての権限を与えていることになります。
データベースレベルユーザーの作成
データベースレベル権限のユーザー作成...っていうのは実は特になくて、先ほどの*.*という部分を<指定のデータベース名>.*という感じにするだけです。指定の特定DB中のすべてのテーブルに権限を与えます。mysql> grand all privileges on <指定DB名>.* to <ユーザー名>@<DBホスト名> identified by '<パスワード>';
mysql> grant all privileges on test_db.*
-> to user@localhost
-> identified by '*******';
テーブルレベルユーザーの作成
なんかしつこくなりますが、これも同様で、今度は指定DBと指定テーブルを書いてあげるだけです。mysql> grand all on <指定DB名>.<指定テーブル名> to <ユーザー名>@<DBホスト名> identified by '<パスワード>';
mysql> grant all privileges on test_db.test_table
-> to user@localhost
-> identified by '*******';
実行可能な文を指定する場合
実行可能なコマンドを指定してユーザーに権限を与えることもできます。これは銀行とか何とかちょっとデータ入力を間違ってしまうと厄介な会社や業務においてはかなり有効です。ミス入力はあっても消すことはできないとか、更新はできるが無下に新規作成できないとか...。その用途によって使い分けることができます。mysql> grant <権限を与えるコマンド(コンマ切り)> on <指定DB名>.<指定テーブル名> to <ユーザー名>@<DBホスト名> identified by '<パスワード>';
mysql> grant select, insert, update, delete on <指定DB名>.<指定テーブル名> to <ユーザー名>@<DBホスト名> identified by '<パスワード>';
ユーザーの登録確認
MySQLデータベースは、ユーザーまで自分のデータベースで管理するという強者なのです。ですので、登録したユーザーの確認は特定のテーブル(mysql.user)のUserカラムを表示させるだけです。すべてのカラムも同時に表示させるとそのユーザー情報がいろいろと全部出てきます。mysql> select User from mysql.user;
+------------------+
| User |
+------------------+
| root |
| debian-sys-maint |
| user |
+------------------+
ユーザー権限の確認
ユーザー権限を確認するには、show grants forで確認します。確認するといっても、以前に打ち込んだコマンドがそのまま出てくるだけなんですが...。mysql> show grants for user@localhost;
+-------------------------------------------------------------------+
| Grants for user@localhost |
+-------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'user'@'localhost' |
| IDENTIFIED BY PASSWORD '*81DB0D6DD503303E33C104A4F181BBD069D646BD'|
| GRANT ALL PRIVILEGES ON `vermeer`.* TO 'user'@'localhost' |
+-------------------------------------------------------------------+
2 rows in set (0.00 sec)



