Documentation Home
MySQL 5.6 リファレンスマニュアル
Download this Manual
PDF (US Ltr) - 27.1Mb
PDF (A4) - 27.1Mb
EPUB - 7.5Mb
HTML Download (TGZ) - 7.2Mb
HTML Download (Zip) - 7.2Mb


6.3.2 ユーザーアカウントの追加

MySQL アカウントは、次の 2 つの方法で作成できます。

  • アカウントを作成するためのステートメント (CREATE USERGRANT など) を使用する。これらのステートメントを発行すると、サーバーによって付与テーブルへの適切な変更が行われます。

  • INSERTUPDATEDELETE などのステートメントを使用して、MySQL 付与テーブルを直接操作する。

アカウント作成のステートメントを使用する方が、付与テーブルを直接操作するよりも簡潔で、エラーの発生率も低いため、推奨される方法です。CREATE USER および GRANT については、セクション13.7.1「アカウント管理ステートメント」で説明されています。

アカウントを作成するためのもう 1 つのオプションは、GUI ツール MySQL Workbench を使用する方法です。または、MySQL アカウント管理の機能を提供する使用可能な複数のサードパーティープログラムのいずれかを使用します。phpMyAdmin は、このようなプログラムの 1 つです。

次の例では、mysql クライアントプログラムを使用して、新しいアカウントを設定する方法を示します。これらの例は、セクション2.10.2「最初の MySQL アカウントのセキュリティー設定」で説明するデフォルトに従って、権限が設定されていることが前提となっています。つまり、変更を行うには、MySQL root ユーザーとして MySQL サーバーに接続する必要があり、root アカウントは mysql データベースに対する INSERT 権限および RELOAD 管理権限を持っている必要があります。

該当する例で注記したように、特定の制約が有効になるようにサーバーの SQL モードが設定されている場合は、一部のステートメントに失敗します。特に、厳密モード (STRICT_TRANS_TABLESSTRICT_ALL_TABLES、および NO_AUTO_CREATE_USER) では、サーバーが一部のステートメントを受け入れることが回避されます。このような場合のために、回避策を示します。SQL モードおよびそれによる付与テーブルの操作への影響についての詳細は、セクション5.1.7「サーバー SQL モード」およびセクション13.7.1.4「GRANT 構文」を参照してください。

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

shell> mysql --user=root mysql

root アカウントにパスワードを割り当てた場合は、この mysql コマンドと、このセクションで後述するコマンドの両方に、--password または -p オプションを指定する必要もあります。

root としてサーバーに接続したあとは、新しいアカウントを追加できます。次のステートメントは、GRANT を使用して 4 つの新しいアカウントを設定します。

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

これらのステートメントで作成されたアカウントには、次のプロパティーがあります。

  • アカウントのうち 2 つは、ユーザー名が monty、パスワードが some_pass です。どちらのアカウントも、すべてを実行するための完全な権限を持っているスーパーユーザーアカウントです。'monty'@'localhost' アカウントは、ローカルホストから接続する際にのみ使用できます。'monty'@'%' アカウントでは、ホスト部分に '%' ワイルドカードが使用されているため、これを使用すれば任意のホストから接続できます。

    monty として任意の場所から接続できるようにするには、monty に両方のアカウントが必要です。localhost アカウントがない場合は、monty がローカルホストから接続する際に、mysql_install_db で作成された localhost の匿名ユーザーアカウントが優先されます。その結果、monty は匿名ユーザーとして処理されます。その理由は、匿名ユーザーアカウントが 'monty'@'%' アカウントよりも固有の Host カラム値を持っているため、user テーブルのソート順でより早く表示されるためです。(user テーブルのソートについては、セクション6.2.4「アクセス制御、ステージ 1: 接続の検証」で説明されています。)

  • 'admin'@'localhost' アカウントにはパスワードがありません。このアカウントは、admin がローカルホストから接続する際にのみ使用できます。これには、RELOAD および PROCESS の管理者権限が付与されます。これらの権限を持つ admin ユーザーは、mysqladmin reloadmysqladmin refreshmysqladmin flush-xxx コマンド、および mysqladmin processlist を実行できます。任意のデータベースにアクセスするための権限は付与されません。その他の GRANT ステートメントを発行すれば、あとでこのような権限を追加できることがあります。

  • 'dummy'@'localhost' アカウントにはパスワードがありません。このアカウントは、ローカルホストから接続する際にのみ使用できます。権限は付与されません。あとでアカウントに特定の権限を付与することを前提としています。

