無料PHPプログラム

MySQL 5.1 リファレンスマニュアル :: 4 データベース管理 :: 4.8 MySQL ユーザ アカウント管理 :: 4.8.2 MySQL への新規ユーザの追加
« 4.8.1 MySQL ユーザ名とパスワード

4.8.3 MySQL ユーザの削除 »
Section Navigation      [Toggle]
  • 4.8 MySQL ユーザ アカウント管理
  • 4.8.1 MySQL ユーザ名とパスワード
  • 4.8.2 MySQL への新規ユーザの追加
  • 4.8.3 MySQL ユーザの削除
  • 4.8.4 ユーザ リソースの制限
  • 4.8.5 パスワードの設定
  • 4.8.6 パスワードのセキュリティ
  • 4.8.7 接続安全

4.8.2. MySQL への新規ユーザの追加

MySQL アカウント作成方法は、2 通りあります。

  • CREATE USER または GRANT などのステートメントをアカウント作成に使用する。

  • INSERT、UPDATE、DELETE などのステートメントで直接、MySQL の権限テーブルを操作する。

推奨方法は、CREATE USER や GRANT などのアカウント作成のステートメントを使用する方法です。これは、的確であり、エラーを防ぎます。詳細は 項12.5.1.1. 「CREATE USER 構文」 および 項12.5.1.3. 「GRANT 構文」 を参照してください。

アカウント作成の別の方法としては、MySQL アカウント管理の機能を提供している、phpMyAdmin などのサード パーティ プログラムを使用することもできます。

次に、新規ユーザのセットアップする mysql クライアント プログラムの使用方法を例示します。この例示では、項2.10.3. 「最初の MySQL アカウントの確保」 で説明するように、デフォルト設定の権限でセットアップしています。これは、変更するには、MySQL root ユーザとして MySQL サーバに接続する必要があることを示します。この root アカウントには、mysql データベースの INSERT 権限と RELOAD 管理権限も必要です。

まず、mysql プログラムを使用してサーバに MySQL root ユーザとして接続します。

shell> mysql --user=root mysql

root アカウントにパスワードを割り当てた場合には、mysql コマンドで --password または -p のいずれかのオプションも使用します。

root でサーバに接続した後に、新規アカウントを追加します。次のステートメントでは、GRANT で新規アカウントを 4 つ追加しています。

mysql> GRANT ALL PRIVILEGES ON *.* TO 'monty'@'localhost'
    ->     IDENTIFIED BY 'some_pass' WITH GRANT OPTION;
mysql> GRANT ALL PRIVILEGES ON *.* TO 'monty'@'%'
    ->     IDENTIFIED BY 'some_pass' WITH GRANT OPTION;
mysql> GRANT RELOAD,PROCESS ON *.* TO 'admin'@'localhost';
mysql> GRANT USAGE ON *.* TO 'dummy'@'localhost';

GRANT ステートメントで追加したアカウントは、次のような属性を持ちます。

  • monty というユーザ名と some_pass というパスワードのアカウントが 2つ存在します。どちらもフル権限を持つスーパーユーザのアカウントです。'monty'@'localhost') というアカウントは、ローカル ホストから接続するときにだけ使用できます。一方の 'monty'@'%' というアカウントは、どのホストからでも接続できます。注意: monty というアカウントは両方とも、monty としてどこからでも接続できる必要があります。この localhost でアカウントを持っていない場合、monty でローカル ホストから接続したときに、mysql_install_db で作成している localhost のエントリで、匿名ユーザのアカウントとして優先になります。つまり、 monty が匿名ユーザとして扱われます。この理由は、'monty'@'%' よりも、匿名ユーザの方が具体的な Host カラム値にあるため、匿名の方が、user テーブルのソート順で先にきます。. (user テーブルのソートに関しては、項4.7.5. 「アクセス制御の段階 1: 接続確認」 を参照してください。)

  • admin というユーザ名でパスワードがないアカウントがあります。このアカウントは、.ローカル ホストから接続するときにだけ使用できます。そして、RELOAD と PROCESS の管理権限があります。この権限は、 admin ユーザが、 to execute the mysqladmin reload、mysqladmin refresh、mysqladmin flush-xxx、mysqladmin processlist などのコマンドを実行できます。.データベースへのアクセスに関する権限はありません。必要に応じて、追加の GRANT ステートメントを発行して、そのような権限を後から追加することができます。

  • 4番目には、dummy というユーザ名でパスワードなしのアカウントがあります。このアカウントは、ローカル ホストから接続するときにだけ使用できます。権限は一切ありません。GRANT ステートメントで USAGE 権限を使用すると、全く権限のないアカウントを作成できます。これには、すべてのグローバル権限を 'N' でセッティングする効果があります。(ここでは、このアカウントには後から特定の権限を付与するものとしています。)

GRANT の択一的な方法として、INSERT ステートメントを発行して、FLUSH PRIVILEGES でサーバに権限テーブルをリロードさせるという方法で、直接に、前述と同じ内容のアカウントを作成することができます。

shell> mysql --user=root mysql
mysql> INSERT INTO user
    ->     VALUES('localhost','monty',PASSWORD('some_pass'),
    ->     'Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y');
mysql> INSERT INTO user
    ->     VALUES('%','monty',PASSWORD('some_pass'),
    ->     'Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y');
mysql> INSERT INTO user SET Host='localhost',User='admin',
    ->     Reload_priv='Y', Process_priv='Y';
mysql> INSERT INTO user (Host,User,Password)
    ->     VALUES('localhost','dummy','');
mysql> FLUSH PRIVILEGES;

