MySQL 特定DBへのみアクセス可能なユーザの作成
概要
あるDBへのみ自由にアクセス可能なユーザの作成する。(PleskからDBユーザを追加した時に近い動作)
以下では'sample'データベースにのみアクセス可能な'sample'ユーザを作成する。
ユーザの作成
以下のコマンドでsampleユーザ(localhostからのみ接続許可)を作成して、sampleデータベースに対してのみALL権限を与えることができる。
mysql> GRANT ALL ON sample.* TO sample@localhost IDENTIFIED BY "pass"; Query OK, 0 rows affected (0.01 sec)
- ALL権限で、WITH GRANT OPTION以外の全ての権限を付与
- 権限の設定先はsample.*でデータベースレベルの権限をsampleデータベースに対して設定している
sample.*を*.*にするとグローバルレベルにALL権限が設定され、sampleユーザは全データベースに対してALL権限を持つことになる。
MySQLの権限に関する詳細:http://dev.mysql.com/doc/refman/4.1/ja/grant.html
動作
実際に、sampleユーザでMySQLに接続してみると、、、$ mysql -u sample -p <-- 作成したsampleユーザで接続 Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 9 to server version: 4.1.22 Type 'help;' or '\h' for help. Type '\c' to clear the buffer. mysql> show databases; +----------+ | Database | +----------+ | test | +----------+ 1 row in set (0.00 sec) 他のデータベースは閲覧できない
test*を除く他のデータベースは閲覧できない。
また、sampleデータベースを作成して、テーブル作成等を行えるが他の操作はできないようになっている。
mysql> create database sample; Query OK, 1 row affected (0.00 sec) mysql> CREATE TABLE account (id SERIAL, name VARCHAR(20) NOT NULL); Query OK, 0 rows affected (0.06 sec) sampleデータベースは作成してテーブルの作成等を行える mysql> create database sample2; ERROR 1044 (42000): Access denied for user 'sample'@'localhost' to database 'sample2' 他のデータベースは操作不可
権限の設定状況
上記のGRANTにより実際にどのように権限が設定されたか見てみる。
まずsampleユーザのグローバルレベルには権限が一切付与されていない。
mysql> use mysql;
Database changed
mysql> select * from user \G グローバルレベルの権限はmysql.userテーブルに格納されている
<略>
*************************** 5. row ***************************
Host: localhost
User: sample
Password: 29bad1457ee5e49e
Select_priv: N
Insert_priv: N
Update_priv: N
Delete_priv: N
Create_priv: N
Drop_priv: N
Reload_priv: N
Shutdown_priv: N
Process_priv: N
File_priv: N
Grant_priv: N
References_priv: N
Index_priv: N
Alter_priv: N
Show_db_priv: N
Super_priv: N
Create_tmp_table_priv: N
Lock_tables_priv: N
Execute_priv: N
Repl_slave_priv: N
Repl_client_priv: N
ssl_type:
ssl_cipher:
x509_issuer:
x509_subject:
max_questions: 0
max_updates: 0
max_connections: 0
5 rows in set (0.01 sec)
データベースレベル権限には、GRANTで指定したALL権限がsampleデータベースに対して付与されている。
mysql> select * from db \G データベースレベル権限はmysql.dbテーブルに格納されている。 <略> *************************** 3. row *************************** Host: localhost <-- 対象ユーザの接続元ホスト Db: sample <-- 対象DB名 User: sample <-- 対象ユーザ Select_priv: Y Insert_priv: Y Update_priv: Y Delete_priv: Y Create_priv: Y Drop_priv: Y Grant_priv: N <-- Grant 以外が付与されている References_priv: Y Index_priv: Y Alter_priv: Y Create_tmp_table_priv: Y Lock_tables_priv: Y 3 rows in set (0.01 sec)上記のように、グローバルレベルには権限を付与せず、指定データベースへのデータベースレベル権限のみ付与することで、特定データベースへのみアクセス可能になる。