無料Wikiサービス | デモページ
Linuxなどのメモ書き

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)

上記のように、グローバルレベルには権限を付与せず、指定データベースへのデータベースレベル権限のみ付与することで、特定データベースへのみアクセス可能になる。



最終更新 2009/06/10 16:50:50 - kztomita
(2009/06/10 16:24:27 作成)