CREATE USER user_specification [, user_specification] ...
user_specification:
user
[
| IDENTIFIED WITH auth_plugin [AS 'auth_string']
IDENTIFIED BY [PASSWORD] 'password'
]
CREATE USER
ステートメントは、新しい MySQL アカウントを作成します。すでに存在するアカウントに対しては、エラーが発生します。このステートメントを使用するには、mysql
データベースに対するグローバルな CREATE USER
権限または INSERT
権限が必要です。各アカウントについて、CREATE USER
は、権限のない新しい行を mysql.user
テーブル内に作成し、そのアカウントに認証プラグインを割り当てます。使用されている構文に応じて、CREATE USER
はそのアカウントにパスワードも割り当てる可能性があります。
各 user_specification
句は、アカウント名と、そのアカウントを使用するクライアントの認証方法に関する情報で構成されます。CREATE USER
構文のこの部分は GRANT
と共有されるため、ここでの説明は GRANT
にも適用されます。
各アカウント名には、セクション6.2.3「アカウント名の指定」で説明されている形式が使用されます。例:
CREATE USER 'jeffrey'@'localhost' IDENTIFIED BY 'mypass';
アカウント名のユーザー名の部分のみを指定した場合は、'%'
のホスト名の部分が使用されます。
サーバーは、ユーザー指定句にプラグインを指定するための IDENTIFIED WITH
またはパスワードを指定するための IDENTIFIED BY
が含まれているかどうかに応じて、各アカウントに認証プラグインとパスワードを次のように割り当てます。
IDENTIFIED WITH
を指定すると、サーバーは指定されたプラグインを割り当てますが、そのアカウントにパスワードはありません。IDENTIFIED BY
を指定すると、サーバーはプラグインを暗黙的に割り当て、さらに指定されたパスワードを割り当てます。IDENTIFIED WITH
とIDENTIFIED BY
のどちらも指定しない場合、サーバーはプラグインを暗黙的に割り当てますが、そのアカウントにパスワードはありません。
アカウントにパスワードがない場合は、そのアカウントの mysql.user
テーブル行内の Password
カラムが空のままになります。これはセキュアではありません。パスワードを設定するには、SET PASSWORD
を使用します。セクション13.7.1.7「SET PASSWORD 構文」を参照してください。
認証プラグインの暗黙的な割り当てでは、サーバーは次のルールを使用します。
MySQL 5.6.6 の時点では、サーバーはそのアカウントにデフォルトのプラグインを割り当てます。このプラグインが、そのアカウントの
mysql.user
テーブル行内のplugin
カラムの値になります。デフォルトのプラグインは、サーバーの起動時に--default-authentication-plugin
オプションがほかの値に設定されないかぎり、mysql_native_password
です。MySQL 5.6.6 より前は、サーバーはそのアカウントにプラグインを割り当てません。そのアカウントの
mysql.user
テーブル行内のplugin
カラムが空のままになります。
特定のアカウントを使用するクライアント接続の場合は、サーバーがそのアカウントに割り当てられた認証プラグインを呼び出すと、クライアントは、そのプラグインが実装している認証方法によって要求される資格証明を指定する必要があります。サーバーが (アカウントの作成時または接続時に) そのプラグインを見つけることができない場合は、エラーが発生します。
アカウントの mysql.user
テーブル行に空以外の plugin
カラムが含まれている場合:
サーバーは、指定されたプラグインを使用してクライアントの接続試行を認証します。
SET PASSWORD
をPASSWORD()
とともに使用したアカウントのパスワードへの変更は、PASSWORD()
で適切なパスワードハッシュ方式が使用されるように、old_passwords
システム変数が認証プラグインに必要な値に設定された状態で実行する必要があります。プラグインがmysql_old_password
である場合は、SET PASSWORD
を、old_passwords
の値には関係なく 4.1 より前のパスワードハッシュを使用するOLD_PASSWORD()
とともに使用してパスワードを変更することもできます。
アカウントの mysql.user
テーブル行に空の plugin
カラムが含まれている場合:
サーバーは、
Password
カラムに格納されているパスワードのハッシュ形式に応じて、mysql_native_password
またはmysql_old_password
認証プラグインを使用してクライアントの接続試行を認証します。SET PASSWORD
を使用したアカウントのパスワードへの変更は、old_passwords
が 4.1 または 4.1 より前のパスワードハッシュを示す、それぞれ 0 または 1 に設定された状態でPASSWORD()
とともに、あるいはold_passwords
の値には関係なく 4.1 より前のパスワードハッシュを使用するOLD_PASSWORD()
とともに実行できます。
CREATE USER
の例:
-
アカウントの認証プラグインを指定するには、
IDENTIFIED WITH
を使用します。プラグイン名は、引用符で囲まれた文字列リテラルまたは引用符で囲まれていない名前にすることができます。auth_plugin
'
は、プラグインに渡すオプションの引用符で囲まれた文字列リテラルです。その文字列の意味はプラグインによって解釈されるため、その形式はプラグイン固有です。特定のプラグインが受け入れる認証文字列の値 (存在する場合) については、そのプラグインのドキュメントを参照してください。auth_string
'CREATE USER 'jeffrey'@'localhost' IDENTIFIED WITH mysql_native_password;
サーバーは、そのアカウントに指定された認証プラグインを割り当てますが、パスワードは割り当てません。クライアントは、接続時にパスワードを指定する必要がありません。ただし、パスワードのないアカウントはセキュアではありません。アカウントが確実に特定の認証プラグインを使用し、かつ対応するハッシュ形式を持つパスワードが設定されるようにするには、
IDENTIFIED WITH
でプラグインを明示的に指定したあと、SET PASSWORD
を使用してパスワードを設定します。CREATE USER 'jeffrey'@'localhost' IDENTIFIED WITH mysql_native_password; SET old_passwords = 0; SET PASSWORD FOR 'jeffrey'@'localhost' = PASSWORD('mypass');
SET PASSWORD
をPASSWORD()
とともに使用したアカウントのパスワードへの変更は、PASSWORD()
で適切なパスワードハッシュ方式が使用されるように、old_passwords
システム変数がアカウントの認証プラグインに必要な値に設定された状態で実行する必要があります。そのため、代わりにsha256_password
またはmysql_old_password
プラグインを使用するには、CREATE USER
ステートメントでそのプラグインを指定し、SET PASSWORD
を使用する前にold_passwords
をそれぞれ 2 または 1 に設定します。(mysql_old_password
の使用はお勧めできません。これは非推奨であり、そのサポートは将来の MySQL リリースで削除される予定です。) -
アカウントの作成時にアカウントのパスワードを指定するには、
IDENTIFIED BY
をプレーンテキストのパスワードのリテラル値とともに使用します。CREATE USER 'jeffrey'@'localhost' IDENTIFIED BY 'mypass';
サーバーは、前に説明したようにそのアカウントに認証プラグインを暗黙的に割り当て、さらに特定のパスワードを割り当てます。クライアントは、接続時に特定のパスワードを指定する必要があります。
暗黙的に割り当てられたプラグインが
mysql_native_password
である場合は、old_passwords
システム変数が 0 に設定されている必要があります。そうでない場合、CREATE USER
はそのプラグインに必要な形式でパスワードをハッシュしないため、エラーが発生します。mysql> SET old_passwords = 1; mysql> CREATE USER 'jeffrey'@'localhost' IDENTIFIED BY 'mypass'; ERROR 1827 (HY000): The password hash doesn't have the expected format. Check if the correct password algorithm is being used with the PASSWORD() function. mysql> SET old_passwords = 0; mysql> CREATE USER 'jeffrey'@'localhost' IDENTIFIED BY 'mypass'; Query OK, 0 rows affected (0.00 sec)
-
パスワードのハッシュ値 (パスワードに対して
PASSWORD()
が返す値) がわかっている場合にプレーンテキストのパスワードを指定しないようにするには、そのハッシュ値の前にキーワードPASSWORD
を指定します。CREATE USER 'jeffrey'@'localhost' IDENTIFIED BY PASSWORD '*90E462C37378CED12064BB3388827D2BA3A9B689';
サーバーは、前に説明したようにそのアカウントに認証プラグインを暗黙的に割り当て、さらに特定のパスワードを割り当てます。このパスワードハッシュは、割り当てられたプラグインに必要な形式である必要があります。クライアントは、接続時にそのパスワードを指定する必要があります。
-
ユーザーがパスワードなしで接続できるようにするには、
IDENTIFIED BY
句を含めないようにします。CREATE USER 'jeffrey'@'localhost';
サーバーは、前に説明したようにそのアカウントに認証プラグインを暗黙的に割り当てますが、パスワードは割り当てません。クライアントは、接続時にパスワードを指定する必要がありません。ただし、パスワードのないアカウントはセキュアではありません。これを回避するには、
SET PASSWORD
を使用してアカウントのパスワードを設定します。
先に説明したように、プラグインの暗黙的な割り当ては、デフォルトの認証プラグインによって異なります。--default-authentication-plugin
の許可される値は mysql_native_plugin
と sha256_password
であり、mysql_old_password
は許可されません。つまり、CREATE USER ... IDENTIFIED BY
構文で mysql_old_password
を使用するアカウントを作成できるように、デフォルトのプラグインを設定することはできません。mysql_old_password
を使用するアカウントを作成するには、CREATE USER ... IDENTIFIED WITH
を使用してプラグインを明示的に指定したあと、そのパスワードを設定します。
CREATE USER 'jeffrey'@'localhost' IDENTIFIED WITH mysql_old_password;
SET old_passwords = 1;
SET PASSWORD FOR 'jeffrey'@'localhost' = PASSWORD('mypass');
ただし、mysql_old_password
は非推奨であるため、前の手順はお勧めできません。
パスワードと認証プラグインの設定の詳細は、セクション6.3.5「アカウントパスワードの割り当て」およびセクション6.3.7「プラガブル認証」を参照してください。
状況によっては、CREATE USER
がサーバーログ、またはクライアント側にある ~/.mysql_history
などの履歴ファイル内に記録されることがあります。つまり、平文のパスワードが、その情報に対する読み取りアクセス権を持つ任意のユーザーによって読み取られる可能性があります。これがサーバーログで発生する条件およびこれを制御する方法については、セクション6.1.2.3「パスワードおよびロギング」を参照してください。クライアント側のロギングに関する同様の情報については、セクション4.5.1.3「mysql のロギング」を参照してください。
MySQL の一部のリリースでは、新たな権限や機能を追加するために付与テーブルの構造に変更を加えているものもあります。すべての新しい機能を確実に活用できるようにするには、新しいバージョンの MySQL に更新するときに常に付与テーブルを更新して、最新の構造を持つようにします。セクション4.4.7「mysql_upgrade — MySQL テーブルのチェックとアップグレード」を参照してください。