MySQL サーバーは、plugin
カラムで名前が指定された認証プラグインを使用して、mysql.user
テーブルに一覧表示されたアカウントごとに接続の試行を認証します。plugin
カラムが空である場合、サーバーは次のように認証を実行します。
MySQL 5.7.2 よりも前では、
Password
カラム内のパスワードハッシュ形式に応じて、サーバーは暗黙的にmysql_native_password
またはmysql_old_password
プラグインを使用します。Password
値が空または 4.1 のパスワードハッシュ (41 文字) である場合、サーバーはmysql_native_password
を使用します。パスワード値が 4.1 より前のパスワードハッシュ (16 文字) の場合、サーバーはmysql_old_password
を使用します。(これらのハッシュ形式に関する追加情報については、セクション6.1.2.4「MySQL でのパスワードハッシュ」を参照してください。)MySQL 5.7.2 の時点では、
plugin
カラムを空以外にする必要があり、サーバーは空のplugin
値を持つアカウントを無効にします。5.7.5 の時点では、mysql_old_password
のサポートが削除されています。
4.1 よりも前のパスワードハッシュおよび
mysql_old_password
プラグインは、MySQL
5.6.5 の時点で非推奨となり、4.1
のパスワードハッシュ化および
mysql_native_password
プラグインによって提供されるよりも低いセキュリティーレベルを提供します。plugin
カラムを空以外にする必要のある MySQL 5.7.2
の要件と、5.7.5 で mysql_old_password
のサポートが削除されたことを合わせて考えると、DBA
は次のようにアカウントをアップグレードすることをお勧めします。
mysql_native_password
を明示的に使用するために、それを暗黙的に使用しているアカウントをアップグレードします。mysql_native_password
を明示的に使用するために、(暗黙的または明示的に)mysql_old_password
を使用しているアカウントをアップグレードします。
このセクションの手順では、これらのアップグレードを実行する方法について説明します。その結果、アカウントは空の
plugin
値を持たず、4.1
よりも前のパスワードハッシュ化または
mysql_old_password
プラグインを使用しません。
これらの手順のバリエーションとして、DBA
は、SHA-256
パスワードハッシュを使用して認証する
sha256_password
プラグインにアップグレードするという選択肢をユーザーに提示することがあります。このプラグインについては、セクション6.3.8.4「SHA-256 認証プラグイン」を参照してください。
次の表には、この説明で検討される
mysql.user
アカウントのタイプを一覧表示します。
plugin カラム |
Password カラム |
認証結果 | アップグレードアクション |
---|---|---|---|
空 | 空 | 暗黙的に mysql_native_password を使用する |
プラグインの割り当て |
空 | 4.1 のハッシュ | 暗黙的に mysql_native_password を使用する |
プラグインの割り当て |
空 | 4.1 よりも前のハッシュ | 暗黙的に mysql_old_password を使用する |
プラグインを割り当て、パスワードを再ハッシュ化する |
mysql_native_password |
空 | 明示的に mysql_native_password を使用する |
なし |
mysql_native_password |
4.1 のハッシュ | 明示的に mysql_native_password を使用する |
なし |
mysql_old_password |
空 | 明示的に mysql_old_password を使用する |
プラグインのアップグレード |
mysql_old_password |
4.1 よりも前のハッシュ | 明示的に mysql_old_password を使用する |
プラグインをアップグレードし、パスワードを再ハッシュ化する |
mysql_native_password
プラグインの行に対応するアカウントでは、(プラグインやハッシュ形式を変更する必要がないため)
アップグレードアクションは必要ありません。パスワードが空の行に対応するアカウントでは、DBA
は、パスワードを選択するようにアカウントの所有者に要求することを検討するべきです
(または、ALTER USER
を使用して空のアカウントパスワードを期限切れにすることで、それを要求するべきです)。
mysql_native_password の暗黙的な使用から明示的な使用へのアップグレード
空のプラグインと 4.1
のパスワードハッシュを持つアカウントは、暗黙的に
mysql_native_password
を使用します。mysql_native_password
を明示的に使用するようにアカウントをアップグレードするには、DBA
は次のステートメントを実行するようにしてください。
UPDATE mysql.user SET plugin = 'mysql_native_password'
WHERE plugin = '' AND (Password = '' OR LENGTH(Password) = 41);
FLUSH PRIVILEGES;
MySQL 5.7.2 以降では、DBA は、そのアップグレードアクション間で同じ処理を行う mysql_upgrade を実行できます。5.7.2 よりも前では、DBA はこれらのステートメントを実行して、アカウントをプロアクティブにアップグレードできます。
注:
この手順は、すでに暗黙的に使用しているアカウントに対してのみ、
mysql_native_password
プラグインを明示的にするため、いつ実行しても安全です。この手順ではパスワードを変更する必要がないため、DBA はユーザーに影響を与えたり、アップグレードプロセスに関与するようにユーザーに要求したりせずに、このアクションを実行できます。
mysql_old_password から mysql_native_password へのアカウントのアップグレード
mysql_native_password
を明示的に使用するには、(暗黙的または明示的に)
mysql_old_password
を使用しているアカウントをアップグレードするようにしてください。これを行うには、プラグインを変更かつ4.1
よりも前から 4.1
のハッシュ形式にパスワードを変更する必要があります。
この手順で説明したアカウントをアップグレードする必要がある場合は、次の条件のいずれかに当てはまります。
plugin
カラムが空であり、パスワードハッシュ形式が 4.1 よりも前 (16 文字) であるため、アカウントは暗黙的にmysql_old_password
を使用します。アカウントは明示的に
mysql_old_password
を使用します。
このようなアカウント識別するには、次のクエリーを使用します。
SELECT User, Host, Password FROM mysql.user
WHERE (plugin = '' AND LENGTH(Password) = 16)
OR plugin = 'mysql_old_password';
次の説明では、そのアカウントセットを更新するための 2 つの方法を示します。これらは異なる特性を持っているため、DBA は両方とも読み、特定の MySQL インストールに最適な方を決定するようにしてください。
方法 1.
この方法の特性:
すべてのユーザーが
mysql_native_password
にアップグレードされるまで、secure_auth=0
を指定してサーバーおよびクライアントを実行する必要があります。(それ以外の場合、ユーザーは新しい形式のハッシュにアップグレードするために、古い形式のパスワードハッシュを使用してサーバーに接続できません。)MySQL 5.5 から 5.7.1 まででは、動作します。5.7.2 の時点では、サーバーは空でないプラグインを持つようにアカウントに要求し、そうでない場合はそれらのアカウントを無効にするため、動作しません。したがって、5.7.2 以降にアップグレードした場合は、方法 2 を選択してください。
DBA は、サーバーが
secure_auth=0
を指定して実行されていることを確認するようにしてください。
明示的に mysql_old_password
を使用するすべてのアカウントでは、DBA
は空のプラグインに設定するようにしてください。
UPDATE mysql.user SET plugin = ''
WHERE plugin = 'mysql_old_password';
FLUSH PRIVILEGES;
また、影響を受けるアカウントのパスワードを期限切れにするには、次のステートメントを使用します。
UPDATE mysql.user SET plugin = '', password_expired = 'Y'
WHERE plugin = 'mysql_old_password';
FLUSH PRIVILEGES;
この時点で、影響を受けるユーザーはサーバーに接続し、4.1 のハッシュ化が使用されるようにパスワードをリセットできます。DBA は空のプラグインを現在持っている各ユーザーに、接続して次のステートメントを実行するように要求するようにしてください。
SET old_passwords = 0;
SET PASSWORD = PASSWORD('user-chosen-password');
MySQL 5.6.5 以降では、クライアント側の
--secure-auth
がデフォルトで有効になっているため、DBA
はこれを無効にするようにユーザーに思い出させるようにしてください。そうしなければ、ユーザーは接続できなくなります。
shell> mysql -u user_name -p --secure-auth=0
影響を受けるユーザーがこれらのステートメントを実行したあとに、DBA
は対応するアカウントプラグインを
mysql_native_password
に設定すると、プラグインを明示的にすることができます。また、DBA
は次のステートメントを定期的に実行すると、影響を受けるユーザーが自分のパスワードをリセットした任意のアカウントを検索および修正できます。
UPDATE mysql.user SET plugin = 'mysql_native_password'
WHERE plugin = '' AND (Password = '' OR LENGTH(Password) = 41);
FLUSH PRIVILEGES;
空のプラグインを持つアカウントがなくなると、このクエリーは空の結果を返します。
SELECT User, Host, Password FROM mysql.user
WHERE (plugin = '' AND LENGTH(Password) = 16);
この時点で、すべてのアカウントは 4.1
よりも前のパスワードハッシュ化から移行され、secure_auth=0
を指定してサーバーを実行する必要がなくなります。
方法 2.
この方法の特性:
DBA は、影響を受ける各アカウントに新しいパスワードを割り当てます。そのため、DBA はこのような各ユーザーに新しいパスワードを通知し、新しいパスワードを選択するようにユーザーに要求する必要があります。DBA からユーザーへのパスワードの通知は、MySQL のスコープ外です。DBA はパスワードを慎重に通知するようにしてください。
secure_auth=0
を指定してサーバーまたはクライアントを実行する必要はありません。MySQL 5.5 以降のどのバージョンでも動作します。
この方法では、パスワードを個別に設定する必要があるため、DBA は各アカウントを別々に更新します。DBA は、アカウントごとに別々のパスワードを選択するようにしてください。
'user1'@'localhost'
がアップグレードされるアカウントの 1
つであると仮定します。DBA
は、次のように変更するようにしてください。
SET old_passwords = 0;
UPDATE mysql.user SET plugin = 'mysql_native_password',
Password = PASSWORD('DBA-chosen-password')
WHERE (User, Host) = ('user1', 'localhost');
FLUSH PRIVILEGES;
また、パスワードを期限切れにするには、代わりに次のステートメントを使用します。
SET old_passwords = 0;
UPDATE mysql.user SET plugin = 'mysql_native_password',
Password = PASSWORD('DBA-chosen-password'), password_expired = 'Y'
WHERE (User, Host) = ('user1', 'localhost');
FLUSH PRIVILEGES;
次に DBA は、ユーザーに新しいパスワードを通知して、そのパスワードを使用してサーバーに接続し、新しいパスワードを選択するために次のステートメントを実行するようにユーザーに要求するようにしてください。
SET old_passwords = 0;
SET PASSWORD = PASSWORD('user-chosen-password');
アップグレードするアカウントごとに繰り返します。