急いでいる人のためのMySQLのユーザ権限付与講座
MySQLでは細かいレベルの権限付与が可能ですが、大抵の場合そこまで細かいレベルの権限付与は必要ないですよね? マニュアルを読まないか、もしくはちょっとしたメモ書きを見る程度でおおよそ使い方が理解できるくらいならいいのに、といつも思います。
そこで今回は、MySQLのユーザ権限付与の中でも、とりわけよく行われる手順だけを簡単にまとめてみました。
【まず知っておいたほうが良いこと】
ユーザはmysqlデータベース内のuserテーブルに作られます。
次に例えば以下のユーザの情報を見てみると「_priv」系のカラム値が全部「Y」であることがわかります。この場合はグローバルレベル権限として全部「Y」なので、全てのテーブルに対して接続が可能となります。
mysql> select * from user where User='adminuser' \G
*************************** 1. row ***************************
Host: %
User: adminuser
Password: 136b4c537575b6f1
Select_priv: Y ←
Insert_priv: Y ←
Update_priv: Y ←
~~~中略~~~
Create_routine_priv: Y ←
Alter_routine_priv: Y ←
Create_user_priv: Y ←
ssl_type:
ssl_cipher:
x509_issuer:
x509_subject:
max_questions: 0
max_updates: 0
max_connections: 0
max_user_connections: 0
1 row in set (0.00 sec)
一方、以下のユーザの情報を見てみると「_priv」系のカラム値が全部「N」であることがわかります。
mysql> select * from user where User='testuser' \G
*************************** 1. row ***************************
Host: localhost
User: testuser
Password: 136b4c537575b6f1
Select_priv: N ←
Insert_priv: N ←
Update_priv: N ←
~~~中略~~~
Create_routine_priv: N ←
Alter_routine_priv: N ←
Create_user_priv: N ←
ssl_type:
ssl_cipher:
x509_issuer:
x509_subject:
max_questions: 0
max_updates: 0
max_connections: 0
max_user_connections: 0
1 row in set (0.00 sec)
この場合は、別途ユーザが接続するデータベースを「db」テーブルに設定します。
mysql> select * from db where User='testuser' \G
*************************** 1. row ***************************
Host: localhost
Db: testdatabase
User: testuser
Select_priv: Y
Insert_priv: Y
Update_priv: Y
~~~中略~~~
Create_routine_priv: Y
Alter_routine_priv: Y
Execute_priv: Y
1 row in set (0.00 sec)
普段意識すべきはこのあたりまでだと思いますが、さらに細かい設定を検討する場合は以下もご参照下さい。
※参照:mysqlデータベース内のテーブル一覧
データベース名 | 説明 |
user | グローバルレベルの権限とパスワードを管理するテーブル |
db | データベースレベルの権限を管理するテーブル |
host(今回は考えない) | dbテーブルにホスト名が指定されていない場合に適用される権限を管理するためのテーブル |
tables_priv(今回は考えない) | テーブルレベルの権限を管理するテーブル。テーブル内のすべてのフィールドに適用される権限について格納。 |
columns_priv(今回は考えない) | フィールドレベルの権限を管理するテーブル。テーブル内の一つのフィールドに適用される権限について格納。 |
これをふまえて。
【1.管理者用ユーザを作りたい】
いわゆる何でもできる管理者用ユーザは以下の要領で作ります。
GRANT ALL ON *.* TO adminuser@'%' IDENTIFIED BY 'password' WITH GRANT OPTION;
※MySQLにはGRANT権限というものがあります。GRANT権限とは、他のユーザに対して権限を付与することができる権限のことです。当然のことながらGRANT権限は通常管理者用ユーザにか付与しません。
IP制限をかける場合は以下の要領です。
GRANT ALL ON *.* TO adminuser@'172.16.0.0/255.255.255.0' IDENTIFIED BY 'password' WITH GRANT OPTION;
【2.一般ユーザを作りたい】
全てのデータベースにアクセスできる一般ユーザは以下の要領で作ります(WITH GRANT OPTIONがないのに注目)。ただし全てのデータベースにアクセスできる一般ユーザをGRANT ALL ON *.*で作ると、SUPER権限がつくのでinit_connectが無視されるなどの副作用があるそうです。(sh2さんご指摘ありがとうございました)
GRANT ALL ON *.* TO testuser@'%' IDENTIFIED BY 'password';
特定のデータベースにアクセスできる一般ユーザは以下の要領で作ります。
GRANT ALL ON testdatabase.* TO testuser@'%' IDENTIFIED BY 'password';
SELECT,INSERT,UPDATE,DELETEしかできない一般ユーザは以下の要領で作ります。
GRANT SELECT,INSERT,UPDATE,DELETE ON testdatabase.* TO testuser@'%' IDENTIFIED BY 'password';
【3.レプリケーション用ユーザを作りたい】
MySQLの大きな特徴であるレプリケーションを行う場合、MASTER DBに以下の要領でユーザを作ります。
GRANT REPLICATION SLAVE ON testdatabase.* TO repl@'172.16.0.0/255.255.255.0' IDENTIFIED BY 'password';
【最後に】
柔軟な権限設定ができるシステムは多いですが、概してどれも設定が複雑になるんですよね。しかし前提知識として今回の内容程度を押さえておけば、日常運用程度ではなんとかなるし、応用も利くようになるのではないでしょうか。
The comments to this entry are closed.
Comments