web-dev-qa-db-ja.com

mysql_native_passwordとは何ですか?

rootのパスワードを設定しようとしました。私が実行すると:

mysql> SELECT * from mysql.user where User="root";

それが示している:

+-----------+------+-------------+-------------+-------------+-------------+-------------+-----------+-------------+---------------+--------------+-----------+------------+-----------------+------------+------------+--------------+------------+-----------------------+------------------+--------------+-----------------+------------------+------------------+----------------+---------------------+--------------------+------------------+------------+--------------+------------------------+----------+------------+-------------+--------------+---------------+-------------+-----------------+----------------------+-----------------------+-----------------------+------------------+-----------------------+-------------------+----------------+
| Host      | User | Select_priv | Insert_priv | Update_priv | Delete_priv | Create_priv | Drop_priv | Reload_priv | Shutdown_priv | Process_priv | File_priv | Grant_priv | References_priv | Index_priv | Alter_priv | Show_db_priv | Super_priv | Create_tmp_table_priv | Lock_tables_priv | Execute_priv | Repl_slave_priv | Repl_client_priv | Create_view_priv | Show_view_priv | Create_routine_priv | Alter_routine_priv | Create_user_priv | Event_priv | Trigger_priv | Create_tablespace_priv | ssl_type | ssl_cipher | x509_issuer | x509_subject | max_questions | max_updates | max_connections | max_user_connections | plugin                | authentication_string | password_expired | password_last_changed | password_lifetime | account_locked |
+-----------+------+-------------+-------------+-------------+-------------+-------------+-----------+-------------+---------------+--------------+-----------+------------+-----------------+------------+------------+--------------+------------+-----------------------+------------------+--------------+-----------------+------------------+------------------+----------------+---------------------+--------------------+------------------+------------+--------------+------------------------+----------+------------+-------------+--------------+---------------+-------------+-----------------+----------------------+-----------------------+-----------------------+------------------+-----------------------+-------------------+----------------+
| localhost | root | 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            | Y                      |          |            |             |              |             0 |           0 |               0 |                    0 | mysql_native_password |                       | N                | 2018-06-13 15:11:59   |              NULL | N              |
+-----------+------+-------------+-------------+-------------+-------------+-------------+-----------+-------------+---------------+--------------+-----------+------------+-----------------+------------+------------+--------------+------------+-----------------------+------------------+--------------+-----------------+------------------+------------------+----------------+---------------------+--------------------+------------------+------------+--------------+------------------------+----------+------------+-------------+--------------+---------------+-------------+-----------------+----------------------+-----------------------+-----------------------+------------------+-----------------------+-------------------+----------------+

これ Document は、

Mysql_native_passwordネイティブ認証プラグインは下位互換性があります。認証プラグインをサポートしない古いクライアントはネイティブ認証プロトコルを使用するため、プラグイン可能な認証をサポートするサーバーに接続できます。

しかし、技術的に私は多くを手に入れていません。 rootユーザーパスワードを使用して何かをする必要がありますか?

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '<password>';

そして

ALTER USER 'root'@'localhost' IDENTIFIED BY '<password>';

違いはありますか?

9
d a i s y

MySQLは長い間、さまざまな authentication plugins をサポートしてきました。これは、基本的にプログラム可能なコードの一部であり、mysqlアカウントが要求されているかどうかを示しています。

これを行う元の方法は、パスワードを設定し、特定の方法でハッシュして、mysql.userテーブルに格納することです。ただし、これは認証できる唯一の方法ではありません。次に例を示します。

  • UNIXソケット認証を使用すると、mysqlアカウントと同じUNIX名でローカルマシン上でログインを使用できます。これは、パスワードを維持する必要のない監視やその他のタスクなどの管理アカウントに一般的に使用されます。ソケット接続でのみ機能するため(リモートではなく)、その名前が付けられています
  • PAM認証プラグインを使用すると、たとえばLDAPベースのシステムをセットアップし、それを使用して認証することができます(既存の組織に統合すると便利です)。
  • Mysql(8.0)の最新バージョンは、それほど重要ではない認証方法(caching_sha2_password)、理論的にはより安全です(そうは言っていませんが、デフォルトの「ネイティブ」の方がかなり悪かったのは確かです)。ただし、クライアントドライバーとアプリケーションの更新が必要な場合があるため、いつでも元に戻すことができます互換性の理由から古いものに。

「エンタープライズ」の世界では、ユーザーとパスワード以外にも、非常に特殊な認証方法が特別に必要になることがよくあります。

基本的に、mysql_native_passwordは従来の認証方法であり、非常に安全ではありません(パスワードのハッシュのみを使用します)が、古いドライバーと互換性があります新しいmysqlサービスを開始する場合は、start(およびTLS)から新しいプラグインを使用することをお勧めします。 特別なニーズがある場合は、他の方法を使用できます-特定の特別なニーズがある場合はプログラムすることもできます)。

ユーザーごとに異なる方法を選択できます-たとえば、通常のアプリケーションはmysql_native_passwordまたは新しいsha2を使用できますが、管理者アカウントは2要素認証トークンを使用し、mysqlサーバーで統計情報を収集する監視ユーザーにはunix_socketを使用します。これらの他の認証方法は、ネイティブのものと同様に、mysql.userテーブルのパスワードフィールドを使用する場合と使用しない場合があります(パスワードを別の場所に保存するか、パスワードの概念さえない場合があります!)。

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '<password>';

そして

ALTER USER 'root'@'localhost' IDENTIFIED BY '<password>';

Mysql_native_passwordは基本的に同じで、通常はデフォルトの認証方法です。 WITHを使用すると、使用する方法を決定できます。たとえば、GRANT USAGE ON *.* TO root@localhost IDENTIFIED WITH socket_auth、UNIXソケット認証を使用するようにそのユーザーを設定しています。 MariaDBは少し異なる構文を使用します:VIA unix_socket。これらのコマンドを実行すると、主にmysql.userテーブルが更新されます。

ALTER/GRANTは次のユーザーログイン時に自動的に機能しますが、UPDATEingを直接実行すると、mysql.userテーブルにFLUSH PRIVILEGES、および特定のシナリオ(ガレラなど)でいくつかの問題があります。

15
jynus