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;