INSERT でアカウントを作成するときに、FLUSH PRIVILEGES を使用する理由には、その権限テーブルの再読み込みをサーバに行なわせるという目的があります。これをしないと、サーバを再起動するまで、変更内容が反映しません。GRANT でアカウントを作成するときは、FLUSH PRIVILEGES は不要です。

INSERT を伴う PASSWORD() 関数を使用する理由には、パスワードの暗号化という目的があります。GRANT ステートメントはパスワードの暗号化を自動的に行なうため、PASSWORD() は不要になります。

'Y' はアカウントに対する権限を有効にします。MySQL のバージョンによっては、INSERT ステートメントの最初の 2 つのエントリで、'Y' の数が異なる場合があります。admin アカウントでは、SET を使用した読み込みやすい拡張 INSERT シンタックスを採用する場合もあります。

dummy アカウントの INSERT ステートメントには、user テーブルのエントリの Host、User、Password のコラムだけに対して、値を割り当てています。どの権限も具体的にはセットしていません。そのため、MySQL がデフォルト値として、'N' を割り当てています。これは、GRANT USAGE で行なうこと同じものです。

ノート: スーパーユーザのアカウントをセットアップするには、'Y' にセットした権限コラムで、user テーブル エントリを作成します。user テーブルの権限はグローバルであるため、別の権限テーブル エントリは不要です。

次の例示は、3 つのアカウントと作成し、それに特定のデータベースにアクセスできるようにします。それぞれに、custom というユーザ名と、obscure というパスワードがあります。

GRANT でこれらのアカウントを作成するには、次にステートメントを使用します。

shell> mysql --user=root mysql
mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP
    ->     ON bankaccount.*
    ->     TO 'custom'@'localhost'
    ->     IDENTIFIED BY 'obscure';
mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP
    ->     ON expenses.*
    ->     TO 'custom'@'whitehouse.gov'
    ->     IDENTIFIED BY 'obscure';
mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP
    ->     ON customer.*
    ->     TO 'custom'@'server.domain'
    ->     IDENTIFIED BY 'obscure';

この 3 つのアカウントを次のように使用します。

  • 最初のアカウントは、ローカル ホストからのみ、bankaccount データベースにアクセスできます。

  • 2 番目のアカウントは、whitehouse.gov というホストからのみ、expenses データベースにアクセスできます。

  • 3 番目のアカウントは、server.domain というホストからのみ、customer データベースにアクセスできます。

GRANT を使用しないで、custom アカウントをセットアップするには、 INSERT ステートメントを次のように使用して、権限テーブルを直接変更します。

shell> mysql --user=root mysql
mysql> INSERT INTO user (Host,User,Password)
    ->     VALUES('localhost','custom',PASSWORD('obscure'));
mysql> INSERT INTO user (Host,User,Password)
    ->     VALUES('whitehouse.gov','custom',PASSWORD('obscure'));
mysql> INSERT INTO user (Host,User,Password)
    ->     VALUES('server.domain','custom',PASSWORD('obscure'));
mysql> INSERT INTO db
    ->     (Host,Db,User,Select_priv,Insert_priv,
    ->     Update_priv,Delete_priv,Create_priv,Drop_priv)
    ->     VALUES('localhost','bankaccount','custom',
    ->     'Y','Y','Y','Y','Y','Y');
mysql> INSERT INTO db
    ->     (Host,Db,User,Select_priv,Insert_priv,
    ->     Update_priv,Delete_priv,Create_priv,Drop_priv)
    ->     VALUES('whitehouse.gov','expenses','custom',
    ->     'Y','Y','Y','Y','Y','Y');
mysql> INSERT INTO db
    ->     (Host,Db,User,Select_priv,Insert_priv,
    ->     Update_priv,Delete_priv,Create_priv,Drop_priv)
    ->     VALUES('server.domain','customer','custom',
    ->     'Y','Y','Y','Y','Y','Y');
mysql> FLUSH PRIVILEGES;

最初から 3 つ目までの INSERT ステートメントは、user テーブル エントリを追加します。このエントリは、custom というユーザが、様々なホストから指定のパスワードで接続できますが、グローバル権限の記述はありません。(すべての権限はデフォルトの 'N' でセットになります。) 次の INSERT ステートメントの 3 つは、db テーブル エントリを追加します。このエントリは、custom に権限を与え、適切なホストからだけ bankaccount、expenses そして customer というデータベースのデータベースにアクセスできます。ここでも、権限テーブルを直接変更するときは、変更内容を反映させるために、FLUSH PRIVILEGES でサーバにリロードするよう指示してください。

特定のユーザで、mydomain.com など特定のドメインにすべてのマシンからアクセスできるようにする場合は、GRANT ステートメントを使用します。このステートメントは、アカウント名のホストの部分で ‘%’ ワイルドカード文字を使用します。

mysql> GRANT ...
    ->     ON *.*
    ->     TO 'myname'@'%.mydomain.com'
    ->     IDENTIFIED BY 'mypass';

直接、権限テーブルを変更して、同じことを行なうには、次のようにします。

mysql> INSERT INTO user (Host,User,Password,...)
    ->     VALUES('%.mydomain.com','myname',PASSWORD('mypass'),...);
mysql> FLUSH PRIVILEGES;
Copyright c 1997, 2010, Oracle and/or its affiliates. All rights reserved. Legal Notices
Top / Previous / Next / Up / Table of Contents
© 2010, Oracle Corporation and/or its affiliates

無料CGI PHPスクリプト | 新着情報スクリプト | 営業日カレンダー | PHPマニュアル | MySQLマニュアル | PEARマニュアル

Copyright (c) 2010 jmcodex.com All rights reserved.