NO_AUTO_CREATE_USER SQL モードが有効になっている場合は、パスワードなしでアカウントを作成するステートメントに失敗します。これに対処するには、空でないパスワードを指定する IDENTIFIED BY 句を使用します。

アカウントに対する権限をチェックするには、SHOW GRANTS を使用します。

mysql> SHOW GRANTS FOR 'admin'@'localhost';
+-----------------------------------------------------+
| Grants for admin@localhost                          |
+-----------------------------------------------------+
| GRANT RELOAD, PROCESS ON *.* TO 'admin'@'localhost' |
+-----------------------------------------------------+

CREATE USER および 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',
    ->     'Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y',
    ->     '','','','',0,0,0,0);
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 を使用して、付与テーブルを再ロードするようにサーバーに指示する必要があります。そうしなければ、サーバーを再起動するまで変更が認識されません。CREATE USER では、FLUSH PRIVILEGES が必要ありません。

INSERT PASSWORD() 関数を使用する理由は、パスワードを暗号化するためです。CREATE USER ステートメントでは自動的にパスワードが暗号化されるため、PASSWORD() は必要ありません。

'Y' 値を指定すると、アカウントに対する権限が有効になります。MySQL のバージョンによっては、最初の 2 つの INSERT ステートメントに異なる数の 'Y' 値を使用する必要がある場合もあります。admin アカウントに対する INSERT ステートメントでは、SET を使用することで、さらに読み取り可能になるように拡張された INSERT 構文が採用されています。

dummy アカウントに対する INSERT ステートメントでは、user テーブル行内の HostUser、および Password カラムにのみ、値が割り当てられます。権限カラムは明示的に設定されないため、MySQL によってすべてのカラムに、デフォルト値の 'N' が割り当てられます。これは、CREATE USER の動作と同等です。

厳密な SQL モードが有効になっている場合は、デフォルト値を持たないすべてのカラムに値を指定する必要があります。この場合、INSERT ステートメントは、明示的に ssl_cipherx509_issuer、および x509_subject カラムに値を指定する必要があります。

スーパーユーザーアカウントを設定するために必要な操作は、すべての権限カラムが 'Y' に設定された user テーブル行を挿入することだけです。user テーブルの権限はグローバルであるため、その他の付与テーブルのいずれにもエントリは必要ありません。

次の例では、3 つのアカウントを作成し、それらに特定のデータベースへのアクセス権を付与します。それぞれのユーザー名は custom で、パスワードは obscure です。

CREATE USER および GRANT を使用してアカウントを作成するには、次のステートメントを使用します。

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

3 つのアカウントは、次のように使用できます。

  • 1 番目のアカウントは、bankaccount データベースにアクセスできますが、ローカルホストからに限定されます。

  • 2 番目のアカウントは、expenses データベースにアクセスできますが、host47.example.com ホストからに限定されます。

  • 3 番目のアカウントは、customer データベースにアクセスできますが、server.domain ホストからに限定されます。

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('host47.example.com','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('host47.example.com','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 ステートメントは、付与されたパスワードを使用してさまざまなホストから接続することをユーザー custom に許可する user テーブルエントリを追加しますが、グローバルな権限は付与しません (すべての権限はデフォルト値の 'N' に設定されます)。次の 3 つの INSERT ステートメントは、bankaccountexpenses、および customer データベースに対する権限を custom に付与するが、適切なホストからのアクセス時に限定される db テーブルエントリを追加します。通常どおりに付与テーブルを直接変更する場合は、権限の変更が有効になるように、FLUSH PRIVILEGES を使用して再ロードするようにサーバーに指示する必要があります。

特定のドメイン (mydomain.com など) 内のすべてのマシンからのアクセス権を持つユーザーを作成する際には、アカウント名のホスト部分に % ワイルドカード文字を使用できます。

mysql> CREATE USER 'myname'@'%.mydomain.com' IDENTIFIED BY 'mypass';

付与テーブルを直接変更することで同じ処理を行うには、次のように実行します。

mysql> INSERT INTO user (Host,User,Password,...)
    ->     VALUES('%.mydomain.com','myname',PASSWORD('mypass'),...);
mysql> FLUSH PRIVILEGES;

User Comments
Sign Up Login You must be logged in to post a comment.