ユーザの登録

MySQLは、GRANT文で存在しないユーザを指定すると、そのユーザを登録する。

GRANT 権限 ON データベース名.テーブル名 TO ユーザ名 IDENTIFIED BY 'パスワード'

IDENTIFIED BYを指定しないと、パスワードなしのユーザが作成される。
とりあえず、ユーザを作ってみる。

mysql> grant usage on *.* to onishi@localhost identified by 'hoge';
Query OK, 0 rows affected (0.49 sec)

当然、root(MySQLユーザの)で作業をする必要がある。
上記は、localhost上のユーザを登録したので、localhost上以外、他サーバからonishi@server-aとか言ったように、このユーザを登録したサーバへは接続出来ない。
他サーバからアクセスするには、

grant usage on *.* to onishi identified by 'hoge';

のように、@以下を省けば、他サーバから接続出来ますが、この場合localhost上からの接続はできなくなる。
usageとは、権限を与えずにという事であり、*.*はすべてのデータベースのすべてのテーブルを表す。

パスワードの変更

パスワードの変更は、SET PASSWORD文で変更するが、その際に、PASSWORD()関数を使用して、暗号化する必要がある。

mysql> set password = password('hoge');
Query OK, 0 rows affected (0.00 sec)

自分以外のパスワードは、rootで以下のように行う

mysql> set password for onishi@localhost = password('hoge');
Query OK, 0 rows affected (0.00 sec)

権限を与える

onishiは何の権限も持ってないユーザとして登録した。しかし、testデータベースとtest_で始まる名前のデータベースに対しては、デーブルの作成・削除などすべての操作を行う事ができる。これらのデータベースは特別な権限が与えられているからです。
通常、利用時はこれら以外のデータベースの使用が必要です。

データベースに対する権限

ユーザがデータベースに対してどのような権限を持つかを、GRNAT文で指定します。

mysql> grant all privileges on db1.* to onishi@localhost;
Query OK, 0 rows affected (0.03 sec)

ALL PRIVILEGESはすべての権限を表す。単にALLと書く事も可。
これで、「onishi@localhost」は、db1のデータベース配下では、テーブルの作成・削除などが可能になる。
db1の参照権だけ与えたい場合は、

mysql> grant select on db1.* to masateru;

テーブルに対する権限

データベース全体ではなく、データベース中の特定のテーブルにだけアクセス権を設定する事も可能。

mysql> grant update on db1.table1 to masateru;

上の例では、db1のtable1のテーブルにだけ、更新の権限を与えています。

フィールドに対する権限

1つのテーブル内に、アクセスさせたいフィールドとアクセスさせたくないフィールドが混在している場合は、次のようにする。

mysql> grant select (column1, column2) on db1.table2 to masateru;

ユーザの権限を見る

mysql> show grants for onishi@localhost;
+--------------------------------------------------------------------------------------+
| Grants for onishi@localhost                                                          |
+--------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'onishi'@'localhost' IDENTIFIED BY PASSWORD '13ae08e92ef36dd0' |
| GRANT ALL PRIVILEGES ON `db1`.* TO 'onishi'@'localhost'                              |
+--------------------------------------------------------------------------------------+
2 rows in set (0.00 sec)
mysql> show grants for masateru;
+----------------------------------------------------------------------+
| Grants for masateru@%                                                |
+----------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'masateru'@'%'                                 |
| GRANT SELECT ON `db1`.* TO 'masateru'@'%'                            |
| GRANT UPDATE ON `db1`.`table1` TO 'masateru'@'%'                     |
| GRANT SELECT (column2, column1) ON `db1`.`table2` TO 'masateru'@'%'  |
+----------------------------------------------------------------------+
4 rows in set (0.00 sec)

testデータベースに関する情報は、出てきません。

権限の剥奪

上記の状態では、ユーザ「masateru」は、table2のcolumn1,column2以外もselectできてしまいます。それは、db1.*にSELECT権限があるためです。その権限を除くにはREVOKE文を使う。

mysql> revoke select on db1.* from masateru;
Query OK, 0 rows affected (0.00 sec)

確認すると

mysql> show grants for masateru;
+----------------------------------------------------------------------+
| Grants for masateru@%                                                |
+----------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'masateru'@'%'                                 |
| GRANT UPDATE ON `db1`.`table1` TO 'masateru'@'%'                     |
| GRANT SELECT (column2, column1) ON `db1`.`table2` TO 'masateru'@'%'  |
+----------------------------------------------------------------------+
3 rows in set (0.00 sec)

REVOKE文で、db1.*としてすべてのSELECT権限を剥奪したはずなのに、db1.table2のcolumn1,column2のSELECT権限が残っているのは、データベースが4つのレベルで管理されているからで、 グローバルレベル、デー手ベースレベル、テーブルレベル、フィールドレベルがありREVOKE文では、 データベールレベルでの権限のみが削除されたからです。REVOKE前の権限が上から順に4つのレベルを示しています。

また、権限をすべて剥奪しても、ユーザは削除されません。何も権限を持たないユーザとして登録されたままですので、MySQLの管理テーブルを直接いじり、削除する必要がある。

匿名ユーザ

前述したように、ホスト名を指定せずに登録したユーザは、localhostからは接続出来ない。これは、デフォルトでlocalhostの匿名ユーザが登録されているから。
mysql.userテーブルに登録する際、ユーザ名(Userフィールド)を空白にしておけば、匿名ユーザを登録する事もできる。
「空白@localhost」は「ユーザ名@空白」よりも優先されるため、localhostからの接続では、後者よりも前者として解釈されているので、「ユーザ名@空白」は接続出来ない。
「空白@localhost」をmysql.userからレコードを削除するか、接続時に、「localhost」ではなく、「127.0.0.1」を使えば、この「ユーザ名@空白」が接続出来ない問題は回避出来る。
まあ、そんなずさんなユーザ管理をしなければ、はじめから問題ない。


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2011-01-28 (金) 21:32:50 (4827d)