June 13, 2008
mysql - skip-show-database
MySQLでのSHOW DATABASESコマンド権限の管理。
バージョンの表示と、テスト用データベース'sample'の作成。
SHOW PROCESSLISTやSHOW VARIABLESとかも禁止にするにはどうするんだろう。小一時間情報を探してみたけれど、わからなかった。できないのかもしれない。
バージョンの表示と、テスト用データベース'sample'の作成。
$ mysql -u root mysql> SELECT VERSION(); +------------+ | VERSION() | +------------+ | 5.0.51-log | +------------+ 1 row in set (0.00 sec) mysql> CREATE DATABASE sample; Query OK, 1 row affected (0.00 sec)fooユーザを作成し、SELECTのみ許可する。
$ mysql -u root
mysql> GRANT Select ON *.* TO foo@localhost;
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT * FROM mysql.user WHERE `User` = 'foo'\G
*************************** 1. row ***************************
Host: localhost
User: foo
Password:
Select_priv: Y
Insert_priv: N
Update_priv: N
...
Show_db_priv: N
Super_priv: N
...
1 row in set (0.00 sec)
fooユーザにShow_dbの権限は無いはずなのに、SHOW DATABASESコマンドが実行でき、全てのデータベースが見れてしまう。
$ mysql -u foo mysql> SHOW DATABASES; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | sample | | test | +--------------------+ 4 rows in set (0.00 sec)fooユーザを再作成し、'sample'データベースでのSELECTのみ許可する。
$ mysql -u root mysql> DELETE FROM mysql.user WHERE `User` = 'foo'; Query OK, 1 row affected (0.00 sec) mysql> FLUSH PRIVILEGES; Query OK, 0 rows affected (0.00 sec) mysql> GRANT Select ON sample.* TO foo@localhost; Query OK, 0 rows affected (0.00 sec)先程と同様fooユーザにShow_dbの権限は無く、SHOW DATABASESコマンドも実行できる。しかし、権限の無い'mysql'データベースは見えなくなる。('information_schema'や'test'が見えるのはよくわからない。)
$ mysql -u foo mysql> SHOW DATABASES; +--------------------+ | Database | +--------------------+ | information_schema | | sample | | test | +--------------------+ 3 rows in set (0.00 sec)次に、my.cnfに'skip-show-database'を追加し、mysqlを再起動する。
$ vi /path/to/my.cnf [mysqld] ... skip-show-database ...fooユーザでSHOW DATABASESコマンドを実行すると、拒否するようになったことが分かる。'skip-show-database'がONで、Show_db権限がない場合に、SHOW DATABASESコマンドは拒否される模様。
$ mysql -u foo mysql> SHOW DATABASES; ERROR 1227 (42000): Access denied; you need the SHOW DATABASES privilege for this operation確認のために、Show_db権限をfooユーザに与える。
$ mysql -u root mysql> UPDATE mysql.user SET Show_db_priv = 'Y' WHERE `User` = 'foo'; Query OK, 1 row affected (0.00 sec) Rows matched: 1 Changed: 1 Warnings: 0 mysql> FLUSH PRIVILEGES; Query OK, 0 rows affected (0.00 sec)SHOW DATABASESコマンドを実行すると、全データベースが表示される。
$ mysql -u foo mysql> SHOW DATABASES; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | sample | | test | +--------------------+ 4 rows in set (0.00 sec)一般ユーザはSHOW DATABASESコマンドは必要ない(自分が使用するデータベースだけ知っていればいい)ので、'skip-show-database'は常にONにしておいたほうが良さそう。で、Show_db権限は与えないこと。
SHOW PROCESSLISTやSHOW VARIABLESとかも禁止にするにはどうするんだろう。小一時間情報を探してみたけれど、わからなかった。できないのかもしれない。