MySQL アカウントは、次の 2 つの方法で作成できます。
アカウントを作成するためのステートメント (
CREATE USER
やGRANT
など) を使用する。これらのステートメントを発行すると、サーバーによって付与テーブルへの適切な変更が行われます。INSERT
、UPDATE
、DELETE
などのステートメントを使用して、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_TABLES
、STRICT_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 reload、mysqladmin refresh、mysqladmin 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
テーブル行内の
Host
、User
、および
Password
カラムにのみ、値が割り当てられます。権限カラムは明示的に設定されないため、MySQL
によってすべてのカラムに、デフォルト値の
'N'
が割り当てられます。これは、CREATE
USER
の動作と同等です。
厳密な SQL
モードが有効になっている場合は、デフォルト値を持たないすべてのカラムに値を指定する必要があります。この場合、INSERT
ステートメントは、明示的に
ssl_cipher
、x509_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
ステートメントは、bankaccount
、expenses
、および
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;